05.构建临时编译环境(二)
时间:2006-11-17 来源:anima
五、构建临时编译环境(二)
3.Binutils-2.16.1 – 第一遍
Binutils 是一组开发工具,包括连接器、汇编器和其他用于目标文件和档案的工具。
预计编译时间: 1 SBU
所需磁盘空间: 189 MB
安装 Binutils
首先安装的第一个软件包是 Binutils ,这非常重要,因为 Glibc 和 GCC 会针对可用的连接器和汇编器进行多种测试,以决定是否打开某些特性。
Binutils 的文档推荐用一个新建的目录来编译它,而不是在源码目录中:
[root@fish lfs-packages-6.2]# su - lfs
lfs:~$ tar -jxvf $LFS/sources/binutils-2.16.1.tar.bz2 -C $LFS/sources/
lfs:~$ cd $LFS/sources/binutils-2.16.1/
lfs:/mnt/lfs/sources/binutils-2.16.1$ ./config.guess
i686-pc-linux-gnu
lfs:/mnt/lfs/sources/binutils-2.16.1$ mkdir -v ../binutils-build
mkdir: created directory `../binutils-build'
lfs:/mnt/lfs/sources/binutils-2.16.1$ cd ../binutils-build/
lfs:/mnt/lfs/sources/binutils-build$
注意
如果你想使用本书余下部份列出的 SBU 值,那么现在就要测量一下编译本软件包的时间。你可以用类似下面这样的 time 命令:time { ./configure ... && make && make install; } 。
为编译 Binutils 做准备:
lfs:/mnt/lfs/sources/binutils-build$ ../binutils-2.16.1/configure --prefix=/tools --disable-nls
配置选项的含义:
--prefix=/tools 这个参数告诉 configure 脚本,应该把 Binutils 软件包中的程序安装到 /tools 目录中。 --disable-nls 这个参数禁止了国际化(通常简称i18n),静态程序不需要国际化的特性。接下来编译它:
lfs:/mnt/lfs/sources/binutils-build$ make
[开始于2006年11月12日 22:49:56]
[结束于2006年11月12日 22:55:08]
现在编译完成了。通常我们会运行测试套件,但是目前测试套件(Tcl, Expect, DejaGNU)尚未安装。而且在这里运行测试也没什么用处,因为第一遍安装的程序很快就会被第二遍的程序所覆盖。
安装软件包:
lfs:/mnt/lfs/sources/binutils-build$ make install
接下来为后面"调整工具链"步骤准备连接器:
lfs:/mnt/lfs/sources/binutils-build$ make -C ld clean
lfs:/mnt/lfs/sources/binutils-build$ make -C ld LIB_PATH=/tools/lib/
lfs:/mnt/lfs/sources/binutils-build$ cp -v ld/ld-new /tools/bin/
`ld/ld-new' -> `/tools/bin/ld-new'
lfs:/mnt/lfs/sources/binutils-build$
make 参数的含义:
-C ld clean 告诉 make 程序删除所有 ld 子目录中编译生成的文件。 -C ld LIB_PATH=/tools/lib 这个选项重新编译 ld 子目录中的所有文件。在命令行中指定 Makefile 的 LIB_PATH 变量值,使它明确指向临时工具目录,以覆盖默认值。这个变量的值指定了连接器的默认库搜索路径,它在这一章的稍后部分会用到。
4.GCC-4.0.3 – 第一遍
GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。
预计编译时间: 8.2 SBU
所需磁盘空间: 514 MB
安装GCC
GCC 的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:
lfs:/mnt/lfs/sources/binutils-build$ tar -jxvf $LFS/sources/gcc-4.0.3.tar.bz2 -C $LFS/sources/
lfs:/mnt/lfs/sources/binutils-build$ cd $LFS/sources/gcc-4.0.3/
lfs:/mnt/lfs/sources/gcc-4.0.3$ mkdir -v ../gcc-build
mkdir: created directory `../gcc-build'
lfs:/mnt/lfs/sources/gcc-4.0.3$ cd ../gcc-build
lfs:/mnt/lfs/sources/gcc-build$
为编译 GCC 做准备:
lfs:/mnt/lfs/sources/gcc-build$ ../gcc-4.0.3/configure --prefix=/tools \
> --with-local-prefix=/tools --disable-nls --enable-shared \
> --enable-languages=c
配置选项的含义:
--with-local-prefix=/tools 这个参数的目的是把 /usr/local/include 目录从 gcc 的 include 搜索路径里删除。这并不是绝对必要,但我们想尽量减小宿主系统的影响,所以才这样做。 --enable-shared 这个参数咋一看有点违反直觉。但只有加上它,才能编译出 libgcc_s.so.1 和 libgcc_eh.a 。Glibc(下一个软件包)的配置脚本只有在找到 libgcc_eh.a 时才能确保产生正确的结果。 --enable-languages=c 只编译 GCC 软件包中的 C 编译器。我们在本章里不需要其它编译器。接下来编译它:
lfs:/mnt/lfs/sources/gcc-build$ make bootstrap
[开始于2006年11月12日 23:24:17]
[结束于2006年11月13日 00:07:55]
make 参数的含义:
bootstrap 使用这个参数的目的不仅仅是编译 GCC ,而是重复编译它几次。它用第一次编译生成的程序来第二次编译自己,然后又用第二次编译生成的程序来第三次编译自己,最后比较第二次和第三次编译的结果,以确保编译器能毫无差错的编译自身,这通常表明编译是正确的。编译现在完成了,通常我们会在这里运行测试套件,但是正如前面说过的,测试套件目前尚未安装,而且在这里运行测试没什么用处,因为第一遍安装的程序很快就会被第二遍的程序所覆盖。
安装软件包:
lfs:/mnt/lfs/sources/gcc-build$ make install
最后,我们创建一个必要的符号连接。因为许多程序和脚本试图运行 cc 而不是 gcc ,这样做是为了让程序能在多种 Unix 平台上运行,并保持一致性。并不是每个人都安装 GNU C 编译器。只运行 cc 而不是 gcc 可以把选择 C 编译器的自由留给系统管理员,我们这里将指向 gcc :
lfs:/mnt/lfs/sources/gcc-build$ ls /tools/bin/
addr2line cpp gprof ld-new ranlib strip
ar gcc i686-pc-linux-gnu-gcc nm readelf
as gccbug i686-pc-linux-gnu-gcc-4.0.3 objcopy size
c++filt gcov ld objdump strings
lfs:/mnt/lfs/sources/gcc-build$ ln -vs gcc /tools/bin/cc
create symbolic link `/tools/bin/cc' to `gcc'
lfs:/mnt/lfs/sources/gcc-build$ ls /tools/bin
addr2line cc gcov ld objdump strings
ar cpp gprof ld-new ranlib strip
as gcc i686-pc-linux-gnu-gcc nm readelf
c++filt gccbug i686-pc-linux-gnu-gcc-4.0.3 objcopy size
lfs:/mnt/lfs/sources/gcc-build$ ls -l /tools/bin/cc
lrwxrwxrwx 1 lfs lfs 3 Nov 13 00:14 /tools/bin/cc -> gcc