有关此软件包的详细信息,请参见第 6.14.2 节,“GCC 的内容”。
已知此软件包在其默认优化标志(包括 -march 和 -mcpu 选项)被更改时会出现问题。如果已定义任何覆盖默认优化的环境变量,例如CFLAGS和CXXFLAGS,在构建 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。
以上补丁对于确保整体构建成功至关重要。请勿忘记应用它们。
再次创建一个单独的构建目录
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
新配置选项的含义
此选项确保在所有情况下都为 C++ 库选择正确的区域设置模型。如果 configure 脚本找到已安装的 de_DE 区域设置,它将选择正确的 gnu 区域设置模型。但是,如果未安装 de_DE 区域设置,则存在构建应用程序二进制接口 (ABI) 不兼容的 C++ 库的风险,因为可能会选择不正确的通用区域设置模型。
这为多线程代码启用 C++ 异常处理。
此选项允许使用 __cxa_atexit 而不是 atexit 来注册 C++ 析构函数,用于局部静态对象和全局对象。此选项对于完全符合标准的析构函数处理至关重要。它还会影响 C++ ABI,因此会生成可与其他 Linux 发行版互操作的 C++ 共享库和 C++ 程序。
此选项确保构建 C 和 C++ 编译器。
不要为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
此时强烈建议重复我们在本章前面执行的健全性检查。返回第 5.7 节,“调整工具链”,并重复测试编译。如果结果不正确,最可能的原因是 GCC Specs 补丁未正确应用。
有关此软件包的详细信息,请参见第 6.14.2 节,“GCC 的内容”。