<< Back to man.ChinaUnix.net

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 ,我们劝你在编译时 unset 或修改它们。

测试 GCC 和 Binutils 所需的工具(Tcl, Expect, DejaGNU)已经安装好。现在 GCC 和 Binutils 将被重新编译,连接到新的 Glibc 并作适当测试(如果运行这章中的测试的话)。注意,这些测试套件受伪终端(PTY)的影响很大,这些伪终端通常是由宿主系统通过 devpts 文件系统实现的。你可以用下面的方法,来测试宿主系统中PTY是否设置正常:

expect -c "spawn ls"

如果你得到下面的回答:

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

说明主系统的 PTY 没设置好。这种情况下,运行 GCC 和 Binutils 的测试套件就没什么意义了。你需要先解决主系统中的 PTY 设置问题。具体请参见 LFS 的 FAQ :http://www.linuxfromscratch.org/lfs/faq.html#no-ptys

首先纠正一个问题,并做一些调整:

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

第一个补丁禁止 GCC 中 fixincludes 脚本的运行。前面提到过一些,这里再深入地看看这个脚本的作用。在通常情况下,GCC 的 fixincludes 脚本会扫描你的系统头文件目录,找出需要修正的头文件。它可能会找出宿主系统的 Glibc 头文件需要修正,然后把修正后的文件放到 GCC 专属的头文件目录里。随后,在 Chapter 6 里,安装过新的 Glibc 后,GCC 专属的头文件目录将会在宿主的系统头文件目录之前被搜索,结果就是 GCC 使用的头文件是宿主系统的头文件,而不是我们新安装的那个。这可能会造成 Glibc 版本与 LFS 系统不兼容。

第二个补丁修改 GCC 的缺省动态连接器(通常是 ld-linux.so.2)的位置,还把 /usr/include 从 GCC 的头文件搜索路径里删掉。现在预先打补丁而不是在安装 GCC 之后调整 specs 文件可以保证新的动态连接器在编译 GCC 的时候就用上。也就是说,随后的所有临时程序都会连接到新的 Glibc 上。

[Important]

重要

这两个补丁非常重要,为了成功编译,千万别忘了运用它们。

[勘误]如果在编译 GCC-3.4.3 时使用的是 2.6.12 以上版本的内核,将会导致测试程序出现多处失败,这是由于这些高版本内核中增加的新特性导致的。如果你的宿主系统内核是 2.6.12 或更高版本,请从http://www.linuxfromscratch.org/patches/downloads/gcc/gcc-3.4.3-pch-1.patch下载可以修复该问题的补丁,并应用它:

patch -Np1 -i ../gcc-3.4.3-pch-1.patch

再为编译创建一个单独目录:

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

在开始编译前,别忘了 unset 任何优化相关的环境变量。

准备编译 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++库在任何情况下都使用正确的 locale 模块。如果配置脚本查找到 de_DE 这个 locale ,它就会使用正确的 gnu locale 模块。然而,如果没有安装 de_DE ,就有可能创建出应用程序二进制接口(ABI)不兼容的C++库文件,这是因为选择了错误的通用(generic) locale 模块。

--enable-threads=posix

使 C++ 异常能处理多线程代码。

--enable-__cxa_atexit

__cxa_atexit 代替 atexit 来登记 C++ 对象的本地静态和全局析构函数,这是为了完全符合标准对析构函数的处理规定。它还会影响到 C++ ABI ,因此生成的 C++ 共享库在其他的 Linux 发行版上也能使用。

--enable-languages=c,c++

本参数编译 C 和 C++ 语言的编译器。

--disable-libstdcxx-pch

不为 libstdc++ 编译预编译头(PCH),它占用了很大空间,但是我们用不到它。

编译软件包:

make

现在没必要用 bootstrap 作为 make 的目标,因为这里 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]

注意

这里强烈建议再执行一次我们前面进行过的合理性检查。参见 Section 5.7, "调整工具链",并重复测试 。如果结果是错误的,你很可能是忘了运用上面的 Specs 补丁。

关于这个软件包的详细资料位于 Section 6.14.2, "Contents of GCC."