gcc: 对于-static -shared -fPIE -fPIC -Wl,-pie参数存在疑惑

3
我正在尝试构建clang,并将所有库静态链接。这样我就可以在安装古老的GCC 4.4版本的CentOS 6上运行它。
起初,我认为通过打开LLVM_BUILD_STATIC选项添加-static选项就足够了。但在链接阶段,它报错了。
动态STT_GNU_IFUNC符号`strcmp'与指针相等在 `/usr/lib/../lib64/libc.a(strcmp.o)'中不能用于制作可执行文件;重新编译并使用-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个回答

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接