如果仅-fPIC
在编译.so
-file 时放下,会发生什么?
生成的共享库ELF文件(很有可能)将以半随机(即,不可预测的)页面地址动态加载(例如,因为mmap
syscall会遇到ASLR)。
链接器将产生大量的重定位操作。因此,动态链接程序(ld.so
)必须缓慢处理大量重定位,因此必须重写您的文本段(并且不会与使用同一.so
文件的其他进程有效地只读共享)。
因此,实际上-fPIC
,即使有可能,忘记共享对象(即,动态链接库)上的链接通常也是一个坏主意。
阅读Drepper的HowTo做动态共享库的文章和Wheeler的程序库Howto
顺便说一句,与x86-64相比,在x86(32位)上与位置无关的代码成本更高。但是值得付出努力(在x86 32位上,PIC代码可能比非PIC慢5至10%)。