mirror of
https://github.com/LCTT/LFS-BOOK-7.7-systemd.git
synced 2026-01-14 00:49:09 +00:00
205 lines
7.2 KiB
HTML
205 lines
7.2 KiB
HTML
Translated by H-mudcup
|
||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content=
|
||
"application/xhtml+xml; charset=utf-8" />
|
||
<title>
|
||
6.10. 调整工具链
|
||
</title>
|
||
<link rel="stylesheet" type="text/css" href="../stylesheets/lfs.css" />
|
||
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1" />
|
||
<link rel="stylesheet" href="../stylesheets/lfs-print.css" type="text/css"
|
||
media="print" />
|
||
</head>
|
||
<body class="lfs" id="lfs-7.7-systemd">
|
||
<div class="navheader">
|
||
<h4>
|
||
Linux From Scratch - Version 7.7-systemd
|
||
</h4>
|
||
<h3>
|
||
第六章 安装基本的系统软件
|
||
</h3>
|
||
<ul>
|
||
<li class="prev">
|
||
<a accesskey="p" href="glibc.html" title="Glibc-2.21">上一页</a>
|
||
<p>
|
||
Glibc-2.21
|
||
</p>
|
||
</li>
|
||
<li class="next">
|
||
<a accesskey="n" href="zlib.html" title="Zlib-1.2.8">下一页</a>
|
||
<p>
|
||
Zlib-1.2.8
|
||
</p>
|
||
</li>
|
||
<li class="up">
|
||
<a accesskey="u" href="chapter06.html" title=
|
||
"Chapter 6. Installing Basic System Software">返回</a>
|
||
</li>
|
||
<li class="home">
|
||
<a accesskey="h" href="../index.html" title=
|
||
"Linux From Scratch - Version 7.7-systemd">主页</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="sect1" lang="en" xml:lang="en">
|
||
<h1 class="sect1">
|
||
<a id="ch-system-adjusting" name="ch-system-adjusting"></a>6.10.
|
||
调整工具链
|
||
</h1>
|
||
<p>
|
||
现在最后的 C 语言库已经装好了,是时候调整工具链,
|
||
让新编译的程序链接到这些新的库上。
|
||
</p>
|
||
<p>
|
||
首先,备份First,<code class="filename">/tools</code> 连接器,然后
|
||
用我们在第五章调整过的链接器代替它。我们还会创建一个链接,连接到 <code class=
|
||
"filename">/tools/$(gcc -dumpmachine)/bin</code>的副本:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">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</kbd>
|
||
</pre>
|
||
<p>
|
||
接下来,修改 GCC 参数文件,让它指向新的动态连接器。
|
||
只需删除所有 <span class=
|
||
"quote">“<span class="quote">/tools</span>”</span> 的实例,这样应该可以留下
|
||
到达动态链接器的正确路径。还要调整参数文件,这样 GCC 就知道怎样找到正确的头文件和 Glibc 启动文件。
|
||
一个 <span class="command"><strong>sed</strong></span> 命令就能完成这些:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class=
|
||
"command">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</kbd>
|
||
</pre>
|
||
<p>
|
||
能够显示出参数文件,看见我们要做的修改确实完成了是个好想法。
|
||
</p>
|
||
<p>
|
||
在这个关键时刻,确保已调整的工具链的基本功能(编译和链接)都能如期进行是非常必要的。
|
||
怎样做呢?执行下面这条命令:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">echo 'main(){}' > dummy.c
|
||
cc dummy.c -v -Wl,--verbose &> dummy.log
|
||
readelf -l a.out | grep ': /lib'</kbd>
|
||
</pre>
|
||
<p>
|
||
应该没有任何错误,上条命令的输出应该是(不同的平台上的动态连接器可能名字不同):
|
||
</p>
|
||
<pre class="screen">
|
||
<code class=
|
||
"computeroutput">[Requesting program interpreter: /lib/ld-linux.so.2]</code>
|
||
</pre>
|
||
<p>
|
||
注意 <code class="filename">/lib</code> 现在是我们动态链接库的前缀。
|
||
</p>
|
||
<p>
|
||
现在确保我们已经设置好了启动文件:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log</kbd>
|
||
</pre>
|
||
<p>
|
||
上一条命令的输出应该是:
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="computeroutput">/usr/lib/crt1.o succeeded
|
||
/usr/lib/crti.o succeeded
|
||
/usr/lib/crtn.o succeeded</code>
|
||
</pre>
|
||
<p>
|
||
确保连接器能找到正确的头文件:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">grep -B1 '^ /usr/include' dummy.log</kbd>
|
||
</pre>
|
||
<p>
|
||
这条命令应该返回如下输出:
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="computeroutput">#include <...> search starts here:
|
||
/usr/include</code>
|
||
</pre>
|
||
<p>
|
||
接下来,确认新的链接器已经在使用正确的搜索路径:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'</kbd>
|
||
</pre>
|
||
<p>
|
||
带有 '-linux-gnu' 的参考路径应该被忽略,上条命令的输出应该是:
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="computeroutput">SEARCH_DIR("/usr/lib")
|
||
SEARCH_DIR("/lib");</code>
|
||
</pre>
|
||
<p>
|
||
然后我们要确定我们使用的是正确的 libc:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">grep "/lib.*/libc.so.6 " dummy.log</kbd>
|
||
</pre>
|
||
<p>
|
||
上条命令的输出应该是(允许在64位主机上有lib64):
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="computeroutput">attempt to open /lib/libc.so.6 succeeded</code>
|
||
</pre>
|
||
<p>
|
||
最后,确保 GCC 使用的是正确的动态链接器:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">grep found dummy.log</kbd>
|
||
</pre>
|
||
<p>
|
||
上条命令的结果应该是(允许不同的平台上链接器名字不同,64为主机上有 lib64 目录):
|
||
</p>
|
||
<pre class="screen">
|
||
<code class="computeroutput">found ld-linux.so.2 at /lib/ld-linux.so.2</code>
|
||
</pre>
|
||
<p>
|
||
如果显示的结果不一样或者根本没有显示,那就出了大问题。
|
||
检查回溯之前的步骤,找到出错的地方并改正。最有可能的原因是参数文件的调整出了问题。
|
||
在进行下一步之前所有的问题都要解决。
|
||
</p>
|
||
<p>
|
||
一旦所有的事情都正常了,清除测试文件:
|
||
</p>
|
||
<pre class="userinput">
|
||
<kbd class="command">rm -v dummy.c a.out dummy.log</kbd>
|
||
</pre>
|
||
</div>
|
||
<div class="navfooter">
|
||
<ul>
|
||
<li class="prev">
|
||
<a accesskey="p" href="glibc.html" title="Glibc-2.21">上一页</a>
|
||
<p>
|
||
Glibc-2.21
|
||
</p>
|
||
</li>
|
||
<li class="next">
|
||
<a accesskey="n" href="zlib.html" title="Zlib-1.2.8">下一页</a>
|
||
<p>
|
||
Zlib-1.2.8
|
||
</p>
|
||
</li>
|
||
<li class="up">
|
||
<a accesskey="u" href="chapter06.html" title=
|
||
"Chapter 6. Installing Basic System Software">返回</a>
|
||
</li>
|
||
<li class="home">
|
||
<a accesskey="h" href="../index.html" title=
|
||
"Linux From Scratch - Version 7.7-systemd">主页</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</body>
|
||
</html>
|