⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gcc-pass2.html

📁 Linux From Scratch的中文指导,学习LINUX很有用
💻 HTML
字号:
<!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=gb2312" />
    <title>
      5.11.&nbsp;GCC-3.4.3 - Pass 2
    </title>
    <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.68.1" />
    <link rel="stylesheet" href="../stylesheets/lfs-print.css" type="text/css" media="print" />
  </head>
  <body id="lfs" class="6.1">
    <div class="navheader">
      <div class="headertitles">
        <h4>
          Linux From Scratch - Version 6.1
        </h4>
        <h3>
          Chapter&nbsp;5.&nbsp;构建临时编译环境
        </h3>
      </div>
      <ul class="headerlinks">
        <li class="prev">
          <a accesskey="p" href="dejagnu.html" title="DejaGNU-1.4.4">后退</a>
          <p>
            DejaGNU-1.4.4
          </p>
        </li>
        <li class="next">
          <a accesskey="n" href="binutils-pass2.html" title="Binutils-2.15.94.0.2.2 - Pass 2">前进</a>
          <p>
            Binutils-2.15.94.0.2.2 - Pass 2
          </p>
        </li>
        <li class="up">
          <a accesskey="u" href="chapter05.html" title="Chapter&nbsp;5.&nbsp;构建临时编译环境">上一级</a>.
        </li>
        <li class="home">
          <a accesskey="h" href="../index.html" title="Linux From Scratch - Version 6.1">回首页</a>
        </li>
      </ul>
    </div>
    <div class="wrap" lang="zh_cn" xml:lang="zh_cn">
      <div class="titlepage">
        <h1 class="sect1">
          5.11. GCC-3.4.3 - 第二遍
        </h1>
      </div>
      <div class="package" lang="zh_cn" xml:lang="zh_cn">
        <div class="segmentedlist">
          <div class="seglistitem">
            <div class="seg">
              <strong><span class="segtitle">预计编译时间:</span></strong> <span class="seg">11.0 SBU</span>
            </div>
            <div class="seg">
              <strong><span class="segtitle">所需磁盘空间:</span></strong> <span class="seg">292 MB</span>
            </div>
          </div>
        </div>
        <div class="segmentedlist">
          <div class="seglistitem">
            <div class="seg">
              <strong><span class="segtitle">安装依赖于:</span></strong> <span class="seg">Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed, Texinfo</span>
            </div>
          </div>
        </div>
      </div>
      <div class="installation" lang="zh_cn" xml:lang="zh_cn">
        <div class="titlepage">
          <h2 class="sect2">
            5.11.1. 再次安装 GCC
          </h2>
        </div>
        <p>如果你把这个包缺省的优化参数(包括 <em class="parameter"><tt>-march</tt></em> 和 <em class="parameter"><tt>-mcpu</tt></em> 参数)改变的话,它会有些不正常的表现。因此,如果你定义了任何优化参数的话,比如 <tt class="envar">CFLAGS</tt> 和 <tt class="envar">CXXFLAGS</tt>,我们劝你在编译 GCC 时 unset 或修改它们。</p>
        <p>测试 GCC 和 Binutils 所需的工具:Tcl, Expect, DejaGNU 已经安装好。现在 GCC 和 Binutils 将被重新编译,连接到新的 Glibc 并作适当测试(如果运行这章中的测试的话)。注意,这些测试套件受伪终端(PTY)的影响很大,这些终端是由主系统提供的,通过 <tt class="systemitem">devpts</tt> 文件系统实现。你可以用下面的方法,来测试宿主系统中PTY是否设置正常:
        </p>
        <pre class="userinput"><kbd class="command">expect -c "spawn ls"</kbd></pre>
        <p>如果你得到下面的回答:
        </p>
        <pre class="screen"><tt class="computeroutput">The system has no more ptys. Ask your system administrator to create more.</tt></pre>
        <p>说明主系统的 PTY 没设置好。这种情况下,运行 GCC 和 Binutils 的测试套件就没什么意义了。你需要先解决主系统中的 PTY 设置问题。具体请参见:<a href="http://www.linuxfromscratch.org//lfs/faq.html#no-ptys"><i>http://www.linuxfromscratch.org//lfs/faq.html#no-ptys</i></a>
        </p>
        <p>首先纠正一个问题,并做一些调整:
        </p>
        <pre class="userinput"><kbd class="command">patch -Np1 -i ../gcc-3.4.3-no_fixincludes-1.patch
