虽然使用了 PIC 技术的代码段不需要重定位,但是数据段还是包含了绝对地址的引用,因为数据段中含有 GOT,或者是静态变量。
静态链接的重定位是在链接阶段就完成的,而动态链接的重定位发生在装载阶段,重定位表分别叫做 .rel.dyn
(对数据引用的修正,位于 GOT 和 .data
)和 .rel.plt
(对函数引用的修正,位于 .got.plt
)
对于 R_386_JUMP_SLOT
重定位,先查找函数的地址,填入 plt,实现动态链接,对 .got
填入的 R_386_JUMP_DATA
同理
R_386_RELATIVE
实际上是基址重置。共享对象的数据段是没有办法做到地址无关的(数据段地址无关性),所以对于绝对地址的引用类型的变量,必须在装载的时候对其进行重定位,A+B 型
如果不是 PIC 模式编译,导入函数的重定位表就会在 .rel.dyn
里面以 R_386_PC32
的形式出现了