Files
master/chapter06/gcc.html
2015-05-23 18:50:06 +08:00

682 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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.17.&nbsp;GCC-4.9.2
</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>
第六章&nbsp;安装基本的系统软件
</h3>
<ul>
<li class="prev">
<a accesskey="p" href="mpc.html" title="MPC-1.0.2">上一页</a>
<p>
MPC-1.0.2
</p>
</li>
<li class="next">
<a accesskey="n" href="bzip2.html" title="Bzip2-1.0.6">下一页</a>
<p>
Bzip2-1.0.6
</p>
</li>
<li class="up">
<a accesskey="u" href="chapter06.html" title=
"第六章&nbsp;安装基本的系统软件">返回</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="wrap" lang="en" xml:lang="en">
<h1 class="sect1">
<a id="ch-system-gcc" name="ch-system-gcc"></a>6.17. GCC-4.9.2
</h1>
<div class="package" lang="en" xml:lang="en">
<p>
GCC 软件包包括 GNU 编译器集,其中有 C 和 C++ 的编译器。
</p>
<div class="segmentedlist">
<div class="seglistitem">
<div class="seg">
<strong class="segtitle">大概编译时间:</strong>
<span class="segbody">63 SBU (包括测试)</span>
</div>
<div class="seg">
<strong class="segtitle">需要磁盘空间:</strong>
<span class="segbody">2.9 GB</span>
</div>
</div>
</div>
</div>
<div class="installation" lang="en" xml:lang="en">
<h2 class="sect2">
6.17.1. 安装 GCC
</h2>
<p>
GCC 指南建议在源代码目录之外一个专用的编译目录中编译 GCC
</p>
<pre class="userinput">
<kbd class="command">mkdir -v ../gcc-build
cd ../gcc-build</kbd>
</pre>
<p>
准备编译 GCC
</p>
<pre class="userinput">
<kbd class="command">SED=sed \
../gcc-4.9.2/configure \
--prefix=/usr \
--enable-languages=c,c++ \
--disable-multilib \
--disable-bootstrap \
--with-system-zlib</kbd>
</pre>
<p>
注意对于其它语言,现在还有一些前提条件没有准备好。可以查看 <a class="ulink" href=
"http://www.linuxfromscratch.org/blfs/view/systemd/general/gcc.html">
BLFS Book</a> 了解如何编译 GCC 支持的所有语言的指令。
</p>
<div class="variablelist">
<p class="title">
<strong>新配置选项的含义:</strong>
</p>
<dl class="variablelist">
<dt>
<span class="term"><code class="envar">SED=sed</code></span>
</dt>
<dd>
<p>
设置环境变量防止到 /tools/bin/sed 的硬编码路径。
</p>
</dd>
<dt>
<span class="term"><em class=
"parameter"><code>--with-system-zlib</code></em></span>
</dt>
<dd>
<p>
这个选项告诉 GCC 链接系统安装的 Zlib 库,而不是它内部自带的库。
</p>
</dd>
</dl>
</div>
<p>
编译软件包:
</p>
<pre class="userinput">
<kbd class="command">make</kbd>
</pre>
<div class="admon important">
<img alt="[Important]" src="../images/important.png" />
<h3>
重要
</h3>
<p>
本章节中 GCC 的测试套件至关重要,任何情况下都不能跳过。
</p>
</div>
<p>
GCC 测试套件中一个测试集的会用尽栈空间,因此运行测试之前要增加栈大小:
</p>
<pre class="userinput">
<kbd class="command">ulimit -s 32768</kbd>
</pre>
<p>
查看结果,但不要因为出现错误就停下来:
</p>
<pre class="userinput">
<kbd class="command">make -k check</kbd>
</pre>
<p>
要查看测试套件结果的概要,运行:
</p>
<pre class="userinput">
<kbd class="command">../gcc-4.9.2/contrib/test_summary</kbd>
</pre>
<p>
如果只是查看概要,可以用 <strong class=
"userinput"><code>grep -A7 Summ</code></strong> 通过管道输出。
</p>
<p>
结果可以和 <a class="ulink"
href="http://www.linuxfromscratch.org/lfs/build-logs/7.7-systemd/">http://www.linuxfromscratch.org/lfs/build-logs/7.7-systemd/</a>
以及 <a class="ulink" href=
"http://gcc.gnu.org/ml/gcc-testresults/">http://gcc.gnu.org/ml/gcc-testresults/</a> 上的相比较。
</p>
<p>
一些意料之外的错误总是难以避免。GCC 开发者通常意识到了这些问题,但还没有解决。除非测试结果和上面 URL 中的相差很大,不然就可以安全继续。
</p>
<p>
安装软件包:
</p>
<pre class="userinput">
<kbd class="command">make install</kbd>
</pre>
<p>
一些软件包希望 GCC 安装在 <code class="filename">/lib</code> 目录。为了支持那些软件包,可以建立一个符号链接:
</p>
<pre class="userinput">
<kbd class="command">ln -sv ../usr/bin/cpp /lib</kbd>
</pre>
<p>
很多软件包用命令 <span class=
"command"><strong>cc</strong></span> 调用 C 编译器。为了满足这些软件包,创建一个符号链接:
</p>
<pre class="userinput">
<kbd class="command">ln -sv gcc /usr/bin/cc</kbd>
</pre>
<p>
增加一个兼容符号链接启用编译程序时进行链接时间优化(Link Time Optimization)
</p>
<pre class="userinput">
<kbd class="command">install -v -dm755 /usr/lib/bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/4.9.2/liblto_plugin.so /usr/lib/bfd-plugins/</kbd>
</pre>
<p>
现在我们最终的工具栏已经准备就绪了,再一次确认编译和链接都能像预期那样正常工作很重要。我们通过做和前面章节做过的相同的完整性检查做到这点:
</p>
<pre class="userinput">
<kbd class="command">echo 'main(){}' &gt; dummy.c
cc dummy.c -v -Wl,--verbose &amp;&gt; 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>
现在确认我们设置了正确的启动文件:
</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/gcc/i686-pc-linux-gnu/4.9.2/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.9.2/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.9.2/../../../crtn.o succeeded</code>
</pre>
<p>
取决于你机器的架构,上面的结果可能有稍微不同,差异通常是 <code class="filename">/usr/lib/gcc</code> 后目录的名称。如果你的是 64 位系统,你也许能看到后面有个 <code class=
"filename">lib64</code> 的目录名字。这里重要的一点是 <span class=
"command"><strong>gcc</strong></span> 能在 <code class=
"filename">/usr/lib</code> 目录下找到所有的三个 <code class="filename">crt*.o</code> 文件。
</p>
<p>
验证编译器能搜索正确的头文件:
</p>
<pre class="userinput">
<kbd class="command">grep -B4 '^ /usr/include' dummy.log</kbd>
</pre>
<p>
这个命令应该返回下面的的输出:
</p>
<pre class="screen">
<code class="computeroutput">#include &lt;...&gt; search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.9.2/include
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.9.2/include-fixed
/usr/include</code>
</pre>
<p>
同意,注意你的目标三元组后面的目录名称可能和上面的不同,取决于你的架构。
</p>
<div class="admon note">
<img alt="[Note]" src="../images/note.png" />
<h3>
注意
</h3>
<p>
在版本 4.3.0 中GCC 无条件安装 <code class="filename">limits.h</code> 文件到私有 <code class="filename">include-fixed</code> 目录,要求这个目录已经存在。
</p>
</div>
<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/i686-pc-linux-gnu/lib32")
SEARCH_DIR("/usr/local/lib32")
SEARCH_DIR("/lib32")
SEARCH_DIR("/usr/lib32")
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");</code>
</pre>
<p>
64 位的系统可能有一些不同的目录。例如,下面是一台 x86_64 机器的输出:
</p>
<pre class="screen">
<code class=
"computeroutput">SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/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>
<p>
最后,移动位置错误文件:
</p>
<pre class="userinput">
<kbd class="command">mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib</kbd>
</pre>
</div>
<div class="content" lang="en" xml:lang="en">
<h2 class="sect2">
<a id="contents-gcc" name="contents-gcc"></a>6.17.2. GCC 的内容
</h2>
<div class="segmentedlist">
<div class="seglistitem">
<div class="seg">
<strong class="segtitle">安装的程序:</strong>
<span class="segbody">c++, cc (link to gcc), cpp, g++, gcc,
gcc-ar, gcc-nm, gcc-ranlib, and gcov</span>
</div>
<div class="seg">
<strong class="segtitle">安装的库:</strong>
<span class="segbody">libasan.{a,so}, libatomic.{a,so},
libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a, libgomp.{a,so},
libiberty.a, libitm.{a,so}, liblto_plugin.so,
libquadmath.{a,so}, libssp.{a,so}, libssp_nonshared.a,
libstdc++.{a,so}, libsupc++.a, and libtsan.{a,so}</span>
</div>
<div class="seg">
<strong class="segtitle">安装目录:</strong>
<span class="segbody">/usr/include/c++, /usr/lib/gcc,
/usr/libexec/gcc, and /usr/share/gcc-4.9.2</span>
</div>
</div>
</div>
<div class="variablelist">
<h3>
简要介绍
</h3>
<table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top" />
<col />
</colgroup>
<tbody>
<tr>
<td>
<p>
<a id="c" name="c"></a><span class="term"><span class=
"command"><strong>c++</strong></span></span>
</p>
</td>
<td>
<p>
C++ 编译器
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="cc" name="cc"></a><span class="term"><span class=
"command"><strong>cc</strong></span></span>
</p>
</td>
<td>
<p>
C 编译器
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="cpp" name="cpp"></a><span class=
"term"><span class="command"><strong>cpp</strong></span></span>
</p>
</td>
<td>
<p>
C 预处理器;编译器用来扩展源文件中 #include、#define 以及相似的语句
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="g" name="g"></a><span class="term"><span class=
"command"><strong>g++</strong></span></span>
</p>
</td>
<td>
<p>
C++ 编译器
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="gcc" name="gcc"></a><span class=
"term"><span class="command"><strong>gcc</strong></span></span>
</p>
</td>
<td>
<p>
C 编译器
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="gcc-ar" name="gcc-ar"></a><span class=
"term"><span class=
"command"><strong>gcc-ar</strong></span></span>
</p>
</td>
<td>
<p>
增加语句到命令行的 <span class=
"command"><strong>ar</strong></span> 的封装。这个程序只用于添加
"链接时间优化" 在默认编译选择中不起作用
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="gcc-nm" name="gcc-nm"></a><span class=
"term"><span class=
"command"><strong>gcc-nm</strong></span></span>
</p>
</td>
<td>
<p>
增加语句到命令行的 <span class=
"command"><strong>nm</strong></span> 的封装。这个程序只用于添加
"链接时间优化" 在默认编译选择中不起作用
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="gcc-ranlib" name="gcc-ranlib"></a><span class=
"term"><span class=
"command"><strong>gcc-ranlib</strong></span></span>
</p>
</td>
<td>
<p>
增加语句到命令行的 <span class=
"command"><strong>ranlib</strong></span> 的封装。这个程序只用于添加
"链接时间优化" 在默认编译选择中不起作用
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="gcov" name="gcov"></a><span class=
"term"><span class=
"command"><strong>gcov</strong></span></span>
</p>
</td>
<td>
<p>
一个覆盖测试工具;用于分析程序决定在哪里进行优化有最大的效果
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libasan" name="libasan"></a><span class=
"term"><span class=
"command"><strong>libasan</strong></span></span>
</p>
</td>
<td>
<p>
Address Sanitizer(译者注:地址消毒剂,可以查看:<a href="http://en.wikipedia.org/wiki/AddressSanitizer">Wiki</a>) 运行时库。
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libgcc" name="libgcc"></a><span class=
"term"><code class="filename">libgcc</code></span>
</p>
</td>
<td>
<p>
包含用于 <span class=
"command"><strong>gcc</strong></span> 的运行时支持
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libgcov" name="libgcov"></a><span class=
"term"><code class="filename">libgcov</code></span>
</p>
</td>
<td>
<p>
指示 GCC 启用分析是该库会被链接到一个程序中
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libgomp" name="libgomp"></a><span class=
"term"><code class="filename">libgomp</code></span>
</p>
</td>
<td>
<p>
用于 C/C++、Fortran 语言多平台共享内存并行编程的 OpenMP API 的 GNU 实现
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libiberty" name="libiberty"></a><span class=
"term"><code class="filename">libiberty</code></span>
</p>
</td>
<td>
<p>
包含多种 GNU 程序所使用的例程,包括
<span class="command"><strong>getopt</strong></span>,
<span class="command"><strong>obstack</strong></span>,
<span class="command"><strong>strerror</strong></span>,
<span class="command"><strong>strtol</strong></span>, and
<span class="command"><strong>strtoul</strong></span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="liblto_plugin" name=
"liblto_plugin"></a><span class="term"><code class=
"filename">liblto_plugin</code></span>
</p>
</td>
<td>
<p>
GCC 的链接时间优化(LTO)插件,允许在编译单元之间进行优化
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libquadmath" name="libquadmath"></a><span class=
"term"><code class="filename">libquadmath</code></span>
</p>
</td>
<td>
<p>
GCC 四精度数学库 API
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libssp" name="libssp"></a><span class=
"term"><code class="filename">libssp</code></span>
</p>
</td>
<td>
<p>
包含支持 GCC 堆栈溢出保护功能的例程
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libstdc" name="libstdc"></a><span class=
"term"><code class="filename">libstdc++</code></span>
</p>
</td>
<td>
<p>
标准 C++ 库
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libsupc" name="libsupc"></a><span class=
"term"><code class="filename">libsupc++</code></span>
</p>
</td>
<td>
<p>
为 C++ 编程语言提供支持例程
</p>
</td>
</tr>
<tr>
<td>
<p>
<a id="libtsan" name="libtsan"></a><span class=
"term"><code class="filename">libtsan</code></span>
</p>
</td>
<td>
<p>
Thread Sanitizer 运行时库
</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="navfooter">
<div class="book">
<div class="titlepage">
<div class="author">
<span class="firstname">翻译团队:<a href="http://lctt.github.io/" target="_blank">LCTT</a></span>
<span class="surname">译者/校对:<a href="http://github.com/ictlyh" target="_blank">ictlyh</a>,</span>
</div>
</div>
</div>
<ul>
<li class="prev">
<a accesskey="p" href="mpc.html" title="MPC-1.0.2">上一页</a>
<p>
MPC-1.0.2
</p>
</li>
<li class="next">
<a accesskey="n" href="bzip2.html" title="Bzip2-1.0.6">下一页</a>
<p>
Bzip2-1.0.6
</p>
</li>
<li class="up">
<a accesskey="u" href="chapter06.html" title=
"第六章&nbsp;安装基本的系统软件">返回</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>