您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Linux上创建.SO文件而不使用PIC(与位置无关的代码)(x86 32位)

在Linux上创建.SO文件而不使用PIC(与位置无关的代码)(x86 32位)

如果仅-fPIC在编译.so-file 时放下,会发生什么?

生成的共享库ELF文件(很有可能)将以半随机(即,不可预测的)页面地址动态加载(例如,因为mmapsyscall会遇到ASLR)。

链接器将产生大量的重定位操作。因此,动态链接程序(ld.so)必须缓慢处理大量重定位,因此必须重写您的文本段(并且不会与使用同一.so文件的其他进程有效地只读共享)。

因此,实际上-fPIC,即使有可能,忘记共享对象(即,动态链接库)上的链接通常也是一个坏主意。

阅读Drepper的HowTo做动态共享库的文章和Wheeler的程序库Howto

顺便说一句,与x86-64相比,在x86(32位)上与位置无关的代码成本更高。但是值得付出努力(在x86 32位上,PIC代码可能比非PIC慢5至10%)。

其他 2022/1/1 18:18:44 有475人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