再次调整工具链

现在新的C库已经安装好了,我们需要再次调整工具链,让本章随后编译的那些工具都连接到这个库上。基本上,就是把前一章"锁定Glibc"那里做的调整给取消掉。

第一件事是调整连接器。我们在第二遍编译binutils的时候,保留了源码和编译目录。在 binutils-build 目录下用下列命令安装连接器:

make -C ld INSTALL=/tools/bin/install install

注: 如果你没看到前面关于保留binutils源码目录和编译目录的警告,或者不小心删除了第二遍Binutils的源码目录或编译目录,别紧张,关系不大,别运行上面的命令就行了,这样会使下一个软件包Binutils连接到 /tools 目录下的Glibc库上,而不是 /usr下那个。这不太完美,但经过我们的测试,生成的Binutils应该是一模一样的。

从现在起,所有新编译的程序都连接到/usr/lib/lib下的库文件上了。需要INSTALL=/tools/bin/install参数是因为在第二遍 Binutils 时创建的 Makefile还包含了对 /usr/bin/install的引用,而我们这时显然还没有安装它。有的发行版用 ginstall作为install的名称,这里就会出问题了,上面的命令也考虑了这种情况。

你现在可以删除 Binutils源码和编译目录了。

下面要做的是修正我们的 GCC specs 文件,使它指向新的动态连接器。和前面一样,我们用一个简单的 sed 命令就能做到:

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
    $SPECFILE > newspecfile &&
mv -f newspecfile $SPECFILE
unset SPECFILE

我们再次推荐你拷贝和粘贴上面的命令,而不是手动输入命令。和上次一样,在修改了以后,检查一下specs文件,可以确保真的改好了。

重要: 如果你的系统平台上,动态连接器的名字不是ld-linux.so.2,你必须 把上面命令里ld-linux.so.2换成你的系统平台上动态连接器的名字。参见 工具链技术说明 在 第 5 章

注意

现在停下来,检查一下新工具链的基本功能(编译和连接)是否正常,我们进行一个简单的合理性检查:

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

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

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

如果你没看到上面的结果,那么就有大问题了。你需要检查一下前面的操作,看看问题出在哪里,并改正过来。在改正之前,不要继续后面的部份,因为没什么意义。大多数情况下,出错都是因为上面的specs文件没改对。尤其 /lib应该是我们的动态连接器的前缀。当然,如果你的工作平台上动态连接器的名字不是ld-linux.so.2,那上面的结果也会不同。

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

rm dummy.c a.out