5.8. 调整工具链

现在已经安装好了临时C库,接下来本章中要编译的所有工具都应该连接到这些库上。 为了达到这个目标, 需要调整交叉编译器的 specs 文件,以便指向 /tools 目录中的新的动态链接器。

将编译器的 “specs” 文件转存到一个位置,在那里可以按默认值找到它。然后,一个简单的 sed替代工具更改GCC 将用到的动态链接器。 这里的原则是,在 /lib 目录(或者, 如果你的宿主系统是64位架构的, 可能是 /lib64 目录)中找到所有相关的动态链接器文件, 并调整它们,以便指向新的位置 /tools

为准确起见,在执行下面的命令时,推荐使用拷贝-粘贴的方法。 仔细检查这个 specs 文件, 保证调整的所有相关的动态链接器定位正确。 如果必要, 对于动态链接器的默认名, 请参考 Section 5.2, “工具链技术说明”

SPECS=`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/specs
$LFS_TGT-gcc -dumpspecs | sed \
  -e 's@/lib\(64\)\?/ld@/tools&@g' \
  -e "/^\*cpp:$/{n;s,$, -isystem /tools/include,}" > $SPECS 
echo "New specs file is: $SPECS"
unset SPECS
[Caution]

小心

现在,需要停下来确认新工具链的基本功能(编译和连接)是否按预期工作, 运行下面的命令做一个简单的合理性检查:

echo 'main(){}' > dummy.c
$LFS_TGT-gcc -B/tools/lib dummy.c
readelf -l a.out | grep ': /tools'

如果一切正常,应该不会出错,而且最后一个命令的结果应当是:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

注意, 动态链接器的前缀是 /tools/lib, 或者,对于64为机器是 /tools/lib64

如果输出和上面写的不一样,或者根本没有输出,那就有问题了。 调查和追溯这些步骤, 以便找出哪里出了问题, 并改正它。 继续操作以前, 必须解决问题。问题可能出在上面修改的 specs 文件上。这样的话,要重新修改 specs 文件,拷贝-粘贴这些命令时要小心。

在确定一切正常后,删除测试文件:

rm -v dummy.c a.out
[Note]

注意

下一小节中编译 Binutils 时也将有助于检查工具链是否正确。如果 Binutils 编译失败则表示之前安装的 Binutils 、GCC 或 Glibc 有问题。