Chinaunix首页 | 论坛 | 博客
  • 博客访问: 509980
  • 博文数量: 235
  • 博客积分: 1209
  • 博客等级: 少尉
  • 技术积分: 1417
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 19:59
文章分类

全部博文(235)

文章存档

2012年(107)

2011年(128)

分类:

2011-12-30 21:41:16

原文地址:程序的编译和链接 作者:Cheney-Xu

编写源文件test.S,并编译

gcc使用说明

加-c选项表示只编译不链接,不加-c选项时表示既编译又链接

加-g选项表示编译时加上调试信息

用-o选项来指定输出文件名

对text.S只进行编译不链接时,可以看出各个段的vma和lma都为0

Image

readelf工具(可用readelf -h来查看使用说明)

-a选项,读取全部信息

-h选项,读取文件头

用readelf工具来读取test.o,发现虽然对test.S只编译没有链接,生成文件的格式也是elf格式的,

只是不能运行,这种文件叫做可重定位文件(即链接时,段的位置由链接器重新指定)

Image(1)

将test.o链接成可执行文件,链接脚本如下,根据ld的规则,如果不用at指令定义lam的话,那么lma默认等于vma

Image(2)

链接器的作用就是

ld可用-T选项来设定使用的链接脚本

-o选项来设定输出文件名

对test.o进行链接

Image(3)

objdump工具

-h选项可以查看elf文件的段信息

-f选项可以查看elf文件的头信息

-d选项可以将elf文件反汇编成汇编代码来查看如(对于c和c++文件可用-S -d参数,它可使objdump在反汇编时

     同时显示不汇编代码相对应的c和c++代码)

Image(4)

(从图中可以看到mov $0x1,%eax 的机器代码为 b8 01 00 00 00)

-s -j参数可以用来查看某一段的数据如:

Image(5)

查看信息,lma与vma相等

Image(6)

用readelf读取elf文件格式的相关信息

Image(7)

hexdump工具

二进制文件的十六进制查看器

Image(8)

objcopy工具

转化成bin文件

Image(9)

.data段的lma不等于该段的vma

Image(10)

链接

Image(11)

查看文件头

Image(12)

查看数据,装载器会将对应段拷到该段的lma地址处

Image(13)

生成bin文件格式

Image(14)

test.noequal.bin只有9个字节大小了,

Image(15)

objcopy将elf格式的文件转化bin文件时,会根据lma的地址来分配地址,

如果要想bin文件运行,还必须把它拷到vma地址去,才能运行

Image(16)

阅读(1115) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~