gpt4 book ai didi

linux - 从 gcc 中删除 libgcc_s 依赖项

转载 作者:太空狗 更新时间:2023-10-29 11:12:19 26 4
gpt4 key购买 nike

我已经从源代码安装了 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++ 绑定(bind)。

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

虽然使用 -static-libgcc 开关确实会删除 libgcc_s.so.1,但我正在寻找一种让 gcc 自己执行此操作的方法。如果这意味着重新配置和重新安装 gcc,我没问题。

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

最佳答案

But I don't understand why libgcc is tied with -static-libstdc++.

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

libgcc_s.so.1 isn't always available on all machines. While I can install it, I don't want this extra requirement on my customers. Is there any way I can remove this dependency?

恕我直言,无论如何都应该安装它,很多 软件包都依赖于它。

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

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

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

关于linux - 从 gcc 中删除 libgcc_s 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com