从gcc中删除libgcc_s依赖项

我已经从源码安装gcc-7.1.0基于: https : //gcc.gnu.org/install/index.html使用新的gcc。

编译的二进制文件与libgcc有一个额外的依赖关系:

 $ ldd a.out linux-vdso.so.1 => (0x00007fffd85fd000) librt.so.1 => /lib64/librt.so.1 (0x000000365b400000) libdl.so.2 => /lib64/libdl.so.2 (0x000000365a800000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000301ae00000) libpthread.so.0 => /lib64/libpthread.so.0 (0x000000365b000000) libc.so.6 => /lib64/libc.so.6 (0x000000365a000000) /lib64/ld-linux-x86-64.so.2 (0x0000003659c00000) 

我没有select任何特定的configuration选项(除了--prefix ),并安装了默认值。 看着config.log ,看来configuration决定默认情况下不能这样做。 相关部分:

 configure:5038: checking whether g++ accepts -static-libstdc++ -static-libgcc configure:5055: g++ -o conftest -g -O2 -static-libstdc++ -static-libgcc conftest.cpp >&5 g++: unrecognized option '-static-libstdc++' conftest.cpp:11:2: error: #error -static-libstdc++ not implemented configure:5055: $? = 1 configure: failed program was: | /* confdefs.h */ | #define PACKAGE_NAME "" | #define PACKAGE_TARNAME "" | #define PACKAGE_VERSION "" | #define PACKAGE_STRING "" | #define PACKAGE_BUGREPORT "" | #define PACKAGE_URL "" | /* end confdefs.h. */ | | #if (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) | #error -static-libstdc++ not implemented | #endif | int main() {} configure:5059: result: no 

(上面使用的g ++有点旧:g ++ 4.1.2(如果相关的话))。

我只编译C代码。 所以,如果没有静态链接支持-static-libstdc++ ,那不是问题。 但我不明白为什么libgcc-static-libstdc++绑定。

libgcc_s.so.1并不总是在所有机器上可用。 虽然我可以安装它,但我不希望这些额外的要求在我的客户。 有什么办法可以删除这个依赖?

虽然使用-static-libgcc开关确实删除libgcc_s.so.1 ,我正在寻找一种方法让gcc自己做到这一点。 如果这意味着重新configuration和重新安装gcc,那我就没问题了。

PS:我也必须遵循从这里的变通办法: https : //gcc.gnu.org/bugzilla/show_bug.cgi?id=61955作为机器有点旧。

但我不明白为什么libgcc与-static-libstdc ++绑定。

事实并非如此。 该配置测试控制引导过程中的中间编译器是静态链接还是动态链接,与最终GCC生成的可执行文件无关。

libgcc_s.so.1并不总是在所有机器上可用。 虽然我可以安装它,但我不希望这些额外的要求在我的客户。 有什么办法可以删除这个依赖?

恕我直言,它应该安装无论如何, 大量的软件包依赖于它。

可执行文件取决于libgcc,因为它们使用该库中的某些内容。 使用-static-libgcc链接来使用libgcc.a而不是libgcc_s.so 。 如果您希望自动发生这种情况,请在新的GCC上安装一个包装脚本,并将其始终添加到命令行参数中,或者使用一个自定义规格文件来添加该选项,例如通过配置GCC:

 --with-specs=%{!shared-libgcc:-static-libgcc} 

这应该意味着-static-libgcc总是隐含地使用,除非在命令行中明确提供了-shared-libgcc 。 我还没有测试过。

gcc-7.1.0依赖于libgcc_s.so.1(或静态), 版本7.1.0 ,必须提供“gcc-7.1.0包”。

当gcc作为自包含文件夹提供时很容易完成。 (gcc7 /)这对于额外的编译器来说通常是最方便的解决方案。

参考。 http://www.linuxfromscratch.org/lfs/view/development/→→http://www.linuxfromscratch.org/lfs/view/development/chapter05/gcc-pass2.html(LFS方法是由gcc推荐的人。&#xFF09;

例如,–prefix = / opt / gcc7或–prefix = / usr / localgcc7

../gcc-7.1.0/configure --prefix=/opt/gcc7 --program-suffix=7 --enable-languages=c,c++ --disable-multilib

建立链接: cd /usr/bin/ && ln -s [path-to]/gcc7/bin/gcc7 && ln -s [path-to]/gcc7/bin/g++7

也很容易从上面创建一个package.deb,package.rpm。

? 谁会希望没有一个C ++编译器? 建议:包括g ++。