GOT工作的全部原因是代码和数据部分之间的偏移是恒定的;因此,代码与数据部分中某些给定数据之间的偏移量是不变的。
This SO question解决了这个问题,并确认对于库中定义的数据,GOT是多余的。
剩下的唯一可能性是库中使用的数据,但在别处定义。
因此,共享库中GOT的唯一要点就是能够通过将所有重定位本地化为其他共享库中定义的符号来保持lib的代码段与位置无关, GOT?
答案 0 :(得分:0)
因此,共享库中GOT的唯一要点是能够通过将所有重定位本地化到GOT中其他共享库中定义的符号来保持lib的代码段与位置无关吗? / p>
GOD是允许代码重定位的机制,这是正确的。
但是,它适用于传统的共享对象和程序。它适用于由位置无关代码(PIE)(a.k.a地址空间布局随机化)引起的程序。
一般来说,PIE是PIC的子集。也就是说,您可以使用-fPIC
编译所有代码(程序和共享库)。但是,相反的是 不 为true。您无法使用-fPIE
编译所有代码(程序和共享库)。共享库需要-fPIC
。