这个包的详细信息位于 第 6.17.2 节 “GCC 的内容.”
GCC 软件包包含 GNU 编译器集,其中包括 C 和 C++ 编译器。
GCC 现在需要 GMP,MPFR 和 MPC 软件包。由于你的宿主发行版可能没有这些软件,所谓它们会和 GCC 一起被构建。把每个包都解压至 GCC 源代码目录,并把解出的目录重命名,让 GCC 构建过程能够自动使用它们:
关于这一章经常会有一些误解。这里的步骤和前面的每一章都一样(Package build instructions)。首先从 sources 目录中解压 gcc 包,然后进入解压出的目录。只有这样然后你才应该继续下面的指令。
tar -Jxf ../mpfr-3.1.2.tar.xz mv -v mpfr-3.1.2 mpfr tar -Jxf ../gmp-5.1.3.tar.xz mv -v gmp-5.1.3 gmp tar -zxf ../mpc-1.0.2.tar.gz mv -v mpc-1.0.2 mpc
下面的命令会改变 GCC 的默认链接器的位置,以使用安装在 /tools
中的链接器。它也把 /usr/include 从 GCC 的
include 搜索路径中移除。执行:
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done
如果上述命令看起来费解的话,让我们来分解它来看。首先我们找到 gcc/config 目录中所有名为 linux.h 或 linux64.h
或 sysv4.h 的文件。我们把找到的每一个文件都复制到一个同名但增加了
“.orig”
后缀的文件。 然后第一个 sed 表达式在每一个 “/lib/ld”,“/lib64/ld” 或“/lib32/ld” 前面加上 “/tools”,第二个替换硬编码的
“/usr”。接下来我们把我们的 define
语句加到文件的最后,这些语句会改变默认起始文件前缀。注意 “/tools/lib/” 尾部的 “/” 是要带着的。最后,我们用
touch
来更新复制后的文件的时间戳。在与 cp
-u 命令一起使用时,会避免万一命令不经意运行了两次而对原文件造成意外的更改。
GCC 不能正确检测堆保护,这会导致 Glibc-2.19 的构建出现问题,所以请执行下面的命令修复:
sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure
GCC 文档建议在源代码目录外面的一个专用构建目录中构建 GCC:
mkdir -v ../gcc-build cd ../gcc-build
准备编译 GCC:
../gcc-4.8.2/configure \
--target=$LFS_TGT \
--prefix=/tools \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libitm \
--disable-libmudflap \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libstdc++-v3 \
--enable-languages=c,c++ \
--with-mpfr-include=$(pwd)/../gcc-4.8.2/mpfr/src \
--with-mpfr-lib=$(pwd)/mpfr/src/.libs
configure 选项的含义:
--with-newlib
由于现在 C 库还不可用,此项确保了在构建 libgcc 时 inhibit_libc 常量已被定义。这避免了任何需要 libc 支持的代码的编译。
--without-headers
当创建一个完整的交叉编译器的时候,GCC 需要兼容于目标系统的标准头文件。对于我们的目的,这些头文件是不需要的。此项避免 GCC 寻找它们。
--with-local-prefix=/tools
本地前缀是 GCC 在系统中寻找本地安装的 include 文件的位置。默认位置是 /usr/local。把这个设为 /tools 使宿主的 /usr/local 位置在 GCC 搜索路径的外面。
--with-native-system-header-dir=/tools/include
GCC 默认在 /usr/include
中查找系统头文件。这和 sysroot 选项一起,会把这个位置翻译为 $LFS/usr/include。然而后面两节将会把头文件安装到
$LFS/tools/include。这个选项确保 gcc
能够正确地找到它们。在 GCC 的第 2 遍中,这个相同的选项会确保不从宿主系统中寻找头文件。
--disable-shared
这个选项强制 GCC 静态链接它的内部库。我们这样做是为了避免可能出现与宿主系统有关的问题。
--disable-decimal-float, --disable-threads,
--disable-libatomic, --disable-libgomp, --disable-libitm,
--disable-libmudflap, --disable-libquadmath,
--disable-libsanitizer, --disable-libssp,
--disable-libstdc++-v3
这些选项分别禁用了十进制浮点扩展、线程、libatomic、libgomp、libitm、libmudflap、libquadmath、libsanitizer、libssp 和 C++ 标准库的支持。这些特性在构建一个交叉编译器时会编译失败,而且对于交叉编译临时 libc 也不需要。
--disable-multilib
在 x86_64 上,LFS 还不支持多库配置。这个选项对 x86 无害。
--enable-languages=c,c++
这个选项确保只有 C 和 C++ 编译器被构建。这些是目前仅需要的语言。
--with-mpfr-*
这些选项使构建的系统能正确地使用 MPFR 源文件的 in-tree 拷贝。
运行以下命令编译 GCC:
make
编译现在完成了。此时,通常要运行测试套件,但正如我们前面提到的,测试套件的框架还没有就位。此时运行测试的的好处很小,因为第 1 遍安装的程序不久会被替换掉。
安装软件包:
make install
使用 --disable-shared 意味着
libgcc_eh.a 文件不会被创建和安装。而Glibc
包依赖这个库,因为在它的构建系统中使用了 -lgcc_eh。这个依赖关系可以通过创建一个到 libgcc.a 的符号链接来满足,因为这个文件最终会包含 libgcc_eh.a 文件中包含的部件:
ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
这个包的详细信息位于 第 6.17.2 节 “GCC 的内容.”