5.5.1. 安装Cross GCC
GCC 现在需要 GMP、MPFR 和 MPC 包。 由于这些包可能不包含在您的主机发行版中,它们将使用 GCC 构建。 将每个包解压到 GCC 源目录并重命名生成的目录,以便 GCC 构建过程将自动使用它们:
备注
关于这一章经常有误解。 这些过程与前面解释过的每一章相同(包构建说明)。 首先从源目录中提取 gcc tarball,然后切换到创建的目录。 只有这样,您才能继续执行以下说明。
备注
关于这一章经常有误解。 这些过程与前面解释过的每一章相同(包构建说明)。 首先从源目录中提取 gcc tarball,然后切换到创建的目录。 只有这样,您才能继续执行以下说明。
焦油-xf ../mpfr-4.0.2.tar.xz mv-v mpfr-4.0.2 mpfr
焦油-xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp
焦油-xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc
焦油-xf ../mpfr-4.0.2.tar.xz mv-v mpfr-4.0.2 mpfr
焦油-xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp
焦油-xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc
在 gcc/config/{linux,i386/linux{,64}}.h
在 gcc/config/{linux,i386/linux{,64}}.h
$file{,.orig} 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
's@/usr@/tools@g' $file.orig > $file
$file{,.orig} 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
's@/usr@/tools@g' $file.orig > $file
以下命令将更改 GCC 的默认动态链接器的位置以使用安装在 /工具. 它还去除 / usr / include 来自 GCC 的包含搜索路径。 问题:
为文件做
cp -uv sed -e
-e
为文件做
cp -uv sed -e
-e
回声'
#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
完成
回声'
#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
完成
如果上面的内容似乎难以理解,让我们将其分解一下。 首先我们复制文件 gcc/配置/linux.h, gcc/配置/i386/linux.h及 gcc/配置/i368/linux64.h 到同名但添加了“.orig”后缀的文件。 然后第一个 sed 表达式将“/tools”添加到“/lib/ld”、“/lib64/ld”或“/lib32/ld”的每个实例之前,而第二个则替换“/usr”的硬编码实例。 接下来,我们添加定义语句,将默认起始文件前缀更改为文件末尾。 请注意,“/tools/lib/”中的尾随“/”是必需的。 最后,我们使用 触摸 更新复制文件的时间戳。 配合使用时 中央处理器,这可以防止在命令无意中运行两次时对原始文件进行意外更改。
最后,在 x86_64 主机上,将 64 位库的默认目录名称设置为“lib”:
案例 $(uname -m) 在 x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
ESAC
案例 $(uname -m) 在 x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
ESAC
GCC 文档建议在专用构建目录中构建 GCC:
mkdir -v 构建 cd 构建
mkdir -v 构建 cd 构建
准备 GCC 进行编译:
../配置 \
--目标=$LFS_TGT\
--prefix=/工具\
--with-glibc-version=2.11 \
--with-sysroot=$LFS\
--with-newlib \
--没有标题\
--with-local-prefix=/工具\
--with-native-system-header-dir=/工具/包括\
--禁用-nls \
--禁用共享\
--禁用多库\
--禁用十进制浮点\
--禁用线程\
--禁用-libatomic \
--禁用-libgomp \
--禁用-libquadmath \
--禁用-libssp \
--禁用-libvtv \
--禁用-libstdcxx \
--启用语言=c,c++
../配置 \
--目标=$LFS_TGT\
--prefix=/工具\
--with-glibc-version=2.11 \
--with-sysroot=$LFS\
--with-newlib \
--没有标题\
--with-local-prefix=/工具\
--with-native-system-header-dir=/工具/包括\
--禁用-nls \
--禁用共享\
--禁用多库\
--禁用十进制浮点\
--禁用线程\
--禁用-libatomic \
--禁用-libgomp \
--禁用-libquadmath \
--禁用-libssp \
--禁用-libvtv \
--禁用-libstdcxx \
--启用语言=c,c++
配置选项的含义:
--with-newlib
由于尚无可用的 C 库,这可确保在构建 libgcc 时定义了 prevent_libc 常量。 这可以防止编译任何需要 libc 支持的代码。
--无标题
创建完整的交叉编译器时,GCC 需要与目标系统兼容的标准头文件。 出于我们的目的,不需要这些标题。 此开关可防止 GCC 查找它们。
--with-local-prefix=/工具
本地前缀是 GCC 将在系统中搜索本地安装的包含文件的位置。 默认是 /usr/本地. 将此设置为 /工具 有助于保持主机位置 在/ usr /本地 离开这个 GCC 的搜索路径。
--with-native-system-header-dir=/工具/包括
默认情况下 GCC 搜索 / usr / include 对于系统标题。 结合 sysroot 开关,这通常会转化为 $LFS/usr/包括. 但是,将在接下来的两个部分中安装的标头将转到 $LFS/工具/包括. 这个开关确保 gcc 会正确地找到它们。 在 GCC 的第二遍中,这个相同的开关将确保找不到来自主机系统的头文件。
--禁用共享
此开关强制 GCC 静态链接其内部库。 我们这样做是为了避免主机系统可能出现的问题。
--disable-decimal-float、--disable-threads、--disable-libatomic、--disable-libgomp、--disable-libquadmath、--disable-libssp、--disable-libvtv、--disable- libstdcxx
这些开关禁用对十进制浮点扩展、线程、libatomic、libgomp、
libquadmath、libssp、libvtv 和 C++ 标准库。 这些功能在构建交叉编译器时将无法编译,并且对于交叉编译临时 libc 的任务不是必需的。
--禁用-multilib
在 x86_64 上,LFS 尚不支持多库配置。 此开关对 x86 无害。
--启用语言=c,c++
此选项可确保仅构建 C 和 C++ 编译器。 这些是现在唯一需要的语言。
通过运行编译 GCC:
使
使
编译现已完成。 此时,测试套件通常会运行,但如前所述,测试套件框架尚未到位。 此时运行测试的好处很小,因为第一遍的程序很快就会被替换。
安装软件包:
使安装
使安装