安装 GCC-3.2

估计编译时间:		9.48 SBU
估计所需硬盘空间:     326 MB

GCC 的安装

你必须先打补丁,才能安装这个包。确认在运行下面的命令前,补丁已经解压了。

在第六章前我们不需要C++编译器,所以我们这里只解压 gcc-core 包。

如果你把这个包缺省的优化参数(包括 -march 和 -mcpu参数)改变的话,它会有很不良的表现。最好不要优化这个包。因此,如果你定义了任何优化参数的话,比如CFLAGS 和 CXXFLAGS,我们劝你在编译GCC时unset或修改它们。警告过了哦!

用以下命令安装 GCC:

patch -Np1 -i ../gcc-3.2.patch &&
patch -Np1 -i ../gcc-3.2-nofixincludes-2.patch &&
mkdir ../gcc-build &&
cd ../gcc-build &&
../gcc-3.2/configure --prefix=/static \
   --disable-nls --disable-shared &&
echo "#define HAVE_GAS_HIDDEN 1" >> gcc/auto-host.h &&
make BOOT_LDFLAGS=-static bootstrap &&
make prefix=$LFS/static install &&
ln -s gcc $LFS/static/bin/cc

命令解释

patch -Np1 -i ../gcc-3.2.patch: 这个补丁修正了一些bug。特别是它包含有"copy fix"和"var fix" ,在 http://www.zipworld.com.au/~gschafer/lfs-tweaks.html 中有详细叙述。

patch -Np1 -i ../gcc-3.2-nofixincludes-2.patch: 这个补丁阻止fixincludes脚本运行。在正常的环境中,安装GCC会运行fixincludes脚本,这个脚本扫描系统,找到需要修改的头文件。比如说它找到了 Glibc 的头文件。它会修改它们,并放在 $LFS/static/lib/gcc-lib/i686-pc-linux-gnu/3.2 目录中。在随后的第六章中,你将安装的 Glibc 会把头文件放在 /usr/include 目录中。接着,你将安装其它要用到 Glibc 头文件的程序。这时,GCC 会先在 /static/lib/gcc-lib 中找头文件,而不是在 /usr/include 目录中,这就会使用你主系统的 Glibc 头文件,而这个头文件可能与你的 LFS 系统中的 Glibc 版本不同,就可能会造成不兼容。

--prefix=/static: 这不是笔误!GCC在编译时对一些路径使用硬编码,所以我们要把/static作为前缀传递给 ./configure. 我们在make install时才传递真正的安装前缀。

echo "#define HAVE_GAS_HIDDEN 1": 这定义了 .hidden 汇编器指令,这样我们后面才不会编译出有错误的 Glibc 。

make BOOT_LDFLAGS=-static: 和我们在编译其它包时使用的 make LDFLAGS=-static 是等效的,都是使程序静态链接。

ln -s gcc $LFS/static/bin/cc: 这个命令创建了 $LFS/static/bin/gcc 的符号连接,以满足有些包的需要。

GCC的内容

最后检查于 version 3.1.

包含的程序

c++, c++filt, cc (link to gcc), cc1, cc1plus, collect2, cpp, cpp0, g++, gcc, gccbug, gcov 和 tradcpp0

具体说明

cc, cc1, cc1plus, gcc

都是C编译器. 编译器的功能是将文本格式的源代码编译成计算机能够理解的格式。源代码文件编译成目标文件后,目标代码连接器就会根据这个编译器产生的一个或多个目标文件产生一个可执行文件。

c++, cc1plus, g++

C++ 编译器

c++filt

C++支持函数重载. 也就是可以把很多函数写作同样一个函数名(每个的参数类型不一样). 所有C++函数名都被编码为低级汇编标识(识别编码). c++filt程序将这些编码解码成用户级的函数名,以至于这些重载函数不会互相冲突.

collect2

collect2 协助对结构体的编译

cpp, cpp0

cpp 对源码的预处理程序. 预处理程序或称编译预处理器实现对源代码进行编译前的预处理,例如将源代码中指定的头文件包含进来。通过头文件声明引入代码是一个节省编程时间的非常好的思想。您可以仅仅通过在代码头中插入类似#include <filename>的代码,预处理器就可以将您指定的文件的全部内容插入到需要编译的源代码中。

gccbug

gccbug 用来简化bug报告的脚本

gcov

gcov 分析程序以产生更高效快速的代码

tradcpp0

目前还没有描述

包含的库文件

libgcc.a, libgcc_eh.a, libgcc_s.so, libiberty.a, libstdc++.[a,so], libsupc++.a

具体说明

libgcc, libgcc_eh, libgcc_s

gcc运行时将用到

libiberty

包含一些被GNU程序用到的子程序, 例如getopt, obstack, strerror, strtol and strtoul.

libstdc++

C++ 库文件. C++库是C++程序所使用的,C++库包括C++程序中经常使用的函数,这样就可以保证程序员不必要在每次编写新的程序时都重新些某些特定的通用函数(如将文本输出到终端屏幕的函数)。

libsupc++

libsupc++ 提供对 c++ 程序的支持.

安装GCC依赖于

最后检查于 version 2.95.3.

Bash: sh
Binutils: ar, as, ld, nm, ranlib
Diffutils: cmp
Fileutils: chmod, cp, ln, ls, mkdir, mv, rm, touch
Find: find
Gcc: cc, cc1, collect2, cpp0, gcc
Grep: egrep, grep
Make: make
Patch: patch
Sed: sed
Sh-utils: basename, dirname, echo, expr, hostname, sleep, true, uname
Tar: tar
Texinfo: install-info, makeinfo
Textutils: cat, tail, tr