全部博文(56)
分类: C/C++
2011-12-29 10:32:27
编写源文件test.S,并编译
gcc使用说明
加-c选项表示只编译不链接,不加-c选项时表示既编译又链接
加-g选项表示编译时加上调试信息
用-o选项来指定输出文件名
对text.S只进行编译不链接时,可以看出各个段的vma和lma都为0
readelf工具(可用readelf -h来查看使用说明)
-a选项,读取全部信息
-h选项,读取文件头
用readelf工具来读取test.o,发现虽然对test.S只编译没有链接,生成文件的格式也是elf格式的,
只是不能运行,这种文件叫做可重定位文件(即链接时,段的位置由链接器重新指定)
将test.o链接成可执行文件,链接脚本如下,根据ld的规则,如果不用at指令定义lam的话,那么lma默认等于vma
链接器的作用就是
ld可用-T选项来设定使用的链接脚本
-o选项来设定输出文件名
对test.o进行链接
objdump工具
-h选项可以查看elf文件的段信息
-f选项可以查看elf文件的头信息
-d选项可以将elf文件反汇编成汇编代码来查看如(对于c和c++文件可用-S -d参数,它可使objdump在反汇编时
同时显示不汇编代码相对应的c和c++代码)
(从图中可以看到mov $0x1,%eax 的机器代码为 b8 01 00 00 00)
-s -j参数可以用来查看某一段的数据如:
查看信息,lma与vma相等
用readelf读取elf文件格式的相关信息
hexdump工具
二进制文件的十六进制查看器
objcopy工具
转化成bin文件
.data段的lma不等于该段的vma
链接
查看文件头
查看数据,装载器会将对应段拷到该段的lma地址处
生成bin文件格式
test.noequal.bin只有9个字节大小了,
objcopy将elf格式的文件转化bin文件时,会根据lma的地址来分配地址,
如果要想bin文件运行,还必须把它拷到vma地址去,才能运行