Glibc vs GCC vs binutils compatibility

Glibc vs GCC vs binutils compatibility

本文关键字:vs compatibility binutils GCC Glibc      更新时间:2023-10-16

有没有关于binutils,glibc和GCC之间版本兼容性的官方文档?我找到了这个矩阵,用于 binutils 与 GCC 版本兼容性。对于 GCC 与 glibc 也有这样的东西会很好。

问这个问题的重点是,我需要知道我是否可以构建,比如说,将GCC 4.9.2与"嵌入式"glibc 2.2.4交叉,以便能够支持像CentOS 5这样的相当古老的目标。

谢谢。

极不可能用这样一个新版本的gcc来构建这样一个旧版本的glibc。 glibc 在其 INSTALL 文件中记录了 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-6与GCC-4.7配合使用。

因此,找到您想要的 GCC 版本,然后找到它的发布日期,然后查看大约同时发布的 glibc 版本。

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

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

平台 A 用于构建托管在平台 B 上的交叉编译器,该编译器TARGETS嵌入式Platform C二进制文件。我特意使用了 BUILD、HOSTEDTARGETS 这些词,因为这些是在构建跨 GCC 时传递的配置选项。


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

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

在上述场景中,我们的平台如下:
版本: i686-W32-明W32
HOST: x86_64-linux-gnu
TARGET : 电力电脑-猞猁-猞猁178

但是,这不是典型的配置。大多数情况下,构建平台和主机平台是相同的。


一个更典型的场景(常规交叉配置,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
TARGET : 电力电脑-猞猁-猞猁178


在构建跨GCC时(假设我们正在构建一个常规的交叉配置,其中BUILD == HOST Platform),需要GNU BinUtils,GCC,glibc和libstdc++(以及其他库)的本机版本来实际编译跨GCC。它不是关于每个组件的特定版本,而是关于每个组件是否支持编译GCC-4.9.2所需的特定语言功能(注意:仅仅因为GCC-4.9.2实现了语言功能X,并不意味着语言功能X必须由用于编译GCC-4.9.2的GCC版本支持。同样,仅仅因为 glibc-X.X.X 实现了库特性 Y,并不意味着用于编译 glibc-X.X.X 的 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标准。