.rea.text(Relocation Table)重定位表
链接器在处理目标文件时,必须对目标文件中某些部位进行重定位,即代码段与数据段中那些对绝对地址的引用的位置
这些重定位信息就记录在ELF文件的重定位表中
如果在.text中至少有一个绝对地址的引用,那就会有.rel.text.
字符串表
一种常见的方式,将变量名,段名等存放到一个表,然后使用字符串在表中的偏移来引用字符串
那么偏移与它们对应的字符串如下表
通过这样的方式,ELF文件中引用字符串只需要给出一个数字下标就可以了,不用考虑字符串长度的问题.
常见的段名为.strtab或.shstrtab,这两个分别叫字符串表和段表字符串表(section head string table)
链接的接口:符号
函数和变量统称为符号(symbol).函数名和变量名就是符号名(symbol name)
在本目标文件中引用的全局符号,却没有定义在本目标文件中,一般称为外部符号(External Symbol)
链接过程只关注全局符号的相互’粘合’,局部符号,段名,行号等都是次要的,因为它们对于其他目标文件是’不可见’的,在链接过程中也是无关紧要的.
特殊符号
在ld作为链接器来生产可执行文件时,它会为我们定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并且引用它,我们称之为特殊符号.其实这些符号是被定义在ld链接器的链接脚本中的.
- __executable_start,该符号为程序起始地址,注意不是入口地址,时程序最开始的地址
- __exext或_exext或exext,该符号为代码段结束地址,即代码段最末尾的地址
- _edata或edata,该符号是数据段结束地址,即数据段最末尾的地址
- _end或end,该符号是程序结束地址
以上都是程序被装载时的虚拟地址
c++的修饰符
为了支持c++中的函数重载,人们发明了符号修饰(name decoration)或符号改编(name mangling)的机制.
利用函数签名(function signature),用于识别不同的函数,就像签名用于识别不同的人一样,函数的名字只是函数前面的一部分.