我一直盯着看并用谷歌搜索,但我看不到我做了什么。
我在 32 位机器上有一个工作项目。我刚刚将存储库拉到 64 位机器(这是该项目的原始开发机器),现在我在尝试构建测试二进制文件时遇到以下链接错误
/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires dynamic R_X86_64_PC32 reloc against 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)' which may overflow at runtime; recompile with -fPIC
/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires unsupported dynamic reloc 11; recompile with -fPIC
我真的看不出我可以改变什么。 boost 库是直接从 ubuntu 存储库中提取的。任何有线索的人。
最佳答案
您正在将一个静态库(Boost 库)链接到一个动态库中。静态库通常不使用 -fPIC 构建,因为它们被假定为仅链接到一个程序,而不是另一个库。
在 32 位 x86 上,此类代码通过将与位置无关的代码部分重新定位到加载地址来悄悄修复;这使得受影响的页面无法共享。为此,需要将重定位条目从链接时间转换为运行时重定位。
此转换在 x86 64 位上失败;两条错误信息的意思是
- 重定位应用于 32 位值,但位移可能大于该值(出于安全原因,共享库位于随机地址,这使它们在 64 位平台上相距很远,和
- 因此,静态库中没有对应重定位入口的动态重定位类型。
因此,链接器无法生成可加载的代码,并且理所当然地拒绝这样做。
要解决这个问题,需要链接共享的libboost_test_exec_monitor-mt
,或者自己构建一个静态库。
关于c++ - boost 测试 fpic 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8703485/