<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-tools-binutils-pass2" role="wrap">
  <?dbhtml filename="binutils-pass2.html"?>

  <sect1info condition="script">
    <productname>binutils</productname>
    <productnumber>&binutils-version;</productnumber>
    <address>&binutils-url;</address>
  </sect1info>

  <title>Binutils-&binutils-version; - 第二遍</title>

  <indexterm zone="ch-tools-binutils-pass2">
    <primary sortas="a-Binutils">Binutils</primary>
    <secondary>tools, pass 2</secondary>
  </indexterm>

  <sect2 role="package">
    <title/>

    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
    href="../chapter06/binutils.xml"
    xpointer="xpointer(/sect1/sect2[1]/para[1])"/>

    <segmentedlist>
      <segtitle>&buildtime;</segtitle>
      <segtitle>&diskspace;</segtitle>

      <seglistitem>
        <seg>&binutils-ch5p2-sbu;</seg>
        <seg>&binutils-ch5p2-du;</seg>
      </seglistitem>
    </segmentedlist>

  </sect2>

  <sect2 role="installation">
    <title>安装 Binutils</title>

    <para>再一次地，创建一个单独的构建目录：</para>

<screen><userinput remap="pre">mkdir -v build
cd       build</userinput></screen>

    <para>准备安装 Binutils：</para>

<screen><userinput remap="configure">CC=$LFS_TGT-gcc                \
AR=$LFS_TGT-ar                 \
RANLIB=$LFS_TGT-ranlib         \
../configure                   \
    --prefix=/tools            \
    --disable-nls              \
    --disable-werror           \
    --with-lib-path=/tools/lib \
    --with-sysroot</userinput></screen>

    <variablelist>
      <title>配置选项的含义：</title>

      <varlistentry>
        <term><parameter>CC=$LFS_TGT-gcc AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib</parameter></term>
        <listitem>
          <!--para>Because this is really a native build of Binutils, setting these
          variables ensures that the build system uses the cross-compiler and
          associated tools instead of the ones on the host system.</para-->
	      <para>这次编译 Binutils 是本地编译而不是交叉编译，
			  设置这些变量可以强制构建系统使用交叉编译器和相关工具，
			  而不是宿主系统的编译器和工具。</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--with-lib-path=/tools/lib</parameter></term>
        <listitem>
          <!--para>This tells the configure script to specify the library
          search path during the compilation of Binutils, resulting in
          <filename class="directory">/tools/lib</filename> being passed
          to the linker. This prevents the linker from searching through
          library directories on the host.</para-->
	      <para>这个选项使得配置脚本在编译 Binutils 时指定库文件搜索目录，
			  将 <filename class="directory">/tools/lib</filename>
			  传递给链接器。这保证链接器不会搜索宿主系统的库文件目录。
		  </para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--with-sysroot</parameter></term>
        <listitem>
          <!--para>The sysroot feature enables the linker to find shared objects
          which are required by other shared objects explicitly included on the
          linker's command line. Without this, some packages may not build
          successfully on some hosts.</para-->
	      <para>在链接时，某些共享对象可能要求其他共享对象，sysroot
			  特性允许链接器查找它们。如果不启用它，在某些宿主环境中，
			  一些软件包无法成功构建。</para>
		  <note><title>译注</title>
			  <para>这个选项看上去很奇怪，而且解释不够清晰。
			  	  译者查资料得知，
			  	  从 Binutils 2.17 起，为保证和动态链接器的一致性，
			  	  <command>ld</command>在搜索 DT_NEEDED
			  	  要求的共享对象时，先搜索
				  <filename>/etc/ld.so.conf</filename> 指定的目录，
				  再搜索配置时指定的默认目录。如果不启用 sysroot 功能，
				  且宿主系统使用了 <filename>/etc/ld.so.conf</filename>，
				  那么宿主环境中的共享对象会污染工具链，
				  进而导致一系列严重问题。
				  如果您不想使用这个看上去奇怪的选项，可以执行
				  <userinput>touch /tools/etc/ld.so.conf</userinput>
				  创建一个空的 <filename>ld.so.conf</filename> 文件，
				  覆盖宿主系统的设置。参阅
				  <ulink url="http://lists.linuxfromscratch.org/pipermail/lfs-dev/2012-December/067457.html">lfs-dev 列表中的讨论</ulink>，以及
				  <ulink url="https://sourceware.org/bugzilla/show_bug.cgi?id=2290">ld/2290</ulink>。
				  另外 <filename>ld(1)</filename>
				  中关于这个搜索顺序的描述尚未更新。
			  </para>
		  </note>
        </listitem>
      </varlistentry>

    </variablelist>

    <para>编译该软件包：</para>

<screen><userinput remap="make">make</userinput></screen>

    <para>安装该软件包：</para>

<screen><userinput remap="install">make install</userinput></screen>

    <!--para>Now prepare the linker for the <quote>Re-adjusting</quote> phase in
    the next chapter:</para-->
<para>现在，为下一章的 <quote>重新调整</quote> 阶段准备链接器：</para>

<screen><userinput remap="adjust">make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin</userinput></screen>

    <variablelist>
      <title>make 命令参数的含义：</title>

      <varlistentry>
        <term><parameter>-C ld clean</parameter></term>
        <listitem>
          <!--para>This tells the make program to remove all compiled
          files in the <filename class="directory">ld</filename>
          subdirectory.</para-->
	      <para>该选项告诉 make 程序移除
			  <filename class="directory">ld</filename>
			  子目录中所有编译得到的文件。</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>-C ld LIB_PATH=/usr/lib:/lib</parameter></term>
        <listitem>
          <!--para>This option rebuilds everything in the <filename
          class="directory">ld</filename> subdirectory. Specifying the
          <envar>LIB_PATH</envar> Makefile variable on the command line
          allows us to override the default value of the temporary tools
          and point it to the proper final path. The value of this variable
          specifies the linker's default library search path. This
          preparation is used in the next chapter.</para-->
          <para>该选项重新构建 <filename class="directory">ld</filename>
			  子目录中的一切。在命令行指定 <envar>LIB_PATH</envar>
			  Makefile 变量，即可覆盖临时工具的默认值，
			  并将其指向正确的最终路径。
			  该变量的值指定链接器的默认库文件搜索路径，
			  这个准备好的链接器将在下一章使用。</para>
        </listitem>
      </varlistentry>

    </variablelist>

  </sect2>

  <sect2 role="content">
    <title/>

    <para>该软件包的更多信息可以在
    <xref linkend="contents-binutils"/> 中找到。</para>

  </sect2>

</sect1>
