gcc:对-static -shared -fPIE -fPIC -Wl,-pie感到困惑

时间:2017-05-12 06:09:18

标签: gcc compilation static-linking

我正在尝试构建clang,所有库都是静态链接的。所以我可以在CentOS 6上使用古老的GCC 4.4版本运行它。

首先,我认为通过启用LLVM_BUILD_STATIC添加选项-static就足够了。但在链接阶段,它出错了。

  

动态STT_GNU_IFUNC符号`strcmp'在`/usr/lib/../lib64/libc.a(strcmp.o)'中使用指针相等;在制作可执行文件时不能使用;使用-fPIE重新编译并使用-pie重新链接

所以,我将-fPIE -Wl,-pie添加到CMAKE_CXX_FLAGS,它说

-- Performing Test HAVE_CXX_ATOMICS_WITH_LIB
-- Performing Test HAVE_CXX_ATOMICS_WITH_LIB - Failed
CMake Error at cmake/modules/CheckAtomic.cmake:49 (message):
  Host compiler must support std::atomic!
Call Stack (most recent call first):
  cmake/config-ix.cmake:307 (include)
  CMakeLists.txt:590 (include)

我检查了cmake/modules/CheckAtomic.cmake文件,它编译了以下代码

#include <atomic>
std::atomic<float> x(0.0f);
int main() { return (float)x; }

使用命令

  

/home/hailin/gcc-4.8.3-boost-1.55/rtf/bin/g++ -fPIE -Wl,-pie -DHAVE_CXX_ATOMICS_WITHOUT_LIB -std = c ++ 11 -static -lm

     

/home/hailin/gcc-4.8.3-boost-1.55/rtf/bin/g++ -fPIE -Wl,-pie -DHAVE_CXX_ATOMICS_WITH_LIB -std = c ++ 11 -static -lm -latomic

带有选项-Wl,-pie的命令会重现相同的错误。

这似乎是一个死胡同。 -shared-fPIE -Wl,-pie之间是否存在冲突?

1 个答案:

答案 0 :(得分:1)

一个老问题,但如果有人遇到它:显然您需要将-pie传递给编译器驱动程序(gcc / g ++),而不仅仅是传递链接器(-Wl,-pie)。某些启动对象文件的PIE不同(例如,Scrt1.o而不是crt1.o),这些文件由驱动程序传递给链接器,因此驱动程序需要知道您正在创建PIE。