Glibc、GCC和binutils的兼容性问题

8
有没有关于binutils、glibc和GCC版本兼容性的官方文档?我在这个矩阵上找到了binutils与GCC版本兼容性的信息。如果有GCC与glibc的类似内容就更好了。
我询问这个问题的原因是我需要知道是否可以使用“嵌入式”glibc 2.2.4构建交叉GCC 4.9.2,以支持像CentOS 5这样的旧目标。
谢谢。
2个回答

3
很难用这么新的gcc版本构建如此旧的glibc版本。glibc在其安装文件中记录了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一起工作。
因此,找到您想要的gcc版本,然后找到其发布日期,然后查看大约在同一时间发布的glibc版本
尽管如此,使用旧版本的glibc是一个糟糕的主意。它将充满已知的安全漏洞(包括远程可利用的漏洞)。例如,最新的glibc-2.23版本修复了CVE-2015-7547,该漏洞影响执行DNS网络解析的任何应用程序,并影响从glibc-2.9开始的版本。记住:这不是唯一的潜在错误。

为什么你无法使用更新的GCC版本来构建旧版glibc?(这并不意味着更新的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 - Vinny
已知有许多问题,其中较新的gcc会错误编译较旧的glibc,因为glibc依赖于已更改的行为(有时是故意的,有时是偶然的)。它可能无法完全编译,或者在执行时仅崩溃。发布版本之间的差距越大,发生这种情况的可能性就越大。 - Mike Frysinger

1

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

平台A用于在平台B构建一个交叉编译器,该编译器目标嵌入式平台C的二进制文件。我故意使用了构建托管目标这些词语,因为这些是在构建交叉GCC时传递给配置选项的选项。


  • 构建平台:用于创建交叉GCC的机器平台
  • 主机平台:使用交叉GCC创建二进制文件的机器平台
  • 目标平台:运行由交叉GCC创建的二进制文件的机器平台

考虑以下情况(加拿大十字配置,BUILD != HOST平台):
将使用32位x86 Windows PC运行mingw32工具链来编译交叉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是相同的。


更典型的情况(常规交叉配置,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: powerpc-lynx-lynxos178


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接