该软件包的详细信息在第 8.28.2 节 “GCC 的内容”可以找到。
GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。
再次修复 GCC 13.2.0 中导致 Binutils-2.42 链接生成的可执行文件可能包含非法指令的问题:
sed -e '/ASM_OUTPUT_ALIGN_WITH_NOP/,+1d' \ -i gcc/config/loongarch/loongarch.h
如同第一次构建 GCC 时一样,需要使用 GMP、MPFR 和 MPC 三个包。解压它们的源码包,并将它们移动到 GCC 要求的目录名:
tar -xf ../mpfr-4.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.1 mpc
设置存放 64 位库的默认目录为 “lib”:
sed -e 's/lib64/lib/' \ -i.orig gcc/config/loongarch/{t-linux,linux.h}
覆盖 libgcc 和 libstdc++ 头文件的构建规则,以允许在构建它们时启用 POSIX 线程支持:
sed '/thread_header =/s/@.*@/gthr-posix.h/' \ -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in
再次创建一个独立的构建目录:
mkdir -v build cd build
在开始构建 GCC 前,记得清除所有覆盖默认优化开关的环境变量。
现在准备编译 GCC:
../configure \ --build=$(../config.guess) \ --host=$LFS_TGT \ --target=$LFS_TGT \ LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc \ --prefix=/usr \ --with-build-sysroot=$LFS \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-multilib \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libsanitizer \ --disable-libssp \ --disable-libvtv \ --enable-languages=c,c++
新的配置选项的含义:
--with-build-sysroot=$LFS
通常,指定 --host
即可保证使用交叉编译器构建 GCC,这个交叉编译器知道它应该在 $LFS
中查找头文件和库。但是 GCC
构建系统使用其他一些工具,它们不知道这个位置。因此需要该选项,使得这些工具在 $LFS
中查找需要的文件,而不是在宿主系统中查找。
--target=$LFS_TGT
我们正在交叉编译 GCC,因此不可能用编译得到的 GCC 二进制程序构建用于目标系统的运行库 (libgcc
和 libstdc++
) —— 这些二进制程序无法在宿主系统运行。GCC
构建系统在默认情况下会试图使用宿主系统提供的 C 和 C++ 编译器来绕过这个问题。但是,用不同版本的 GCC 构建
GCC 运行库不受支持,所以使用宿主系统的编译器可能导致构建失败。该选项保证使用第一遍构建的 GCC 编译运行库。
LDFLAGS_FOR_TARGET=...
允许 libstdc++
使用即将构建的
libgcc
共享库,而不是第一遍构建 GCC
时得到的静态库。这对于 C++ 异常处理支持是必要的。
--disable-libsanitizer
禁用 GCC 清理检查运行库。它们对于临时安装的 GCC 并不必要。为了在没有为目标安装 libcrypt
的情况下构建 GCC,必须使用该选项。在 第一遍的 GCC 中,--disable-libstdcxx
隐式地指定了该选项,但这里我们必须显式指定它。
编译该软件包:
make
安装该软件包:
make DESTDIR=$LFS install
最后,还需要创建一个符号链接。许多程序和脚本运行 cc 而不是 gcc,因为前者能够保证程序的通用性,使它可以在所有 UNIX 系统上使用,无论是否安装了 GNU C 编译器。运行 cc 可以将安装哪种 C 编译器的选择权留给系统管理员:
ln -sv gcc $LFS/usr/bin/cc
该软件包的详细信息在第 8.28.2 节 “GCC 的内容”可以找到。