【问题标题】:How to force a program to dynamically and NOT statically link to glibc 2.17 [duplicate]如何强制程序动态而不是静态链接到 glibc 2.17 [重复]
【发布时间】:2019-07-05 03:32:58
【问题描述】:

我正在使用 glibc 2.27 附带的 ubuntu 18 中的 gcc4.9 编译一个程序,并尝试在 redhat 7.4 上运行生成的程序。不幸的是,Redhat 7.4 带有 glibc 2.17,所以我需要将我的应用程序与该版本动态链接。

如何强制 gcc 使用特定版本的 glibc?

注意:建议静态链接前请先研究 glibc 许可证。

干杯,干杯

【问题讨论】:

    标签: c ubuntu gcc glibc


    【解决方案1】:

    不仅 glibc 存在问题,还有 libgcc 和 libstdc++ 以及程序可能链接到的任何其他库。

    正确的解决方案是设置一个 RedHat 7.4 chroot 并在那里编译您的代码。

    【讨论】:

    • libgcc 没有动态链接,libstdc++ 不适用于 c。许多其他库也没有问题,如果符号没有版本化并且 api 向后兼容
    • 不知道你有什么系统,但检查/lib/x86_64-linux-gnu/libgcc_s.so.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=92e0be1929d28508cf9c6d5754c7eb48c12255b3, stripped
    • 您自己生成的哪些二进制文件会在启动时动态链接此共享对象?
    • 另一个陷阱是静态链接 glibc 并认为可以解决问题。 glibc 在运行时 dlopen NSS 模块(命名服务,例如使用网络的任何东西),如果 ABI 发生更改,即使 glibc 链接为静态,也会严重失败。
    • 如果 ABI 改变了,你还有其他问题 ;) 你的意思是这里的 API。是的,正确,如果您不知道自己在做什么,链接 glibc 通常不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2010-10-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2018-03-30
    • 2012-05-09
    相关资源
    最近更新 更多