现在临时的 C 库已经安装完成,本章剩余部分编译的所有工具都应该链接到这些库。为了实现这一点,需要调整链接器和编译器的 specs 文件。
链接器在 Binutils 的第一遍构建结束时被调整,通过在binutils-build目录中运行以下命令来安装:
make -C ld install
从此刻起,所有内容将只链接到/tools/lib.
注意
如果错过了之前关于保留 Binutils 源代码和构建目录的警告,请忽略上面的命令。这会导致后续的测试程序有很小的几率链接到宿主机上的库。这不是理想的情况,但也不是主要问题。当稍后安装 Binutils 的第二遍构建时,情况会得到纠正。
现在调整后的链接器已经安装完成,应该删除 Binutils 的构建和源代码目录。
SPECFILE=`gcc --print-file specs` && sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \ $SPECFILE > tempspecfile && mv -f tempspecfile $SPECFILE && unset SPECFILE
建议复制粘贴上面的命令,以确保准确性。 或者,可以手动编辑 specs 文件。方法是将所有出现的“/lib/ld-linux.so.2”替换为“/tools/lib/ld-linux.so.2”。
务必目视检查 specs 文件,以验证预期的更改是否已完成。
如果在动态链接器的名称不是ld-linux.so.2的平台上工作,请在上面的命令中将“ld-linux.so.2”替换为平台动态链接器的名称。如有必要,请回顾第 5.2 节“工具链技术说明”。
宿主机系统中的一些头文件有可能已经进入了 GCC 的私有 include 目录。这可能是 GCC 的 “fixincludes” 过程的结果,该过程作为 GCC 构建的一部分运行。本章稍后会更详细地解释这一点。运行以下命令以消除这种可能性
rm -vf /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h}
此时,务必停下来并确保新工具链的基本功能(编译和链接)按预期工作。要执行健全性检查,请运行以下命令
echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools'
如果一切正常,应该没有错误,并且最后一个命令的输出将是以下形式
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
请注意/tools/lib作为动态链接器的前缀出现。
如果输出未如上所示,或者根本没有输出,则说明有问题。调查并回顾步骤,找出问题所在并纠正它。必须先解决此问题才能继续。首先,再次执行健全性检查,使用 gcc 而不是 cc。如果这有效,则说明/tools/bin/cc符号链接丢失。重新访问第 5.4 节“GCC-3.4.3 - 第一遍”,并安装符号链接。接下来,确保PATH是正确的。可以通过运行 echo $PATH 并验证/tools/bin是否在列表的开头来检查这一点。如果PATH错误,则可能意味着您没有以用户 lfs 身份登录,或者在第 4.4 节“设置环境”中出了问题。另一种可能是上面的 specs 文件修改出了问题。在这种情况下,重新进行 specs 文件修改,注意复制粘贴命令。
一切正常后,清理测试文件
rm -v dummy.c a.out
在下一节中构建 TCL 将作为工具链是否正确构建的附加检查。如果 TCL 构建失败,则表明 Binutils、GCC 或 Glibc 安装出了问题,而不是 TCL 本身。