我对ELF
文件的内部有点好奇。我有这个问题:
为什么我们需要使用标记(.so)
编译共享库-fPIC
?
理论上,我们可以动态地将可执行文件与静态链接的elf
文件链接起来。
这是因为可执行文件中的GOT
和PLT
表需要更新,而动态链接可执行文件可以保持不变。
答案 0 :(得分:2)
共享库的想法是,相同的代码可以由内存中的多个程序共享。但是,无法确保两个正在运行的程序期望库位于其内存布局的相同地址(如果程序使用不同的共享库,请考虑冲突)。因此共享库只存储在物理内存中一次,但是由于内存管理单元,两个程序将相同的物理内存视为两个不同的地址。当然,为了实现这一点,您需要使代码独立于其真实地址(例如,请参阅http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/以获得更准确的解释)
此外,您还可以随机化共享内存的地址,这有助于安全起见(http://fr.wikipedia.org/wiki/Return-to-libc_attack)
答案 1 :(得分:0)
PIC仅仅意味着与位置无关的代码。考虑代码中的跳转地址,这些地址需要与内存中共享库代码的位置相关。
另请看: