6.18. GCC-12.1.0 - 第二遍

GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。

估计构建时间: 14 SBU
需要硬盘空间: 4.5 GB

6.18.1. 安装 GCC

就像第一次构建 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

如果是在 x86_64 上构建,修改 64 位库文件的默认目录名为 lib

case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64
  ;;
esac

覆盖 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-initfini-array                        \
    --disable-nls                                  \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --enable-languages=c,c++

配置选项的含义:

--with-build-sysroot=$LFS

通常,指定 --host 即可保证使用交叉编译器构建 GCC,这个交叉编译器知道它应该在 $LFS 中查找头文件和库。但是,GCC 构建系统使用其他一些工具,它们不知道这个位置。因此需要该选项告诉它们在 $LFS 中查找需要的文件,而不是在宿主系统中查找。

--target=$LFS_TGT

由于我们正在交叉编译 GCC,此时不可能用编译得到的 GCC 二进制程序构建用于目标系统的运行库 (libgcclibstdc++),这是因为交叉编译得到的二进制程序无法在宿主系统运行。GCC 构建系统在默认情况下会试图使用宿主系统提供的 C 和 C++ 编译器来绕过这个问题。但是,由于 GCC 的运行库未必能用不同版本的 GCC 构建,使用宿主系统的编译器可能导致构建失败。该选项保证使用第一遍构建的 GCC 编译运行库,以防止出现此问题。

LDFLAGS_FOR_TARGET=...

允许 libstdc++ 使用即将构建的 libgcc 共享库,而不是第一遍构建 GCC 时得到的静态库。这对于 C++ 异常处理支持是必要的。

--enable-initfini-array

该选项在使用 x86 本地编译器构建另一个本地编译器时自动启用。然而我们使用交叉编译器进行编译,因此必须显式启用它。

编译该软件包:

make

安装该软件包:

make DESTDIR=$LFS install

最后,还需要创建一个符号链接。许多程序和脚本运行 cc 而不是 gcc,因为前者能够保证程序的通用性,使它可以在所有 UNIX 系统上使用,无论是否安装了 GNU C 编译器。运行 cc 可以将安装哪种 C 编译器的选择权留给系统管理员:

ln -sv gcc $LFS/usr/bin/cc

关于本软件包的更多信息可以在第 8.26.2 节 “GCC 的内容”中找到。