小编Boj*_*n B的帖子

为什么在64位而非32位平台上绝对需要fPIC?

我最近收到了:

...在创建共享对象时,不能使用"对本地符号"重定位R_X86_64_32; 用-fPIC重新编译

尝试将程序编译为共享库时出错.

现在解决这个问题并不太困难(使用-fPIC重新编译所有依赖项),但经过一些研究后发现这个问题只出现在x86-64平台上.在32位上,任何依赖于位置的代码仍可由动态加载程序重新定位.

我能找到的最佳答案是:

x86支持.text重定位(当你有位置依赖代码时会发生这种情况).这种支持是有代价的,即包含这种重定位的每个页面基本上都不共享,即使它位于共享库中,从而破坏了共享库的概念.因此我们决定在amd64上禁止这个(如果值需要超过32位,它会产生问题,因为所有.text relocs只有'word32'大小)

但我觉得这还不够.如果重定位破坏了共享库的概念,为什么可以在32位平台上完成?此外,如果需要对ELF格式进行更改以支持64位,那么为什么并非所有字段的大小都增加以容纳?

这可能是一个小问题,但它的动机是这样一个事实:a)所讨论的代码是一个科学的代码,如果不必受到性能影响就很好b)这个信息很难在第一名!

[编辑:'答案'

@awoodlands的回答可能是最好的'字面答案',@ iservn 补充了一些很好的信息.

在搜索中找到有关不同类型重定位的更多信息时,我发现了这个并最终发现了x86_64 ABI参考(参见第68页)]

gcc shared-libraries dynamic-linking fpic 32bit-64bit

25
推荐指数
2
解决办法
5799
查看次数

MPI流程是如何开始的?

使用mpirun或启动MPI作业时mpiexec,我可以理解如何开始每个单独的过程.但是,如果没有任何编译器魔法,这些包装器可执行文件如何将安排(MPI通信器)传达给MPI进程?

我对细节很感兴趣,或者对指向何处的指针感兴趣.

mpi

13
推荐指数
1
解决办法
1284
查看次数

标签 统计

32bit-64bit ×1

dynamic-linking ×1

fpic ×1

gcc ×1

mpi ×1

shared-libraries ×1