我正在将一个线程局部变量添加到几个始终直接链接到可执行文件的目标文件中。这些对象永远不会包含在共享库中(可以肯定地假设这在可预见的将来会成立)。这意味着这些对象不需要 -fPIC 标志,对吗?
默认情况下,我们的代码库对所有对象都有 -fPIC 标志。其中许多都包含在共享库中,因此使用 -fPIC 是有意义的。但是,此标志在调试新线程局部变量时会出现问题,因为GDB 在使用 -fPIC 跨过线程局部变量时会崩溃。如果我使用新的线程局部变量从这几个目标文件中删除 -fPIC,我可以正确调试。
我找不到任何权威性的声明表明在可执行文件中将非 PIC 对象与 PIC 对象混合是可以的。到目前为止,我的测试表明它还可以,但感觉不干净,由于共享库的情况,在线讨论通常是“不要混合 PIC 和非 PIC”。
在这种情况下,将非 PIC 对象链接到使用 PIC 对象和库构建的可执行文件是否安全?也许 GCC 文档有一个关于这是安全的权威声明,但我找不到它。
编辑:二进制修补 gcc 以避免此错误在短期内不是解决方案。在 Linux 上切换编译器不是一个可行的解决方案。