【发布时间】:2023-03-27 15:30:02
【问题描述】:
我最近正在构建一个针对 x86-64 架构的共享库 (ELF),如下所示:
g++ -o binary.so -shared --no-undefined ... -lfoo -lbar
失败并出现以下错误:
重定位R_X86_64_32 对'a local symbol' 在制作共享对象时不能使用;用 -fPIC 重新编译
当然,这意味着我需要将它重新构建为与位置无关的代码,因此它适合链接到共享库中。
但这在 x86 上运行良好,具有完全相同的构建参数。所以问题是,x86 上的重定位与 x86-64 有何不同,为什么我不需要在前者上使用 -fPIC 进行编译?
【问题讨论】:
-
我从来不明白这一点。如果编译器可以准确地告诉您要自动使用哪个选项,为什么它需要您说出魔术词才能使其正确运行?呜呜呜……
-
@Billy ONeal,现在我相信这是泄漏抽象的情况。它们在加载全局数据的方式上有所不同,这会影响是否需要 PIC。
-
我理解差异化的必要性。我不明白的是为什么你需要给编译器一个开关来让它做到这一点。
-
@Billy,错误来自链接器
-
@GearoidMurphy:好的,6 个,另外 6 个。编译是通过对 g++ 的一次调用(而不是分别调用编译器和链接器)来调用的,因此 g++ 应该能够轻松判断某个编译器选项是否需要相应的链接器选项。