虽然使用了 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 的形式出现了