【发布时间】: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 这样的相当古老的目标。
谢谢。
【问题讨论】:
是否有关于 binutils、glibc 和 GCC 之间版本兼容性的官方文档?我发现 this matrix 用于 binutils 与 GCC 版本的兼容性。对于 GCC 和 glibc 也有这样的东西会很好。
我要问的一点是,我需要知道我是否可以构建,比如说,跨 GCC 4.9.2 和“嵌入式”glibc 2.2.4,以便能够支持像 CentOS 5 这样的相当古老的目标。
谢谢。
【问题讨论】:
在构建交叉编译器时,至少需要考虑两种,有时是三种平台类型:
Platform A 用于在 Platform B 上构建一个交叉编译器 HOSTED,TARGETS 二进制文件用于嵌入Platform C。我故意使用了 BUILD、HOSTED 和 TARGETS 这三个词,因为这些是在构建跨 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-gnuTARGET:powerpc-lynx-lynxos178
然而,这不是典型的配置。大多数情况下,BUILD PLATFORM 和 HOST 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 标准。
【讨论】:
用这样一个新版本的 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 开始的版本。请记住:这不是唯一潜伏的错误。
【讨论】:
-std=c99,然后手动使用LDFLAGS=-nostdlib 和LDLIBS=-l:libc.so.2.2.2 链接?