关于本软件包的更多信息可以在第 8.26.2 节 “GCC 的内容”中找到。
GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。
就像第一次构建 GCC 时一样,它需要 GMP、MPFR 和 MPC 三个包。解压它们的源码包,并将它们移动到 GCC 要求的目录名:
tar -xf ../mpfr-4.1.0.tar.xz mv -v mpfr-4.1.0 mpfr tar -xf ../gmp-6.2.1.tar.xz mv -v gmp-6.2.1 gmp tar -xf ../mpc-1.2.1.tar.gz mv -v mpc-1.2.1 mpc
对于 64 位系统,修改 64 位库文件的默认目录名为 “lib”:
sed -e 's/lib64/lib/g' \ -i.orig $(find gcc/config -name t-linux64)
对于 64 位 MIPS,修改 C 语言运行时目标文件的默认目录名为 “lib”:
sed -e 's/lib64/lib/g' \ -i.orig gcc/config/mips/mips.h
修复 MIPS 架构上的一个问题:
sed -e '2384 s/MSA/mode != MAX_MACHINE_MODE \&\& &/' \ -i gcc/config/mips/mips.c
再次创建一个独立的构建目录:
mkdir -v build cd build
创建一个符号链接,以允许 libgcc 在构建时启用 POSIX 线程支持:
mkdir -pv $LFS_TGT/libgcc ln -s ../../../libgcc/gthr-posix.h $LFS_TGT/libgcc/gthr-default.h
在开始构建 GCC 前,记得清除所有覆盖默认优化开关的环境变量。
现在准备编译 GCC:
../configure \ --build=$(../config.guess) \ --host=$LFS_TGT \ --prefix=/usr \ CC_FOR_TARGET=$LFS_TGT-gcc \ --with-build-sysroot=$LFS \ --enable-initfini-array \ --disable-nls \ --disable-multilib \ --disable-decimal-float \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++ \ --with-abi=64 \ $LFS_MIPS_GCC_EXTRA_OPTIONS
配置选项的含义:
-with-build-sysroot=$LFS
通常,使用 --host
即可保证使用交叉编译器构建 GCC,这个交叉编译器知道它应该在 $LFS
中查找头文件和库。但是,GCC
构建系统使用其他一些工具,它们不知道这个位置。因此需要该选项告诉它们在 $LFS
中查找需要的文件,而不是在宿主系统中查找。
--enable-initfini-array
该选项在使用 Linux 本地编译器构建另一个本地编译器时自动启用。然而我们使用交叉编译器进行编译,因此必须显式启用它。
编译该软件包:
make
安装该软件包:
make DESTDIR=$LFS install
最后,还需要创建一个符号链接。许多程序和脚本运行 cc 而不是 gcc,因为前者能够保证程序的通用性,使它可以在所有 UNIX 系统上使用,无论是否安装了 GNU C 编译器。运行 cc 可以将安装哪种 C 编译器的选择权留给系统管理员:
ln -sv gcc $LFS/usr/bin/cc
关于本软件包的更多信息可以在第 8.26.2 节 “GCC 的内容”中找到。