【问题标题】:gcc: confused about -static -shared -fPIE -fPIC -Wl,-piegcc:对 -static -shared -fPIE -fPIC -Wl,-pie 感到困惑
【发布时间】:2017-05-12 06:09:18
【问题描述】:

我正在尝试构建 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之间有冲突吗?

【问题讨论】:

    标签: gcc compilation static-linking


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2019-09-13
      • 2012-07-22
      • 2013-05-13
      • 2020-04-16
      • 2023-03-08
      • 2019-08-04
      相关资源
      最近更新 更多