我正在尝试构建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
之间是否存在冲突?
答案 0 :(得分:1)
一个老问题,但如果有人遇到它:显然您需要将-pie
传递给编译器驱动程序(gcc / g ++),而不仅仅是传递链接器(-Wl,-pie
)。某些启动对象文件的PIE不同(例如,Scrt1.o
而不是crt1.o
),这些文件由驱动程序传递给链接器,因此驱动程序需要知道您正在创建PIE。