1

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

为什么我们需要编译(.so)带有标志的共享库-fPIC

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

4

2 回答 2

2

共享库的思想是相同的代码可以被内存中的多个程序共享。但是,不能确保两个正在运行的程序期望库位于其内存布局的相同地址(如果程序使用不同的共享库,请考虑冲突)。所以共享库只在物理内存中存储一​​次,但由于内存管理单元,两个程序将相同的物理内存视为位于两个不同的地址。当然,要使其工作,您需要代码独立于其真实地址(参见例如http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/以获得更准确的解释)

这还允许您随机化共享内存的地址,这有利于安全原因(http://fr.wikipedia.org/wiki/Return-to-libc_attack

于 2013-07-16T11:57:34.240 回答
0

PIC 仅表示与位置无关的代码。想想代码中的跳转地址,它需要与内存中共享库代码的位置相关。

也看看:

于 2013-07-16T12:18:53.467 回答