5.10.1. 安装 GCC
我们的第一个 GCC 版本已经安装了几个内部系统头文件。 通常其中之一, 限制.h,将依次包含相应的系统 限制.h 标题,在这种情况下, /工具/包括/limits.h. 但是,在第一次构建 gcc 时 /工具/包括/limits.h 不存在,所以 GCC 安装的内部头文件是一个部分的、自包含的文件,不包括系统头文件的扩展功能。 这足以构建临时 libc,但此 GCC 构建现在需要完整的内部头文件。 使用与 GCC 构建系统在正常情况下所做的相同的命令创建内部头文件的完整版本:
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`目录名 $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`目录名 $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
在 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 的默认动态链接器的位置以使用安装在 /工具.
为文件做
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
完成
如果在 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 的第一个构建中,它需要 GMP、MPFR 和 MPC 包。 解压缩 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
再次创建一个单独的构建目录:
mkdir -v 构建 cd 构建
mkdir -v 构建 cd 构建
在开始构建 GCC 之前,请记住取消设置任何覆盖默认优化标志的环境变量。 现在准备 GCC 进行编译:
CC=$LFS_TGT-gcc\
CXX=$LFS_TGT-g++\
AR=$LFS_TGT-ar\
RANLIB=$LFS_TGT-ranlib\
../配置 \
--prefix=/工具\
--with-local-prefix=/工具\
--with-native-system-header-dir=/工具/包括\
--启用语言=c,c++\
--禁用-libstdcxx-pch \
--禁用多库\
--禁用引导\
--禁用-libgomp
CC=$LFS_TGT-gcc\
CXX=$LFS_TGT-g++\
AR=$LFS_TGT-ar\
RANLIB=$LFS_TGT-ranlib\
../配置 \
--prefix=/工具\
--with-local-prefix=/工具\
--with-native-system-header-dir=/工具/包括\
--启用语言=c,c++\
--禁用-libstdcxx-pch \
--禁用多库\
--禁用引导\
--禁用-libgomp
新配置选项的含义:
--启用语言=c,c++
此选项可确保构建 C 和 C++ 编译器。
--禁用-libstdcxx-pch
不要构建预编译头文件 (PCH) 库标准++. 它占用了很多空间,我们没有用。
--禁用引导
对于 GCC 的本机构建,默认是执行“引导”构建。 这不仅仅是编译 GCC,而是多次编译它。 它使用第一轮编译的程序进行第二次编译,然后再进行第三次编译。 比较第二次和第三次迭代,以确保它可以完美地复制自己。 这也意味着它被正确编译。 但是,LFS 构建方法应该提供一个可靠的编译器,而无需每次都进行引导。
编译包:
使
使
安装软件包:
使安装
使安装
最后,创建一个符号链接。 许多程序和脚本运行 cc 而不是 GCC,它用于保持程序的通用性,因此可以在不总是安装 GNU C 编译器的所有类型的 UNIX 系统上使用。 跑步 cc 让系统管理员可以自由决定安装哪个 C 编译器:
ln -sv gcc /工具/bin/cc
ln -sv gcc /工具/bin/cc
注意:
此时,必须停止并确保新工具链的基本功能(编译和链接)按预期工作。 要执行健全性检查,请运行以下命令:
echo 'int main(){}' > dummy.c cc dummy.c
readelf -l a.out | grep ':/工具'
echo 'int main(){}' > dummy.c cc dummy.c
readelf -l a.out | grep ':/工具'
如果一切正常,应该没有错误,最后一个命令的输出将采用以下形式:
[请求程序解释器:/tools/lib64/ld-linux-x86-64.so.2]
[请求程序解释器:/tools/lib64/ld-linux-x86-64.so.2]
请注意,对于 2 位机器,动态链接器将为 /tools/lib/ld-linux.so.32。
如果输出未如上所示或根本没有输出,则说明有问题。 调查并追溯这些步骤以找出问题所在并进行纠正。 在继续之前必须解决此问题。 首先,再次执行健全性检查,使用 GCC 而不是 cc. 如果这有效,那么 /工具/bin/cc 缺少符号链接。 如上所述安装符号链接。 接下来,确保 PATH 是正确的。 这可以通过运行来检查 回声 $ 路径 并验证 /工具/垃圾箱 位于列表的首位。 如果 PATH 是错误的,这可能意味着您没有以用户身份登录 LFS 或者在第 4.4 节中出现问题, “设置环境。”
一旦一切顺利,清理测试文件:
rm -v dummy.c a.out
rm -v dummy.c a.out