一开始须要安装arm-elf-gcc,可是这是一个32位的程序,我是安装了64位的系统,听说安装ia32.libs依赖库能运行这个,可是看到博客上面前人安装完了系统图标少了一半,而后就怕了。通过了翻看ubuntu论坛和各类博客,才知道14版以后的ubuntu64位官方已经抛弃了ia32.libs这个依赖库,在源列表中也是找不到的。可是官方自身已经支持32位,自带32位依赖库,在根目录下面就有一个lib32文件夹。ubuntu
博主使用的是arm-elf-tools-20040427.sh的编译器,比较老旧,但不影响使用。编辑器
sudo chmod 755 arm-elf-tools-20040427.sh
sudo sh arm-elf-tools-20040427.sh
以上,安装完成函数
注:文件arm-elf-tools-20040427.sh的大小有17M,这个脚本就是安装文件。没事不要用普通的文本编辑器打开,高级点的文本编辑器能够。测试
首先上一份简单的测试代码3d
int max( int* pt, int size ) { int max_v = -32768; int* tmp = &pt[size]; int* pi = pt; while(pi<tmp){ if( *pi>max_v ){ max_v = *pi; } pi++; } return max_v; }
arm-elf-gcc -S max.c
获得由c文件生成的汇编文件max.s
code
arm-elf-gcc -c max.s
由汇编文件编译获得Object文件max.o
blog
arm-elf-readelf -a max.o > max_elfinfo
这个命令将给出所有的Object文件信息,保存在max_elfinfo这个文件中
教程
查看一下max_elfinfo文件:ELF_header
编译器
查看一下max_elfinfo文件:Section_header
博客
hexdump -C max.o > max_hex
直接打印出Object文件的所有字节,保存在max_hex文件中
以上面的.real.text为例子
arm-elf-ld.real -o max2.out max.o
用readelf命令分析新生成的max2.out
arm-elf-readelf -a max2.out > max2_elfinfo
调用不一样c文件中的子函数
程序修改后以下:
编译两份c文件生成 .o 文件
arm-elf-ld.real -o main2.out main.o encrypt_char.o -lc
main2.out是连接生成的文件,main.o encrypt_char.o是参与连接的源文件,-lc 容许连接器搜索默认的路径,当你使用了系统自带的头文件或子函数时,须要添加该选项以便连接器能顺利连接到对应库
arm-elf-objdump -S main2.out > main2_1.s
反汇编连接后的.out文件,和连接前的.o文件反汇编结果进行比较
新生成的main2_1.s文件里面比原来的多了不少内容,最大的不一样在于区分了各个文件的代码段