【问题标题】:build gcc for static linking为静态链接构建 gcc
【发布时间】:2018-03-25 10:30:42
【问题描述】:

我使用

从源代码构建了自己的 gcc
/configure --host=x86_64-linux-gnu --target=x86_64-linux-gnu --enable-checking=release --enable-languages=c,c++ --disable-multilib --program-suffix=-6.4 --prefix=/home/martin/devel/gcc-6.4.0-build
make

一切都很顺利,除非我想像这样使用 cmake 构建具有静态运行时的共享库:

cmake_minimum_required(VERSION 2.6)

SET(CMAKE_C_COMPILER /home/martin/devel/gcc-6.4.0-build/bin/gcc-6.4)
SET(CMAKE_CXX_COMPILER /home/martin/devel/gcc-6.4.0-build/bin/g++-6.4)
project(Foo)
add_library(FooLib SHARED main.cpp)
target_link_libraries(FooLib -static-libgcc -static-libstdc++ -static)

当我尝试这样做时,我收到以下错误:

/usr/bin/ld: /home/martin/devel/gcc-6.4.0-build/lib/gcc/x86_64-linux-gnu/6.4.0/crtbeginT.o: relocation R_X86_64_32 against `__TMC_END__' can not be used when making a shared object; recompile with -fPIC
/home/martin/devel/gcc-6.4.0-build/lib/gcc/x86_64-linux-gnu/6.4.0/crtbeginT.o: error adding symbols: Bad value

所以我怀疑gcc没有正确构建,不知道该怎么做。

【问题讨论】:

  • 我建议你先选择一种编程语言,C 或 C++。

标签: c++ c gcc cmake


【解决方案1】:

您的 GCC 配置行中缺少 --with-pic。虽然有时显然会有一些错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58638 所以你应该添加CFLAGS="-fPIC" CXXFLAGS="-fPIC" 以确保安全。

【讨论】:

  • 我会试试的。我唯一不明白的是这是从哪里来的。当我输入 ./configure --help 时,从未提及 --with-pic
  • 它来自 libstdc++ 的configure。 GCC 的构建系统基本上是一打不同的软件/库:顶层configure 将它获得的所有选项传递给所有“子”configure:libstdc++、binutils、GMP、MPFR 等。但是所有选项子脚本没有在顶级脚本中保留(遗憾)。
  • 嗯...好消息是它编译了。坏消息是 ldd 正在显示一堆 .sos ...以防我正确阅读。我假设当我将共享库与 -static 链接时列表应该是空的......但我想这个问题已经解决了
  • > “我假设当我将共享库与 -static... 链接时,列表应该为空”:我认为这是不可能的:至少,共享库必须链接到 linux-vdso 和 ld-linux-$PLATFORM IIRC。
  • 但是当我从 cmake 行中删除整个 -static-libgcc -static-libstdc++ -static 并且 ldd 与它相同时......我正在尝试添加 --disable -如链接中所述共享......我会告诉你它是如何完成的。顺便说一句,ldd 列表是 linux-vdso.so.1、libstdc++.so.6、libm.so.6、libgcc_s.so.1、libc.so.6、/lib64/ld-linux-x86-64.so。 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多