《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.10. 调整工具链

简介:

         现在最后的 C 语言库已经装好了,是时候调整工具链,让新编译的程序链接到这些新的库上。

首先,备份 /tools 链接器,然后用我们在第五章调整过的链接器代替它。我们还会创建一个链接,链接到 /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

接下来,修改 GCC 参数文件,让它指向新的动态连接器。只需删除所有 “/tools” 的实例,这样应该可以留下到达动态链接器的正确路径。还要调整参数文件,这样 GCC 就知道怎样找到正确的头文件和 Glibc 启动文件。一个 sed 命令就能完成这些:

gcc -dumpspecs | sed -e 's@/tools@@g'                   \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' >      \
    `dirname $(gcc --print-libgcc-file-name)`/specs

直观地检查参数文件,来确认预期的变化确实完成了是个好的主意。

确保已调整的工具链的基本功能(编译和链接)都能如期进行是非常必要的。 怎样做呢?执行下面这条命令:

echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

如果没有任何错误,上条命令的输出应该是(不同的平台上的动态链接器可能名字不同):

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

注意 /lib 现在是我们动态链接库的前缀。

现在确保我们已经设置好了启动文件:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

上一条命令的输出应该是:

/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded

确保链接器能找到正确的头文件:

grep -B1 '^ /usr/include' dummy.log

这条命令应该返回如下输出:

#include <...> search starts here:
 /usr/include

接下来,确认新的链接器已经在使用正确的搜索路径:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

应该忽略指向带有 '-linux-gnu' 的路径,上条命令的输出应该是:

SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");

然后我们要确定我们使用的是正确的 libc:

grep "/lib.*/libc.so.6 " dummy.log

上条命令的输出应该是(在 64 位主机上会有 lib64 目录):

attempt to open /lib/libc.so.6 succeeded

最后,确保 GCC 使用的是正确的动态链接器:

grep found dummy.log

上条命令的结果应该是(不同的平台上链接器名字可以不同,64 位主机上是 lib64 目录):

found ld-linux.so.2 at /lib/ld-linux.so.2

如果显示的结果不一样或者根本没有显示,那就出了大问题。检查并回溯之前的步骤,找到出错的地方并改正。最有可能的原因是参数文件的调整出了问题。在进行下一步之前所有的问题都要解决。

一旦所有的事情都正常了,清除测试文件:

rm -v dummy.c a.out dummy.log
相关文章
|
14小时前
|
编解码 Ubuntu Linux
|
20小时前
|
Linux
请问如何在Linux系统中删除一个磁盘分区
请问如何在Linux系统中删除一个磁盘分区
|
1天前
|
Unix Linux Shell
Linux系统使用超详细(一)
Linux系统是一种开源的、类Unix操作系统内核的实现,它基于Unix的设计原理和思想,并在全球范围内广泛应用。以下是对Linux系统的详细描述:
|
1天前
|
Oracle 关系型数据库 Linux
SuSE linux server 11通过SAP来安装oracle11g
SuSE linux server 11通过SAP来安装oracle11g
|
1天前
|
Linux C语言
suse linux 11 安装GCC开发环境
suse linux 11 安装GCC开发环境
|
1天前
|
Ubuntu Linux 编译器
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
|
1天前
|
Linux Windows
虚拟机添加新硬盘之linux系统篇
虚拟机添加新硬盘之linux系统篇
|
2天前
|
Linux Shell C语言
Linux:自动化构建 - make
Linux:自动化构建 - make
10 1