patch -Np1 -i ../gcc-3.4.3-specs-2.patch</kbd></pre>
        <p>第一个补丁禁止 GCC 中 <span><strong class="command">fixincludes</strong></span> 脚本的运行。前面提到过一些,这里再深入地看看这个脚本的作用。在通常情况下,GCC 的 <span><strong class="command">fixincludes</strong></span> 脚本会扫描你的系统头文件目录,找出需要修正的头文件。它可能会找出宿主系统的 Glibc 头文件需要修正,然后把修正后的文件放到 GCC 专属的头文件目录里。随后,在 <a href="../chapter06/chapter06.html">Chapter 6</a> 里,安装过新的 Glibc 后,GCC 专属的头文件目录将会在宿主的系统头文件目录之前被搜索,结果就是 GCC 使用的头文件是宿主系统的头文件,而不是我们新安装的那个。这可能会造成 Glibc 版本与 LFS 系统不兼容。
        </p>
        <p>第二个补丁修改 GCC 的缺省动态连接器(通常是 <tt class="filename">ld-linux.so.2</tt> )的位置,还把 <tt class="filename">/usr/include</tt> 从 GCC 的头文件搜索路径里删掉。现在安装而不是安装 GCC 之后调整 specs 文件可以保证新的动态连接器在编译 GCC 的时候就用上。也就是说,随后的所有临时程序都会连接到新的 Glibc 上。
        </p>
        <div class="important">
          <div class="admonhead">
            <img alt="[Important]" src="../images/important.png" />
            <h3 class="admontitle">
              重要
            </h3>
          </div>
          <div class="admonbody">
            <p>这两个补丁非常重要,为了成功编译,千万别忘了运用它们
            </p>
          </div>
        </div>
        <p>再为编译创建一个单独目录:
        </p>
        <pre class="userinput"><kbd class="command">mkdir ../gcc-build
