|
|

楼主 |
发表于 2005-10-8 10:10:55
|
显示全部楼层
到此为止第五章所有为完成的章节已经全部完工!
====================
5.13. GCC-3.4.1 - 第二编
--------------------
预计编译时间: 11.0 SBU
所需磁盘空间: 274 MB
安装 GCC 依赖于:Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed, and Texinfo
再次安装 GCC
已知这个软件包在改变其默认的优化选项(包括 -march 和 -mcpu 选项)的时候会出现问题,如果您自定义的环境变量覆盖了这些默认选项,例如 CFLAGS 和 CXXFLAGS,请在编译 GCC 时unset 或修改它们。
测试 GCC 和Binutils所需的工具:Tcl, Expect 和 DejaGNU已经安装好。现在GCC 和Binutils 将被重新编译,连接到新的 Glibc 并作适当测试(如果运行这章中的测试的话),要注意,这些测试套件受伪终端(PTYs)的影响很大,这些终端是由主系统提供的,通过 devpts 文件系统实现。你可以用下面的方法,来测试主系统中PTY是否设置正常:
expect -c "spawn ls"
如果你得到下面的回答:
The system has no more ptys. Ask your system administrator to create more.
说明主系统的PTY没设置好。这种情况下,运行GCC和Binutils的测试套件就没什么意义了。你需要先解决主系统中的PTY设置问题。参见 LFS Wiki(http://wiki.linuxfromscratch.org/).
现在要编译 C 和 C++ 编译器,解压core 和 g++ 压缩包(如果你要运行测试套件,再解压test套件),它们会释放到名为gcc-3.4.1/的同一子目录中。
首先纠正一个问题,并做一些调整:
patch -Np1 -i ../gcc-3.4.1-no_fixincludes-1.patch
patch -Np1 -i ../gcc-3.4.1-specs-1.patch
第一个补丁禁止GCC中"fixincludes"脚本的运行。前面提到过一些,这里再深入地看看这个脚本的作用。在通常情况下,GCC的 fixincludes脚本会搜索你的系统头文件目录,找出需要修正的头文件。比如,它可能找出主系统的glibc头文件需要修正,就把修正后的文件放到 GCC的头文件目录里。随后,在第六章里,我们安装过新的glibc后,gcc的头文件目录会排在glibc头文件目录的前面,结果就是gcc使用的头文件是从主系统里来的glibc头文件,而不是我们新安装的那个。这可能会造成不兼容。
第二个补丁修改gcc的缺省动态连接器(典型的 ld-linux.so.2)的位置,还把/usr/include从GCC的头文件搜索路径里删掉。现在安装而不是安装GCC之后调整 specs文件可以保证新的动态连接器在编译gcc的时候就用上。也就是说,随后的所有临时程序都会连接到新的glibc上。
重要: 这两个补丁 非常重要,为了成功编译,千万别忘了运用它们。
再为编译创建一个单独目录:
mkdir ../gcc-build
cd ../gcc-build
在开始编译前,别忘了unset任何优化相关的环境变量。
准备编译GCC
../gcc-3.4.1/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模块。然而,如果没有安装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.1/contrib/test_summary
通过输出管道 grep -A7 Summ ,可只输出摘要
可以把结果与贴在gcc-testresults邮件列表上的比较一下。比如,GCC-3.4.1 在i686-pc-linux-gnu平台上的结果,见:http://gcc.gnu.org/ml/gcc-testresults/2004-07/msg00179.html
一些意外的失败总可以被忽略。GCC 的开发者通常知道这些问题,但还没有解决。只要你的测试结果和上面的URL里的结果没有太大出入,那么可以继续编译。
安装软件包
make install
注意
这里强烈建议再执行一次我们前面进行过的“合理性检查”。参见“调整工具连”小节,并重复测试 。如果结果是错误的,你很可能是忘了运用上面的Specs补丁。 |
|