5.11. GCC-3.4.3 - 第二阶段

预计编译时间: 11.0 SBU
所需磁盘空间: 292 MB
安装依赖于: Bash、Binutils、Coreutils、Diffutils、Findutils、Gawk、Gettext、Glibc、Grep、Make、Perl、Sed 和 Texinfo

5.11.1. 重新安装 GCC

已知此软件包在其默认优化标志(包括 -march-mcpu 选项)被更改时会出现问题。如果已定义任何覆盖默认优化的环境变量,例如CFLAGSCXXFLAGS,在构建 GCC 时取消设置它们。

测试 GCC 和 Binutils 所需的工具(Tcl、Expect 和 DejaGNU)现在已安装。现在可以重新构建 GCC 和 Binutils,将它们与新的 Glibc 链接并正确测试它们(如果在本章中运行测试套件)。请注意,这些测试套件高度依赖于宿主提供的正常工作的 PTY。PTY 最常见的实现方式是通过devpts文件系统。通过执行快速测试来检查宿主系统是否在这方面设置正确

expect -c "spawn ls"

响应可能为

The system has no more ptys.  
Ask your system administrator to create more.

如果收到上述消息,则宿主系统未正确设置其 PTY。在这种情况下,在解决此问题之前,运行 GCC 和 Binutils 的测试套件是没有意义的。请查阅 LFS FAQ http://www.linuxfromscratch.org//lfs/faq.html#no-ptys 以获取有关如何使 PTY 工作的更多信息。

首先纠正一个已知问题并进行必要的调整

patch -Np1 -i ../gcc-3.4.3-no_fixincludes-1.patch
patch -Np1 -i ../gcc-3.4.3-specs-2.patch

第一个补丁禁用 GCC fixincludes 脚本。前面简要提到了这一点,但这里有必要对 fixincludes 过程进行更深入的解释。在正常情况下,GCC fixincludes 脚本会扫描系统以查找需要修复的头文件。它可能会发现宿主系统上的一些 Glibc 头文件需要修复,并将修复它们并将它们放在 GCC 私有包含目录中。在第 6 章中,在安装了较新的 Glibc 之后,将先搜索此私有包含目录,然后再搜索系统包含目录。这可能会导致 GCC 找到来自宿主系统的已修复头文件,这些头文件很可能与 LFS 系统使用的 Glibc 版本不匹配。

第二个补丁更改了 GCC 动态链接器的默认位置(通常为ld-linux.so.2)。它还移除了/usr/include从 GCC 的包含搜索路径中。现在打补丁而不是在安装后调整 specs 文件可确保在 GCC 的实际构建期间使用新的动态链接器。也就是说,在构建期间创建的所有最终(和临时)二进制文件都将链接到新的 Glibc。

[Important]

重要

以上补丁对于确保整体构建成功至关重要。请勿忘记应用它们。

再次创建一个单独的构建目录

mkdir -v ../gcc-build
cd ../gcc-build

在开始构建 GCC 之前,请记住取消设置任何覆盖默认优化标志的环境变量。

现在准备编译 GCC

../gcc-3.4.3/configure --prefix=/tools \
    --libexecdir=/tools/lib --with-local-prefix=/tools \
    --enable-clocale=gnu --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-languages=c,c++ --disable-libstdcxx-pch

新配置选项的含义

--enable-clocale=gnu

此选项确保在所有情况下都为 C++ 库选择正确的区域设置模型。如果 configure 脚本找到已安装的 de_DE 区域设置,它将选择正确的 gnu 区域设置模型。但是,如果未安装 de_DE 区域设置,则存在构建应用程序二进制接口 (ABI) 不兼容的 C++ 库的风险,因为可能会选择不正确的通用区域设置模型。

--enable-threads=posix

这为多线程代码启用 C++ 异常处理。

--enable-__cxa_atexit

此选项允许使用 __cxa_atexit 而不是 atexit 来注册 C++ 析构函数,用于局部静态对象和全局对象。此选项对于完全符合标准的析构函数处理至关重要。它还会影响 C++ ABI,因此会生成可与其他 Linux 发行版互操作的 C++ 共享库和 C++ 程序。

--enable-languages=c,c++

此选项确保构建 C 和 C++ 编译器。

--disable-libstdcxx-pch

不要为libstdc++构建预编译头文件 (PCH)。它占用大量空间,我们不需要它。

编译软件包

make

现在不需要使用 bootstrap 目标,因为用于编译此 GCC 的编译器是从与先前使用的 GCC 源代码完全相同的版本构建的。

编译现已完成。如前所述,运行本章中编译的临时工具的测试套件不是强制性的。要无论如何都运行 GCC 测试套件,请使用以下命令

make -k check

-k 标志用于使测试套件运行完成,而不是在第一次失败时停止。GCC 测试套件非常全面,几乎肯定会产生一些失败。要接收测试套件结果的摘要,请运行

../gcc-3.4.3/contrib/test_summary

仅对于摘要,通过 grep -A7 Summ 管道输出。

可以将结果与位于 http://www.linuxfromscratch.org/lfs/build-logs/6.1.1/ 的结果进行比较。

一些意外的失败并非总是可以避免的。GCC 开发人员通常意识到这些问题,但尚未解决它们。除非测试结果与上述 URL 中的结果大相径庭,否则可以安全地继续。

安装软件包

make install
[Note]

注意

此时强烈建议重复我们在本章前面执行的健全性检查。返回第 5.7 节,“调整工具链”,并重复测试编译。如果结果不正确,最可能的原因是 GCC Specs 补丁未正确应用。

有关此软件包的详细信息,请参见第 6.14.2 节,“GCC 的内容”。