为什么从非pic对象创建的共享库可以工作?

时间:2009-11-12 09:30:54

标签: linux shared-objects

我很困惑。我在x86上试用Linux。

2 个答案:

答案 0 :(得分:2)

PIC使得加载程序更加简单,因为它只需要修改代码中的一些全局地址。非PIC代码只包含更多这些地址,因此具有需要重定位的地址的表更大。但是加载器必须能够重新定位代码(例如,解析静态/全局变量和所有函数指针的地址)。

答案 1 :(得分:1)

x86 ABI支持共享库中的非PIC代码。如前所述,它意味着通常不会共享的页面将被共享(因为ld.so需要在代码中修补引用而非特殊地方(GOT))。

但是以这种方式构建的库可能会快一些,因为PIC代码通常较慢。

amd64 ABI不支持。