1
0

gcc-pass2.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  3. "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  4. <!ENTITY % general-entities SYSTEM "../general.ent">
  5. %general-entities;
  6. ]>
  7. <sect1 id="ch-tools-gcc-pass2" role="wrap">
  8. <?dbhtml filename="gcc-pass2.html"?>
  9. <sect1info condition="script">
  10. <productname>gcc</productname>
  11. <productnumber>&gcc-version;</productnumber>
  12. <address>&gcc-url;</address>
  13. </sect1info>
  14. <title>GCC-&gcc-version; - 第二遍</title>
  15. <indexterm zone="ch-tools-gcc-pass2">
  16. <primary sortas="a-GCC">GCC</primary>
  17. <secondary>tools, pass 2</secondary>
  18. </indexterm>
  19. <sect2 role="package">
  20. <title/>
  21. <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
  22. href="../chapter06/gcc.xml"
  23. xpointer="xpointer(/sect1/sect2[1]/para[1])"/>
  24. <segmentedlist>
  25. <segtitle>&buildtime;</segtitle>
  26. <segtitle>&diskspace;</segtitle>
  27. <seglistitem>
  28. <seg>&gcc-ch5p2-sbu;</seg>
  29. <seg>&gcc-ch5p2-du;</seg>
  30. </seglistitem>
  31. </segmentedlist>
  32. </sect2>
  33. <sect2 role="installation">
  34. <title>安装 GCC</title>
  35. <!--para>Our first build of GCC has installed a couple of internal system
  36. headers. Normally one of them, <filename>limits.h</filename>, will in turn
  37. include the corresponding system <filename>limits.h</filename> header, in
  38. this case, <filename>/tools/include/limits.h</filename>. However, at the
  39. time of the first build of gcc <filename>/tools/include/limits.h</filename>
  40. did not exist, so the internal header that GCC installed is a partial,
  41. self-contained file and does not include the extended features of the
  42. system header. This was adequate for building the temporary libc, but this
  43. build of GCC now requires the full internal header. Create a full version
  44. of the internal header using a command that is identical to what the GCC
  45. build system does in normal circumstances:</para-->
  46. <para>第一次构建的 GCC 安装了若干内部系统头文件,其中有一个
  47. <filename>limits.h</filename>。一般来说,
  48. 它应该包含对应的系统头文件,对于我们的特例而言,就是
  49. <filename>/tools/include/limits.h</filename>。
  50. 然而,在第一次构建 GCC 的时候,它还不存在,
  51. 因此 GCC 安装的内部头文件是一个不完整的、自给自足的文件,
  52. 不包含系统头文件提供的扩展特性。这对于构建临时的 libc 已经足够了,
  53. 但构建 GCC 需要完整的内部头文件。
  54. 使用以下命令创建一个完整版本的内部头文件,
  55. 该命令与 GCC 构建系统在一般情况下生成头文件的命令一模一样:</para>
  56. <screen><userinput remap="pre">cat gcc/limitx.h gcc/glimits.h gcc/limity.h &gt; \
  57. `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h</userinput></screen>
  58. <!--
  59. <para>For x86 machines, the limited number of registers is a bottleneck
  60. for the system. Free one up by not using a frame pointer that is not
  61. needed:</para>
  62. <screen><userinput remap="pre">case `uname -m` in
  63. i?86) sed -i 's/^T_CFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in ;;
  64. esac</userinput></screen>
  65. -->
  66. <!--para>Once again, change the location of GCC's default dynamic linker to
  67. use the one installed in <filename
  68. class="directory">/tools</filename>.</para-->
  69. <para>再一次地,改变 GCC 的默认动态链接器,使其使用
  70. <filename class="directory">/tools</filename> 中的动态链接器:
  71. </para>
  72. <screen><userinput remap="pre">for file in gcc/config/{linux,i386/linux{,64}}.h
  73. do
  74. cp -uv $file{,.orig}
  75. sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&amp;@g' \
  76. -e 's@/usr@/tools@g' $file.orig &gt; $file
  77. echo '
  78. #undef STANDARD_STARTFILE_PREFIX_1
  79. #undef STANDARD_STARTFILE_PREFIX_2
  80. #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
  81. #define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
  82. touch $file.orig
  83. done</userinput></screen>
  84. <!--para>If building on x86_64, change the default directory name for 64-bit
  85. libraries to <quote>lib</quote>:</para-->
  86. <para>如果是在 x86_64 上构建,修改 64 位库文件的默认目录名为
  87. <quote>lib</quote>:</para>
  88. <screen><userinput remap="pre">case $(uname -m) in
  89. x86_64)
  90. sed -e '/m64=/s/lib64/lib/' \
  91. -i.orig gcc/config/i386/t-linux64
  92. ;;
  93. esac</userinput></screen>
  94. <!--para>As in the first build of GCC it requires the GMP, MPFR and MPC
  95. packages. Unpack the tarballs and move them into the required directory
  96. names:</para-->
  97. <para>就像第一次构建 GCC 时一样,它需要 GMP、MPFR 和 MPC 三个包。
  98. 解压它们的源码包,并将它们移动到 GCC 要求的目录名:</para>
  99. <screen><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
  100. mv -v mpfr-&mpfr-version; mpfr
  101. tar -xf ../gmp-&gmp-version;.tar.xz
  102. mv -v gmp-&gmp-version; gmp
  103. tar -xf ../mpc-&mpc-version;.tar.gz
  104. mv -v mpc-&mpc-version; mpc</userinput></screen>
  105. <!--
  106. <para>As in the first build of GCC, fix a problem identified upstream:</para>
  107. <screen><userinput remap="pre">sed -i 's/if \((code.*))\)/if (\1 \&amp;\&amp; \!DEBUG_INSN_P (insn))/' gcc/sched-deps.c</userinput></screen>
  108. -->
  109. <para>再次创建一个独立的构建目录:</para>
  110. <screen><userinput remap="pre">mkdir -v build
  111. cd build</userinput></screen>
  112. <!--para>Before starting to build GCC, remember to unset any environment
  113. variables that override the default optimization flags.</para-->
  114. <para>在开始构建 GCC 前,记得清除所有覆盖默认优化开关的环境变量。
  115. </para>
  116. <para>现在准备编译 GCC:</para>
  117. <screen><userinput remap="configure">CC=$LFS_TGT-gcc \
  118. CXX=$LFS_TGT-g++ \
  119. AR=$LFS_TGT-ar \
  120. RANLIB=$LFS_TGT-ranlib \
  121. ../configure \
  122. --prefix=/tools \
  123. --with-local-prefix=/tools \
  124. --with-native-system-header-dir=/tools/include \
  125. --enable-languages=c,c++ \
  126. --disable-libstdcxx-pch \
  127. --disable-multilib \
  128. --disable-bootstrap \
  129. --disable-libgomp</userinput></screen>
  130. <variablelist>
  131. <title>配置选项的含义:</title>
  132. <varlistentry>
  133. <term><parameter>--enable-languages=c,c++</parameter></term>
  134. <listitem>
  135. <!--para>This option ensures that both the C and C++ compilers are
  136. built.</para-->
  137. <para>该选项保证只构建 C 和 C++ 编译器。</para>
  138. </listitem>
  139. </varlistentry>
  140. <varlistentry>
  141. <term><parameter>--disable-libstdcxx-pch</parameter></term>
  142. <listitem>
  143. <!--para>Do not build the pre-compiled header (PCH) for
  144. <filename class="libraryfile">libstdc++</filename>. It takes up a
  145. lot of space, and we have no use for it.</para-->
  146. <para>不构建 <filename class="libraryfile">libstdc++</filename>
  147. 的预编译头文件,它占据大量空间,而且我们用不到它。</para>
  148. </listitem>
  149. </varlistentry>
  150. <varlistentry>
  151. <term><parameter>--disable-bootstrap</parameter></term>
  152. <listitem>
  153. <!--para>For native builds of GCC, the default is to do a "bootstrap"
  154. build. This does not just compile GCC, but compiles it several times.
  155. It uses the programs compiled in a first round to compile itself a
  156. second time, and then again a third time. The second and third
  157. iterations are compared to make sure it can reproduce itself
  158. flawlessly. This also implies that it was compiled correctly.
  159. However, the LFS build method should provide a solid compiler
  160. without the need to bootstrap each time.</para-->
  161. <para>对于 GCC 的本地构建,默认会进行自举 (bootstrap) 构建。
  162. 这种构建方式不仅编译 GCC ,还会将它编译多次。
  163. 它使用第一轮编译得到的程序,将自身再编译一次,
  164. 然后再用第二轮编译得到的程序将自身编译第三次。
  165. 第二次和第三次的结果被比较,
  166. 从而确认 GCC 可以没有缺陷地重新编译它自己,
  167. 这就表明编译过程准确无误。然而, LFS
  168. 的构建方法能够提供一个坚实的编译器,而不需要每次都进行自举。
  169. </para>
  170. </listitem>
  171. </varlistentry>
  172. </variablelist>
  173. <para>编译该软件包:</para>
  174. <screen><userinput remap="make">make</userinput></screen>
  175. <para>安装该软件包:</para>
  176. <screen><userinput remap="install">make install</userinput></screen>
  177. <!--para>As a finishing touch, create a symlink. Many programs and scripts
  178. run <command>cc</command> instead of <command>gcc</command>, which is
  179. used to keep programs generic and therefore usable on all kinds of UNIX
  180. systems where the GNU C compiler is not always installed. Running
  181. <command>cc</command> leaves the system administrator free to decide
  182. which C compiler to install:</para-->
  183. <para>最后,还需要创建一个符号链接。许多程序和脚本运行
  184. <command>cc</command> 而不是 <command>gcc</command>,
  185. 因为前者能够保证程序的通用性,使它可以在所有 UNIX 系统上使用,
  186. 无论是否安装了 GNU C 编译器。运行 <command>cc</command>
  187. 可以将安装哪种 C 编译器的选择权留给系统管理员。</para>
  188. <screen><userinput remap="install">ln -sv gcc /tools/bin/cc</userinput></screen>
  189. <caution>
  190. <!--para>At this point, it is imperative to stop and ensure that the basic
  191. functions (compiling and linking) of the new toolchain are working as
  192. expected. To perform a sanity check, run the following commands:</para-->
  193. <para>在此时,很有必要暂停构建过程,确认新工具链的基本功能
  194. (编译和链接)能够如同我们期望的那样工作。
  195. 执行以下命令,进行完整性检查:</para>
  196. <screen><userinput>echo 'int main(){}' &gt; dummy.c
  197. cc dummy.c
  198. readelf -l a.out | grep ': /tools'</userinput></screen>
  199. <!--para>If everything is working correctly, there should be no errors,
  200. and the output of the last command will be of the form:</para-->
  201. <para>如果一切正常,这些命令应该不产生错误,
  202. 且最后一行命令的输出格式应该和下面相同:</para>
  203. <screen><computeroutput>[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]</computeroutput></screen>
  204. <!--para>Note that <filename class="directory">/tools/lib</filename> wiil
  205. be the prefix of the dynamic linker for 32-bit machines.</para-->
  206. <para>注意,在 32 位机器上,动态链接器为
  207. <filename class="directory">/tools/lib/ld-linux-so.2</filename>。
  208. </para>
  209. <!--para>If the output is not shown as above or there was no output at all,
  210. then something is wrong. Investigate and retrace the steps to find out
  211. where the problem is and correct it. This issue must be resolved before
  212. continuing on. First, perform the sanity check again, using
  213. <command>gcc</command> instead of <command>cc</command>. If this works,
  214. then the <filename class="symlink">/tools/bin/cc</filename> symlink is
  215. missing. Install the symlink as per above.
  216. Next, ensure that the <envar>PATH</envar> is correct. This
  217. can be checked by running <command>echo $PATH</command> and verifying that
  218. <filename class="directory">/tools/bin</filename> is at the head of the
  219. list. If the <envar>PATH</envar> is wrong it could mean that you are not
  220. logged in as user <systemitem class="username">lfs</systemitem> or that
  221. something went wrong back in <xref linkend="ch-tools-settingenviron"
  222. role="."/></para-->
  223. <para>如果输出并不像上面展示的那样,或者根本没有输出,
  224. 则表明出现了问题。检查并重新跟踪各个步骤,找到问题的原因并纠正它。
  225. 这个问题在继续构建前必须解决。首先,使用 <command>gcc</command>
  226. 命令代替 <command>cc</command>,再次进行完整性检查。
  227. 如果这次编译器正常工作,则说明
  228. <filename class="symlink">cc</filename> 符号链接不存在,
  229. 按照之前的说明安装该符号链接。另外,还要确认 <envar>PATH</envar>
  230. 环境变量正确。运行 <command>echo $PATH</command> 命令,
  231. 确认 <filename class="directory">/tools/bin</filename>
  232. 出现在列表的开头。如果 <envar>PATH</envar> 是错的,
  233. 表明你很可能没有以用户
  234. <systemitem class="username">lfs</systemitem> 的身份登录,
  235. 或者在 <xref linkend="ch-tools-settingenviron"/>
  236. 的过程中出现了问题。</para>
  237. <para>在一切检查顺利后,即可删除测试文件:</para>
  238. <screen><userinput>rm -v dummy.c a.out</userinput></screen>
  239. </caution>
  240. </sect2>
  241. <sect2 role="content">
  242. <title/>
  243. <para>关于本软件包的更多信息可以在
  244. <xref linkend="contents-gcc"/> 中找到。</para>
  245. </sect2>
  246. </sect1>