【问题标题】:newer gcc binary running on older systems在旧系统上运行的新 gcc 二进制文件
【发布时间】:2010-09-10 19:55:51
【问题描述】:

我有一个用 gcc 4.4.0 编译的二进制文件,并试图在没有 gcc 4.4.0 的旧系统上运行它。它不起作用。错误不是找不到符号,而是无法正确运行并挂起。系统之间的区别是 CentOS 5.5 vs 5.2,以及 gcc 4.4.0 vs 3.4.6。

如何在不安装 gcc 4.4.0 的情况下让它在该系统上运行?有没有我们可以放在上面的运行时库?简单地复制依赖项并设置库路径似乎不起作用。

二进制文件需要 gcc 4.4.0 的功能。

【问题讨论】:

    标签: gcc shared-libraries binary-compatibility


    【解决方案1】:

    我最近遇到了不得不这样做的情况。我的解决方案是将可执行文件编译为静态链接的应用程序,因此我的应用程序与所需库之间的兼容性没有问题。

    【讨论】:

    • 你能静态链接 libgcc 之类的吗?如果有,怎么做?
    • 编译代码时,将 -static 选项添加到 gcc。较新的 gcc 版本甚至会根据需要静态链接到动态库中。不利的一面是更大的可执行文件。 (在我的例子中,动态链接的可执行文件为 500KB,静态链接的可执行文件为 17MB)。
    • 实际上,当我在其上运行 ldd 时,它说它“不是动态可执行文件”这是否意味着它是动态链接的?错误不是它找不到符号,而是它没有正确运行并挂起。
    • 您的二进制格式与动态加载器所知道的不同,因此无法处理您的可执行文件。它可能仍然是动态链接的,您可以通过在编译它的系统上使用文件命令来判断。
    【解决方案2】:

    如果您正在编译,请在装有旧 GLIBC 库的机器上进行。 我在 VirtualBox 中设置了一个 Debian,在编译 Apache、MySQL 和 PHP 时可以完美运行。

    【讨论】:

    • 该二进制文件需要 gcc 4.4.0 的功能,因此如果您的建议是这样,我们无法在较旧的 gcc 版本上编译它。
    • 好吧,这个解决方案只有在二进制文件没有使用 GCC 4.4.0 的新功能时才有效。抱歉,我没头绪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2016-04-11
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多