从gcc中删除libgcc_s依赖项

时间:2017-05-29 15:42:56

标签: linux gcc

我已根据以下内容从源代码安装了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)

我没有选择任何特定的配置选项(--prefix除外)并使用默认值安装。查看config.log,似乎配置决定默认情况下无法执行此操作。相关部分:

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本身执行此操作的方法。如果这意味着重新配置并重新安装gcc,我就可以了。

P.S。:我还必须遵循这里的解决方法:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61955因为机器有点老了。

2 个答案:

答案 0 :(得分:4)

  

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

不是。 configure配置测试控制引导期间的中间编译器是静态链接还是动态链接,它与最终GCC生成的可执行文件无关。

  

libgcc_s.so.1并非在所有计算机上始终可用。虽然我可以安装它,但我不希望对我的客户有额外的要求。有什么办法可以消除这种依赖吗?

恕我直言,它应该安装,很多的包依赖它。

可执行文件依赖于libgcc,因为它们使用来自该库的东西。与-static-libgcc关联以使用libgcc.a代替libgcc_s.so。如果您希望自动发生这种情况,请在新GCC周围安装一个包装器脚本,始终将其添加到命令行参数中,或者使用始终添加该选项的自定义specs file,例如:通过以下方式配置GCC:

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

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

答案 1 :(得分:-2)

gcc-7.1.0依赖于libgcc_s.so.1(或静态),版本7.1.0 ,它必须随&#34; gcc-7.1.0软件包提供&# 34 ;.

当gcc作为自包含文件夹提供时,轻松完成。 (gcc7 /)这通常是额外编译器最方便的解决方案。

参考。 http://www.linuxfromscratch.org/lfs/view/development/ →→http://www.linuxfromscratch.org/lfs/view/development/chapter05/gcc-pass2.html(GFS人员推荐使用LFS方法。)

示例, - 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 ++。