【问题标题】:Glibc vs GCC vs binutils compatibilityGlibc vs GCC vs binutils 兼容性
【发布时间】:2016-06-22 18:19:14
【问题描述】:

是否有关于 binutils、glibc 和 GCC 之间版本兼容性的官方文档?我发现 this matrix 用于 binutils 与 GCC 版本的兼容性。对于 GCC 和 glibc 也有这样的东西会很好。

我要问的一点是,我需要知道我是否可以构建,比如说,跨 GCC 4.9.2 和“嵌入式”glibc 2.2.4,以便能够支持像 CentOS 5 这样的相当古老的目标。

谢谢。

【问题讨论】:

    标签: c++ gcc glibc binutils


    【解决方案1】:

    在构建交叉编译器时,至少需要考虑两种,有时是三种平台类型:

    Platform A 用于在 Platform B构建一个交叉编译器 HOSTEDTARGETS 二进制文件用于嵌入Platform C。我故意使用了 BUILDHOSTEDTARGETS 这三个词,因为这些是在构建跨 GCC 时传递给配置的选项。


    • BUILD PLATFORM:将创建跨 GCC 的机器平台
    • HOST PLATFORM:将使用跨 GCC 创建二进制文件的机器平台
    • TARGET PLATFORM: 机器平台 运行跨 GCC 创建的二进制文件

    考虑以下情况(Canadian Cross Config,BUILD != HOST 平台):
    运行 mingw32 工具链的 32 位 x86 Windows PC 将用于编译跨 GCC。此跨 GCC 将用于 64 位 x86 Linux 计算机。跨 GCC 创建的二进制文件应在运行 LynxOS 178 RtOS(实时操作系统)的 32 位 PowerPC 单板计算机上运行。

    在上述场景中,我们的平台如下:
    BUILD:i686-w32-mingw32
    HOST:x86_64-linux-gnu
    TARGET:powerpc-lynx-lynxos178

    然而,这不是典型的配置。大多数情况下,BUILD PLATFORMHOST PLATFORM 是相同的。


    更典型的场景(Regular Cross Config,BUILD == HOST 平台):
    将使用 64 位 x86 Linux 服务器来编译跨 GCC。这个跨 GCC 也将用于 64 位 x86 Linux 计算机。跨 GCC 创建的二进制文件应在运行 LynxOS 178 RtOS(实时操作系统)的 32 位 PowerPC 单板计算机上运行。

    在上述场景中,我们的平台如下:
    BUILD:x86_64-linux-gnu
    HOST:x86_64-linux-gnu
    @987654326 @:powerpc-lynx-lynxos178


    在构建跨 GCC 时(假设我们正在构建一个常规的交叉配置,其中 BUILD == HOST 平台),GNU BinUtils、GCC、glibc 的原生版本,并且需要 libstdc++(以及其他库)来实际编译跨 GCC。不是每个组件的具体版本,而是每个组件是否支持编译 GCC-4.9.2 所需的特定语言特性(注意:仅仅因为 GCC-4.9.2 实现了语言特性 X,并不意味着该语言特性X必须是编译GCC-4.9.2的GCC版本支持的,同理,glibc-XXX实现了库特性Y,并不代表编译glibc-XXX的GCC版本一定是链接到实现功能 Y 的 glibc。


    在您的情况下,您应该简单地构建您的跨 GCC 4.9.2(或者如果您没有交叉编译,即您正在为 Linux 上的 CentOS 5 编译,则构建本机 GCC 4.9.2),然后当您链接您的 CentOS 5 可执行文件,使用 -l:libc.so.2.2.4 显式链接 glibc v2.2.4。您可能还需要在编译时定义-std=c99-std=gnu99,因为我非常怀疑glibc 2.2.4 是否支持C 2011 标准。

    【讨论】:

      【解决方案2】:

      用这样一个新版本的 gcc 构建这样一个旧版本的 glibc 是极不可能的。 glibc 在其INSTALL file 中记录了 binutils 和 gcc 所需的最低版本。

      glibc-2.23 状态:

      Recommended Tools for Compilation
      GCC 4.7 or newer
      GNU 'binutils' 2.22 or later
      

      通常,如果您想比那些更新,glibc 通常会与发布时正在开发的 gcc 版本一起使用。例如glibc-2.23 于 2016 年 2 月 18 日发布,当时 gcc-6 正在开发中,因此 glibc-2.23 将与 gcc-4.7 到 gcc-6 一起使用。

      所以找到你想要的version of gcc,然后找到它的发布日期,然后查看大约同一时间的glibc releases

      话虽如此,使用旧版本的 glibc 是一个糟糕的主意。它将充满已知的安全漏洞(包括可远程利用的漏洞)。例如,最新的 glibc-2.23 版本修复了CVE-2015-7547,它会影响任何执行 DNS 网络解析的应用程序并影响从 glibc-2.9 开始的版本。请记住:这不是唯一潜伏的错误。

      【讨论】:

      • 为什么你不能构建旧版本的 glibc 和更新版本的 gcc? (这并不是说新版本的 gcc 将能够在内部使用旧版本的 glibc,但是如果我想为 CentOS 5 构建可执行文件,如 OP 所述,应该我什至不能使用 GCC 9,检查 glibc 2.22 的源代码并构建 glibc 2.22。然后为 CentOS 5 构建应用程序,我将使用 GCC 9 编译源代码,并适用于旧的 -std=c99,然后手动使用LDFLAGS=-nostdlibLDLIBS=-l:libc.so.2.2.2 链接?
      • 有许多已知的问题,即新的 gcc 错误编译旧的 glibc,因为 glibc 依赖于已经改变的行为(有时是故意的,有时是偶然的)。它可能无法完全编译,或者它会编译然后在执行时简单地崩溃。版本之间的距离越远,发生这种情况的可能性就越大。
      猜你喜欢
      • 2016-01-27
      • 1970-01-01
      • 2018-09-13
      • 2011-11-22
      • 2019-08-27
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多