gcc:混淆-static-shared-fPIE-fPIC-Wl,-pie

gcc:混淆-static-shared-fPIE-fPIC-Wl,-pie,gcc,compilation,static-linking,Gcc,Compilation,Static Linking,我正试图建立叮当声,所有的库静态链接。这样我就可以在CentOS 6上用古老的GCC 4.4版本运行它 首先,我认为通过打开LLVM\u BUILD\u static添加选项-static就足够了。但在链接阶段,它会出错 在生成可执行文件时,不能使用“/usr/lib/./lib64/libc.a(strcmp.o)”中指针相等的动态STT_GNU_IFUNC符号“strcmp”;使用-fPIE重新编译并使用-pie重新链接 因此,我将-fPIE-Wl,-pie添加到CMAKE_CXX_标志中,

我正试图建立叮当声,所有的库静态链接。这样我就可以在CentOS 6上用古老的GCC 4.4版本运行它

首先,我认为通过打开LLVM\u BUILD\u static添加选项
-static
就足够了。但在链接阶段,它会出错

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

因此,我将
-fPIE-Wl,-pie
添加到CMAKE_CXX_标志中,它说

-- 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; }
#包括
标准:原子x(0.0f);
int main(){return(float)x;}
指挥

/home/hailin/gcc-4.8.3-boost-1.55/rtf/bin/g++-fPIE-Wl,-pie-DHAVE\u CXX\u ATOMICS\u无库-std=c++11-静态-lm

/home/hailin/gcc-4.8.3-boost-1.55/rtf/bin/g++-fPIE-Wl,-pie-DHAVE_CXX_ATOMICS_WITH_LIB-std=c++11-静态-lm-拉丁美洲

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


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

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