c++ - boost 测试 fpic 链接错误

标签 c++ boost linker fpic

我一直盯着看并用谷歌搜索,但我看不到我做了什么。

我在 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 位上失败;两条错误信息的意思是

  1. 重定位应用于 32 位值,但位移可能大于该值(出于安全原因,共享库位于随机地址,这使它们在 64 位平台上相距很远,
  2. 因此,静态库中没有对应重定位入口的动态重定位类型。

因此,链接器无法生成可加载的代码,并且理所当然地拒绝这样做。

要解决这个问题,需要链接共享的libboost_test_exec_monitor-mt,或者自己构建一个静态库。

关于c++ - boost 测试 fpic 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8703485/

相关文章:

c++ - 是否值得在生产中使用 std::tr1 ?

c++ - g++ 帮助链接本地拷贝

c++ - 返回右值时 VS2013 警告 C4172

c++ - 即使引用计数不为零,动态加载的 DLL 也可以被 Windows 卸载,如何处理?

c++ - CMake:找不到 boost 1_60_0(未找到 version.hp)

c++ - boost 属性树 : read value into char *

c++ - 与 boost::multiprecision 或其他选项配合良好的多精度 Python 库?

c - 虚拟内存和可重定位代码

c++ - 流氓缺少 C++ 符号 - 调试策略?

c++ - 如何将文件的特定部分读入私有(private)数据成员