多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 5.7\. 调整工具链 现在临时的C库已经装好,接下来本章中要编译的所有工具应该连接到这些库上。为了达到这个目标,需要调整连接器和编译器的 specs 文件。 在第一遍编译 Binutils 快结束时已经调整过的连接器,现在需要被重新命名以便可以被正确的找到和使用。首先备份原来的连接器,然后用调整过的连接器来替代,最后还要创建一个指向 `/tools/$(gcc -dumpmachine)/bin` 中连接器副本的连接。 ``` mv -v /tools/bin/{ld,ld-old} mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old} mv -v /tools/bin/{ld-new,ld} ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld ``` 从现在开始,所有程序都将连接到 `/tools/lib` 中的库文件。 下面要做的是修正 GCC 的"specs"文件,使它指向新的动态连接器。一个简单的 `sed` 命令就能做到: ``` SPECFILE=`dirname $(gcc -print-libgcc-file-name)`/specs && gcc -dumpspecs > $SPECFILE && sed 's@^/lib/ld-linux.so.2@/tools&@g' $SPECFILE > tempspecfile && mv -vf 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, "工具链技术说明,"](toolchaintechnotes.html "5.2\. 工具链技术说明")。 在编译过程中,GCC 会运行 `fixincludes` 脚本来扫描系统头文件目录,并找出需要修正的头文件(比如包含语法错误),然后把修正后的文件放到 GCC 专属头文件目录里。因此,它可能会找出宿主系统中需要修正的头文件,并将修正后的结果放到 GCC 专属头文件目录里。由于本章的剩余部分仅需要使用当前已经安装好的 GCC 和 Glibc 的头文件,所以任何"修正后的"头文件都可以被安全的删除。并且这样做也有助于避免宿主系统中的头文件"污染"编译环境。运行下面的命令删除 GCC 专属头文件目录中的头文件(由于命令较长,推荐你拷贝和粘贴命令,而不是手动输入): ``` GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include && find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; && rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` && unset GCC_INCLUDEDIR ``` ### 小心 现在,需要停下来确认新工具链的基本功能(编译和连接)是否按预期工作,运行下面的命令做一个简单的合理性检查: ``` 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-4.0.3 - 第一遍,"](gcc-pass1.html "5.4\. GCC-4.0.3 - 第一遍"),并建立符号链接。接下来,确保 `PATH` 正确。检查时,运行 `echo $PATH` 并检查 `/tools/bin` 是否在列表的最前面。如果 `PATH` 错误,可能是因为你没有以 `lfs` 用户登录,或者在[节 4.4, "设置工作环境."](../chapter04/settingenvironment.html "4.4\. 设置工作环境")部分出错了。另外一个原因可能是上面修正 specs 文件时出错,如果这样,重新修改 specs 文件,复制粘贴时要小心仔细。 在确定一切正常后,删除测试文件: ``` rm -v dummy.c a.out ``` ### 注意 下一小节中编译 TCL 时也将有助于检查工具连是否正确。如果 TCL 编译失败则表示之前安装的 Binutils 、GCC 或 Glibc 有问题,而不是 TCL 自身有问题。