cd ../gcc-build</kbd></pre>
        <p>在开始编译前,别忘了 unset 任何优化相关的环境变量。
        </p>
        <p>准备编译 GCC:
        </p>
        <pre class="userinput"><kbd class="command">../gcc-3.4.3/configure --prefix=/tools \
    --libexecdir=/tools/lib --with-local-prefix=/tools \
    --enable-clocale=gnu --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit \
    --enable-languages=c,c++ --disable-libstdcxx-pch</kbd></pre>
        <p>新配置选项的含义:
        </p>
        <div class="variablelist">
          <dl>
            <dt>
              <span class="term"><em class="parameter"><tt>--enable-clocale=gnu</tt></em></span>
            </dt>
            <dd>
              <p>本参数确保C++库在任何情况下都使用正确的 locale 模块。如果配置脚本查找到 <span class="emphasis"><em>de_DE</em></span> 这个 locale,它就会使用正确的 gnu 模块。然而,如果没有安装 <span class="emphasis"><em>de_DE</em></span>,就有可能创建出应用程序二进制接口(ABI)不兼容的C++库文件,这是因为选择了错误的 generic locale 模块。
              </p>
            </dd>
            <dt>
              <span class="term"><em class="parameter"><tt>--enable-threads=posix</tt></em></span>
            </dt>
            <dd>
              <p>使 C++ 异常能处理多线程代码。
              </p>
            </dd>
            <dt>
              <span class="term"><em class="parameter"><tt>--enable-__cxa_atexit</tt></em></span>
            </dt>
            <dd>
              <p>用 <span class="emphasis"><em>__cxa_atexit</em></span> 代替 <span class="emphasis"><em>atexit</em></span> 来登记 C++ 对象的本地静态和全局析构函数,这是为了完全符合标准对析构函数的处理规定。它还会影响到 C++  ABI,因此生成的 C++ 共享库在其他的 Linux 发行版上也能使用。
              </p>
            </dd>
            <dt>
              <span class="term"><em class="parameter"><tt>--enable-languages=c,c++</tt></em></span>
            </dt>
            <dd>
              <p>本参数编译 C 和 C++ 语言的编译器。
              </p>
            </dd>
            <dt>
              <span class="term"><em class="parameter"><tt>--disable-libstdcxx-pch</tt></em></span>
            </dt>
            <dd>
              <p>不为 <tt class="filename">libstdc++</tt> 编译预编译头(PCH),它占用了很大空间,但是我们用不到它。
              </p>
            </dd>
          </dl>
        </div>
        <p>编译软件包:
        </p>
        <pre class="userinput"><kbd class="command">make</kbd></pre>
        <p>现在没必要用 <em class="parameter"><tt>bootstrap</tt></em> 作为 make 的目标,因为这里 GCC 是用相同版本的 GCC 来编译的,其实连源码都一模一样,就是在第一遍的时候安装的那个。
        </p>
        <p>现在编译完成了,早先我们谈到过,本章中的临时工具的测试程序并不是必须运行的,如果您要运行 GCC 的测试程序,请输入下面的命令:
        </p>
        <pre class="userinput"><kbd class="command">make -k check</kbd></pre>
        <p>
          <em class="parameter"><tt>-k</tt></em> 参数是让测试套件即使遇到错误,也继续运行,直到完成。GCC 的测试套件非常全面,所以基本上总是会出一些错的。要查看测试结果,用下面的命令:
        </p>
        <pre class="userinput"><kbd class="command">../gcc-3.4.3/contrib/test_summary</kbd></pre>
        <p>通过输出管道 <strong class="userinput"><tt>grep -A7 Summ</tt></strong> 可只输出摘要。
        </p>
        <p>可以把输出结果与这里的结果进行比较:<a href="http://www.linuxfromscratch.org/lfs/build-logs/6.1/"><i>http://www.linuxfromscratch.org/lfs/build-logs/6.1/</i></a>
        </p>
        <p>一些意外的失败总可以被忽略。GCC  的开发者通常知道这些问题,但还没有解决。只要你的测试结果和上面的URL里的结果没有太大出入,那么可以继续编译。
        </p>
        <p>
          安装软件包:
        </p>
        <pre class="userinput"><kbd class="command">make install</kbd></pre>
        <div class="note">
          <div class="admonhead">
            <img alt="[Note]" src="../images/note.png" />
            <h3 class="admontitle">
              注意
            </h3>
          </div>
          <div class="admonbody">
            <p>这里强烈建议再执行一次我们前面进行过的“合理性检查”。参见<a href="adjusting.html" title="5.7.&nbsp;Adjusting the Toolchain">Section 5.7, &ldquo;调整工具链&rdquo;</a>,并重复测试 。如果结果是错误的,你很可能是忘了运用上面的 Specs 补丁。
            </p>
          </div>
        </div>
      </div>
      <div class="content" lang="zh_cn" xml:lang="zh_cn">
        <p>这个包的详细内容请参见: <a href="../chapter06/gcc.html#contents-gcc" title="6.14.2.&nbsp;Contents of GCC">Section&nbsp;6.14.2, &ldquo;Contents
          of GCC.&rdquo;</a>
        </p>
      </div>
    </div>
    <div class="navfooter">
      <ul>
        <li class="prev">
          <a accesskey="p" href="dejagnu.html" title="DejaGNU-1.4.4">后退</a>
          <p>
            DejaGNU-1.4.4
          </p>
        </li>
        <li class="next">
          <a accesskey="n" href="binutils-pass2.html" title="Binutils-2.15.94.0.2.2 - Pass 2">前进</a>
          <p>
            Binutils-2.15.94.0.2.2 - Pass 2
          </p>
        </li>
        <li class="up">
          <a accesskey="u" href="chapter05.html" title="Chapter&nbsp;5.&nbsp;构建临时编译环境">上一级</a>.
        </li>
        <li class="home">
          <a accesskey="h" href="../index.html" title="Linux From Scratch - Version 6.1">回首页</a>.
        </li>
      </ul>
    </div>
  </body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -