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