该软件包的详细信息在第 8.30.2 节 “GCC 的内容”可以找到。
GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。
如同第一次构建 GCC 时一样,需要使用 GMP、MPFR 和 MPC 三个包。解压它们的源码包,并将它们移动到 GCC 要求的目录名:
tar -xf ../mpfr-4.2.2.tar.xz mv -v mpfr-4.2.2 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.4.1.tar.xz mv -v mpc-1.4.1 mpc
如果正在 x86_64 上进行构建,修改存放 64 位库的默认路径为 “lib”:
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
再次创建一个独立的构建目录:
mkdir -v build cd build
在开始构建 GCC 前,记得清除所有覆盖默认优化开关的环境变量。
现在准备编译 GCC:
../configure \
--build=$(../config.guess) \
--host=$LFS_TGT \
--target=$LFS_TGT \
--prefix=/usr \
--with-build-sysroot=$LFS \
--enable-default-pie \
--enable-default-ssp \
--disable-fixincludes \
--disable-nls \
--disable-multilib \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libvtv \
--enable-languages=c,c++ \
LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc \
target_configargs=gcc_cv_target_thread_file=posix
新的配置选项的含义:
--target=$LFS_TGT
我们正在交叉编译 GCC,因此无法使用这一遍构建的 GCC 二进制程序 —— 它们无法在宿主系统运行 ——
为目标系统构建运行库 (libgcc 和
libstdc++)。GCC
构建系统在默认情况下会试图使用宿主系统提供的 C 和 C++ 编译器来绕过这个问题。但是,用不同版本的 GCC 构建
GCC 运行库不受支持,所以使用宿主系统的编译器可能导致构建失败。该选项保证使用第一遍构建的 GCC 编译运行库。
--with-build-sysroot=$LFS
通常,指定 --host
即可保证使用交叉编译器构建 GCC,这个交叉编译器知道它应该在 $LFS 中查找头文件和库。然而,GCC
构建系统还会使用一些不知道该位置的工具。因此需要该选项,才能使得这些工具在 $LFS 中查找需要的文件,而非在宿主系统中查找。
--disable-fixincludes
默认情况下,在安装 GCC 时,一些系统头文件会被“修复”以供 GCC 使用。这对于现代的 Linux 系统来说是不必要的,而且如果一个软件包在安装 GCC 后被重新安装,还可能造成损害。这个开关阻止 GCC 尝试“修复”头文件。
--disable-libsanitizer
禁用 GCC 清理检查运行库。临时性安装 GCC 不需要它们。在第一遍的 GCC 中,--disable-libstdcxx
隐含了该选项,这里我们可以显式指定它。
LDFLAGS_FOR_TARGET=...
允许 libstdc++ 使用即将构建的
libgcc,而不是之前在第一遍的 GCC
中构建的版本。之前构建的版本无法正确支持 C++ 异常处理,因为它在构建时缺乏 libc 的支持。
target_configargs=gcc_cv_target_thread_file=posix
在构建目标系统的运行库 libgcc 和 libstdc++ 时启用 POSIX 线程支持。默认值取决于用于编译这些运行库的编译器 (这里是第一遍的 GCC,而它被配置为无线程支持)。
编译该软件包:
make
安装该软件包:
make DESTDIR=$LFS install
最后,还需要创建一个符号链接。许多程序和脚本运行 cc 而不是 gcc,因为前者能够保证程序的通用性,使它可以在所有 UNIX 系统上使用,无论是否安装了 GNU C 编译器。运行 cc 可以将选择 C 编译器的权力留给系统管理员:
ln -sv gcc $LFS/usr/bin/cc
该软件包的详细信息在第 8.30.2 节 “GCC 的内容”可以找到。