【发布时间】: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,并且不再出现此错误。
- 在构建将在共享库中使用的静态库时,是否应该始终使用 -fpic?我知道 fpic 会增加一些开销。
- 为什么新版本的 gcc 可以在共享库中重新定位 static.a 的符号?这安全吗?
谢谢。
【问题讨论】: