现在最终的 C 库已经安装完成,是时候再次调整工具链了。工具链将被调整为将任何新编译的程序链接到这些新的库。这与第 5 章开始的“调整”阶段中使用的过程相同,但调整方向相反。第 5 章中,链被引导从主机的/{,usr/}lib目录到新的/tools/lib目录。现在,链将从相同的/tools/lib目录引导到 LFS/{,usr/}lib目录。
首先调整链接器。Binutils 第二次构建过程的源代码和构建目录被保留用于此目的。通过在binutils-build目录中运行以下命令来安装调整后的链接器
make -C ld INSTALL=/tools/bin/install install
如果在第 5 章中错过了之前关于保留 Binutils 第二次构建过程的源代码和构建目录的警告,或者它们被意外删除或无法访问,请忽略上述命令。结果是下一个软件包 Binutils 将链接到/tools而不是/{,usr/}lib中的 C 库。 这不是理想情况,但测试表明,生成的 Binutils 程序二进制文件应该是相同的。
从现在开始,每个编译的程序都将仅链接到/usr/lib和/lib中的库。 需要额外的 INSTALL=/tools/bin/install 选项,因为在第二次构建过程中创建的Makefile文件仍然包含对 /usr/bin/install 的引用,而该命令尚未安装。 一些主机发行版包含一个ginstall符号链接,它在Makefile文件中具有优先权,并可能导致问题。 上述命令解决了这个问题。
现在删除 Binutils 源代码和构建目录。
接下来,修改 GCC specs 文件,使其指向新的动态链接器。 perl 命令可以完成此操作
perl -pi -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g;' \ -e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' \ `gcc --print-file specs`
最好目视检查 specs 文件,以验证预期的更改是否实际生效。
如果在动态链接器的名称不是ld-linux.so.2的平台上工作,请在上述命令中用平台动态链接器的名称替换 “ld-linux.so.2”。 如有必要,请回顾第 5.2 节 “工具链技术说明”。
此时必须停下来,确保调整后的工具链的基本功能(编译和链接)按预期工作。 为此,请执行健全性检查
echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /lib'
如果一切正常,则不应出现任何错误,并且最后一个命令的输出将是(允许动态链接器名称的平台特定差异)
[Requesting program interpreter: /lib/ld-linux.so.2]
注意/lib现在是我们的动态链接器的前缀。
如果输出未如上所示或根本未收到,则表示出现严重问题。 调查并回溯步骤,找出问题所在并纠正它。 最可能的原因是上面的 specs 文件修改出了问题。 在继续该过程之前,需要解决任何问题。
一切正常后,清理测试文件
rm -v dummy.c a.out