我最近收到一个:
...重新定位 R_X86_64_32 反对“本地符号”在制作共享对象时不能使用;使用 -fPIC 重新编译
尝试将程序编译为共享库时出错。
现在解决这个问题并不太难(使用 -fPIC 重新编译所有依赖项),但经过一些研究发现这个问题只存在于 x86-64 平台上。在 32 位上,任何位置相关的代码仍然可以由动态加载器重新定位。
我能找到的最佳答案是:
x86 支持 .text 重定位(当您有位置相关代码时会发生这种情况)。这种支持是有代价的,即包含这种重定位的每个页面基本上都变得不共享,即使它位于共享库中,从而破坏了共享库的概念。因此我们决定在 amd64 上禁止这个(如果值需要超过 32 位,它会产生问题,因为所有 .text 重定位都只有大小“word32”)
但我觉得这还不够。如果重定位破坏了共享库的概念,为什么可以在 32 位平台上完成呢?此外,如果需要对 ELF 格式进行更改以支持 64 位,那么为什么不增加所有字段的大小以适应?
这可能是一个小问题,但它的动机是:a) 所讨论的代码是科学代码,不必受到性能影响会很好,b) 在第一名!
[编辑:'答案'
@awoodlands答案可能是最好的“字面答案”,@servn添加了一些很好的信息。
在搜索以查找有关不同类型重定位的更多信息时,我发现了这个并最终找到了x86_64 ABI 参考(参见第 68 页)]