7.4 可重定位目标文件

下图展示了一个典型的ELF可重定位目标文件的格式。ELF头(ELF Header)以一个16字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序,ELF头剩下的部分包含帮助链接器语法分析和解释目标文件的信息。其中包括ELF头的大小,目标文件的类型(如可重定位,可执行性,或者共享的),机器类型(如x86-64),节头部表(section header table)的文件偏移,以及节头部表中条目的大小和数量。不同节的位置和大小是由节头部表描述的,其中目标文件中每个节都有一个固定大小的条目。
这里写图片描述
加载ELF头和节头部表之间的都是节。一个典型的ELF可重定位目标文件包含下面的几个节:
.text:已编译程序的机器代码。
.rodata:只读数据,如printf语句中的格式串和开关语句的跳转表。
.data:已初始化的全局和静态C变量。局部变量在运行时被保存在栈中,即不出现在.data节中,也不出现在.bss节中。
.bss: 未初始化的全局变量和静态C变量,以及所有被初始化位0的全局或静态变量。在目标文件中这个节不占据实际的空间,它仅仅时一个占位符。目标文件格式区分已初始化和未初始化变量是为了空间效率:在目标文件中,未初始化变量不占用任何实际的磁盘空间。运行时,在内存中分配这些变量,初始值为0.
.symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息,一些程序员错误的认为必须通过-g选项来编译一个程序,才能得到符号表的信息。实际上每个可重定位目标文件在.symtab中都有一张符号表(除非程序员特意使用STRIP命令去抹掉它)。然而,和编译器中的符号表不同,.symtab符号表不包括局部变量的条目。
.rel .text:一个.text节中位置的列表,当链接器把这个目标文件和其他文件组合时,需要修改这些位置。一般而言,任何调用外部函数或者引用全局变量的指令都需要修改。另一方面,调用本地函数的指令则不需要修改。注意,可执行目标文件中并不需要重定位信息,因此通常省略,除非用户显示的指示链接器包含这些信息。
.rel .data:被模块引用或定义的所有全局变量的重定位信息,一般而言,任何已初始化的全局变量,如果它的初始值是一个全局变量地址或者外部定义函数的地址,都需要被修改。
.debug:一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件,只有以-g选项调用编译器驱动程序时,才会得到这张表。
.line:原始C源程序中的行号和.text节中机器指令之间的映射。只有以-g选项调用编译器驱动程序时,才会得到这张表。
.strtab:一个字符串表,其内容包括.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串的序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值