Gcc 从一个编译器版本到另一个编译器版本的符号重定位

Gcc 从一个编译器版本到另一个编译器版本的符号重定位,gcc,linker,g++,fpic,Gcc,Linker,G++,Fpic,我正在编译一个静态库,我们称之为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_idE

我正在编译一个静态库,我们称之为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的符号?这安全吗
  • 多谢各位