该软件包的更多细节在第 8.26.2 节 “GCC 的内容”可以找到。
GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。
GCC 依赖于 GMP、MPFR 和 MPC 这三个包。由于宿主发行版未必包含它们,我们将它们和 GCC 一同构建。将它们都解压到 GCC 源码目录中,并重命名解压出的目录,这样 GCC 构建过程就能自动使用它们:
对于本章内容有一些很常见的误解。该软件包的构建过程就像之前 (软件包构建说明) 解释的那样,首先解压 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)
对于 x86_64 平台,设置存放 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
GCC 文档建议在一个专用目录中构建 GCC:
mkdir -v build cd build
准备编译 GCC:
../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.11 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-initfini-array \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-decimal-float \ --disable-threads \ --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-glibc-version=2.11
该选项确保该软件包与宿主的 glibc 版本兼容。它被设定为宿主系统需求中要求的最小 glibc 版本一致。
--with-newlib
由于现在没有可用的 C 运行库,使用该选项保证构建 libgcc 时 inhibit_libc 常量被定义,以防止编译任何需要 libc 支持的代码。
--without-headers
在创建完整的交叉编译器时,GCC 需要与目标系统兼容的标准头文件。由于我们的特殊目的,这些头文件并不必要。这个开关防止 GCC 查找它们。
--enable-initfini-array
这个开关强制启用一些内部数据结构,它们是必要的,但是在构建交叉编译器时,无法被检测到。
--disable-shared
这个开关强制 GCC 静态链接它的内部库。我们必须这样做,因为动态库需要目标系统中尚未安装的 glibc。
--disable-multilib
在 64 位平台上,LFS 不支持 multilib 配置。
--disable-decimal-float, --disable-threads,
--disable-libatomic, --disable-libgomp, --disable-libquadmath,
--disable-libssp, --disable-libvtv,
--disable-libstdcxx
这些开关禁用对于十进制浮点数、线程、libatomic、libgomp、libquadmath、libssp、libvtv 和 C++ 标准库的支持。在构建交叉编译器时它们的编译会失败,而且在交叉编译临时 libc 时并不需要它们。
--enable-languages=c,c++
这个选项保证只构建 C 和 C++ 编译器。目前只需要这两个语言。
--with-abi=64
在 64 位 MIPS 上,GCC 默认为 32 位 ABI 生成目标代码。该选项覆盖这个默认设置。
执行以下命令编译 GCC:
make
安装该软件包:
make install
刚刚构建的 GCC 安装了若干内部系统头文件。其中的 limits.h
一般来说,应该包含对应的系统头文件 limits.h
,在我们的 LFS
环境中,就是 $LFS/usr/include/limits.h
。然而,在构建 GCC
的时候,$LFS/usr/include/limits.h
还不存在,因此
GCC 安装的内部头文件是一个不完整的、自给自足的文件,不包含系统头文件提供的扩展特性。这对于构建临时的 libc
已经足够了,但后续工作将需要完整的内部头文件。使用以下命令创建一个完整版本的内部头文件,该命令与 GCC
构建系统在一般情况下生成该头文件的命令是一致的:
cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h
该软件包的更多细节在第 8.26.2 节 “GCC 的内容”可以找到。