我对ELF
文件的内部有点好奇。我有这个问题:
为什么我们需要编译(.so)
带有标志的共享库-fPIC
?
虽然理论上,我们可以将可执行文件与静态链接的elf
文件动态链接。这是因为可执行文件中的GOT
andPLT
表需要更新,而动态链接可执行文件可以保持不变。
我对ELF
文件的内部有点好奇。我有这个问题:
为什么我们需要编译(.so)
带有标志的共享库-fPIC
?
虽然理论上,我们可以将可执行文件与静态链接的elf
文件动态链接。这是因为可执行文件中的GOT
andPLT
表需要更新,而动态链接可执行文件可以保持不变。
共享库的思想是相同的代码可以被内存中的多个程序共享。但是,不能确保两个正在运行的程序期望库位于其内存布局的相同地址(如果程序使用不同的共享库,请考虑冲突)。所以共享库只在物理内存中存储一次,但由于内存管理单元,两个程序将相同的物理内存视为位于两个不同的地址。当然,要使其工作,您需要代码独立于其真实地址(参见例如http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/以获得更准确的解释)
这还允许您随机化共享内存的地址,这有利于安全原因(http://fr.wikipedia.org/wiki/Return-to-libc_attack)
PIC 仅表示与位置无关的代码。想想代码中的跳转地址,它需要与内存中共享库代码的位置相关。
也看看: