为什么Linux中的共享库(.so)需要使用-fPIC标志进行编译?

时间:2013-07-16 11:50:02

标签: elf

我对ELF文件的内部有点好奇。我有这个问题:

为什么我们需要使用标记(.so)编译共享库-fPIC

理论上,我们可以动态地将可执行文件与静态链接的elf文件链接起来。 这是因为可执行文件中的GOTPLT表需要更新,而动态链接可执行文件可以保持不变。

2 个答案:

答案 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仅仅意味着与位置无关的代码。考虑代码中的跳转地址,这些地址需要与内存中共享库代码的位置相关。

另请看: