【问题标题】:Symbol relocation from one compiler version to another从一个编译器版本到另一个编译器版本的符号重定位
【发布时间】:2019-07-16 09:17:24
【问题描述】:

我正在编译一个静态库,我们称它为 static.a,它稍后由共享库 shared.so 和最终的可执行二进制文件链接(shared.so 仅使用 static.a 中的一些函数,也许稍后这可以进一步拆分)。如果我尝试使用 gcc 7.4 编译它,我会收到此链接器错误:

/usr/bin/ld: ../../static.a(file.cpp.o): relocation R_X86_64_TPOFF32 against symbol `_ZGVZN6spdlog7details2os9thread_idEvE3tid' can not be used when making a shared object; recompile with -fPIC

我决定也尝试 gcc 9.1,并且不再出现此错误。

  1. 在构建将在共享库中使用的静态库时,是否应该始终使用 -fpic?我知道 fpic 会增加一些开销。
  2. 为什么新版本的 gcc 可以在共享库中重新定位 static.a 的符号?这安全吗?

谢谢。

【问题讨论】:

    标签: gcc linker g++ fpic


    【解决方案1】:

    共享库中的所有代码都应使用-fPIC 编译,因此您的静态库也应如此。 -fPIC 确实引入了开销,但在很大程度上可以通过-fno-semantic-interposition 和/或-fvisibility=hidden 等选项来缓解。

    您看到的错误来自链接器,因此似乎较新的 GCC 没有使用有问题的重定位。您可以检查生成的程序集以找出生成代码的差异。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多