0%

静态链接

连接器采用“两部链接”的方法,将链接过程分为两部:

1.空间和地址分配:扫描所有的输入目标文件,获得各个节的长度、属性、位置并将它们合并,计算合并后各个段的长度与位置,建立映射关系。收集所有输入目标文件中符号表中所有的符号定义和符号引用,统一放到全局符号表中
2.符号解析与重定位:使用第一步中收集到的所有信息,读取输入文件中节的数据、重定位信息,并且进行符号解析与重定位、调整代码中的地址等。

重定位过程是链接过程的核心

符号解析与重定位

符号解析

重定位的过程伴随着符号解析过程,每个目标文件都可能定义一些符号,也可能引用到定义在其他目标文件的符号。重定位过程中,每个重定位的入口都是一个外部符号的引用,当链接器需要对某个符号的引用进行重定位时,他就要确定这个符号的目标地址。这时候链接器会去查找有所有输入目标文件的符号表组成的全局符号表,找到相应的符号后进行重定位,如果没有找到,就会报符号未定义的错误。

重定位

对于32位 x86平台下的ELF文件的重定位入口所修正的指令寻址方式只有两种:

1.绝对近址32位寻址
2.相对近址32为寻址

这两种重定位指令修正方式每个被修正的位置的长度都为32位,即4字节。而且都是近址寻址,不用考虑Intel的段间远址寻址。

X86基本重定位类型:
QQ截图20221203153333.png