OSDN Git Service

update to lfsbook 6.8.ja
[linuxjf/JF.git] / docs / LFS-BOOK / chapter05 / gcc-pass2.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml">
4   <head>
5     <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
6     <title>
7       5.10. GCC-4.5.2 - 2回め
8     </title>
9     <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
10     <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
11     <link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
12     "text/css" media="print" />
13   </head>
14   <body class="lfs" id="lfs-6.8">
15     <div class="navheader">
16       <h4>
17         Linux From Scratch - Version 6.8
18       </h4>
19       <h3>
20         第5章 一時的環境の構築
21       </h3>
22       <ul>
23         <li class="prev">
24           <a accesskey="p" href="binutils-pass2.html" title=
25           "Binutils-2.21 - 2回め">前のページ</a>
26           <p>
27             Binutils-2.21 - 2回め
28           </p>
29         </li>
30         <li class="next">
31           <a accesskey="n" href="tcl.html" title="Tcl-8.5.9">次のページ</a>
32           <p>
33             Tcl-8.5.9
34           </p>
35         </li>
36         <li class="up">
37           <a accesskey="u" href="chapter05.html" title=
38           "第5章 一時的環境の構築">上に戻る</a>
39         </li>
40         <li class="home">
41           <a accesskey="h" href="../index.html" title=
42           "Linux From Scratch - Version 6.8">ホーム</a>
43         </li>
44       </ul>
45     </div>
46     <div class="wrap" lang="ja" xml:lang="ja">
47       <h1 class="sect1">
48         <a id="ch-tools-gcc-pass2" name="ch-tools-gcc-pass2"></a>5.10.
49         GCC-4.5.2 - 2回め
50       </h1>
51       <div class="package" lang="ja" xml:lang="ja">
52         <p>
53           GCC パッケージは C コンパイラや C++ コンパイラなどの GNU コンパイラコレクションを提供します。
54         </p>
55         <div class="segmentedlist">
56           <div class="seglistitem">
57             <div class="seg">
58               <strong class="segtitle">概算ビルド時間:</strong> <span class=
59               "segbody">9.0 SBU</span>
60             </div>
61             <div class="seg">
62               <strong class="segtitle">必要ディスク容量:</strong> <span class=
63               "segbody">1003 MB</span>
64             </div>
65           </div>
66         </div>
67       </div>
68       <div class="installation" lang="ja" xml:lang="ja">
69         <h2 class="sect2">
70           5.10.1. GCC のインストール
71         </h2>
72         <p>
73           バージョン 4.3 以降の GCC を用いてここでのビルド作業を行うと、出来上がるのは再配置可能なコンパイラ (relocated
74           compiler) であり、<em class="parameter"><code>--prefix</code></em>
75           パラメータによって指定されたディレクトリからの起動ファイル (startfiles) の探索が行われないものになります。
76           しかしここで作り出すのは再配置可能なコンパイラではなく、 <code class="filename">/tools</code>
77           ディレクトリにある起動ファイルは <code class="filename">/tools</code>
78           ディレクトリ内のライブラリにリンクされたコンパイラを作り出すことが必要であるため、以下のパッチを適用します。 このパッチは、部分的に
79           GCC の古い機能を復活させるものです。
80         </p>
81         <pre class="userinput">
82 <kbd class="command">patch -Np1 -i ../gcc-4.5.2-startfiles_fix-1.patch</kbd>
83 </pre>
84         <p>
85           通常の利用環境において GCC が提供する <span class=
86           "command"><strong>fixincludes</strong></span>
87           スクリプトは、根本的に不備のあるヘッダファイルを修正する目的で利用されます。 しかしこの時点で GCC-4.5.2 と
88           Glibc-2.13 を既にインストールしており、それぞれのヘッダファイルは修正する必要がないことが分かっています。 つまり
89           <span class="command"><strong>fixincludes</strong></span>
90           スクリプトを利用する必要がありません。 もし実行してしまうと、ホストシステムに既に存在していたヘッダファイルが修正され、それが GCC
91           のプライベートなディレクトリへとインストールされることになり、ビルド環境を壊してしまうことになります。 そこで
92           <span class="command"><strong>fixincludes</strong></span>
93           スクリプトの実行を無効とするために以下を実行します。
94         </p>
95         <pre class="userinput">
96 <kbd class="command">cp -v gcc/Makefile.in{,.orig}
97 sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig &gt; gcc/Makefile.in</kbd>
98 </pre>
99         <p>
100           x86 マシンにおいてブートストラップビルドを行うと、コンパイラフラグ <code class=
101           "option">-fomit-frame-pointer</code> が設定されます。
102           しかしブートストラップではないビルドの場合はデフォルトではこのフラグが無効化されてしまいます。
103           ここで実現したいのは、ブートストラップビルドを行った場合とまったく同じコンパイラをビルドすることです。 そこで以下の
104           <span class="command"><strong>sed</strong></span>
105           コマンドにより、強制的に上のフラグを利用するようにします。
106         </p>
107         <pre class="userinput">
108 <kbd class="command">cp -v gcc/Makefile.in{,.tmp}
109 sed 's/^T_CFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in.tmp \
110   &gt; gcc/Makefile.in</kbd>
111 </pre>
112         <p>
113           以下のコマンドは GCC が利用するダイナミックリンカの場所を変更して <code class=
114           "filename">/tools</code> ディレクトリにインストールしたものを用いるようにします。 同時に GCC
115           が探索するインクルードファイルのパスから <code class="filename">/usr/include</code>
116           を取り除きます。 インストールの後にスペックファイルを調整する方法もありますが、今ここでこのようにするのは GCC
117           の実際のビルドにおいて新しいダイナミックリンカを用いるようにするためです。
118           つまりここでのビルドを通じてすべての実行モジュール類を新しい Glibc に対してリンクするものです。
119           以下のコマンドによりそれを実現します。
120         </p>
121         <pre class="userinput">
122 <kbd class="command">for file in \
123  $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
124 do
125   cp -uv $file{,.orig}
126   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&amp;@g' \
127   -e 's@/usr@/tools@g' $file.orig &gt; $file
128   echo '
129 #undef STANDARD_INCLUDE_DIR
130 #define STANDARD_INCLUDE_DIR 0
131 #define STANDARD_STARTFILE_PREFIX_1 ""
132 #define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
133   touch $file.orig
134 done</kbd>
135 </pre>
136         <p>
137           上のコマンドがよく分からない場合は一つ一つ読み下していってください。 まず <code class=
138           "filename">gcc/config</code> ディレクトリには <code class=
139           "filename">linux.h</code>、 <code class="filename">linux64.h</code>、
140           <code class="filename">sysv4.h</code> といったファイルのいずれかがあるはずです。
141           それらが存在したら、ファイル名称の末尾に 「<span class="quote">.orig</span>」
142           をつけたファイルとしてコピーします。 そして一つめの sed コマンドでは、そのファイル内にある 「<span class=
143           "quote">/lib/ld</span>」、 「<span class="quote">/lib64/ld</span>」、
144           「<span class="quote">/lib32/ld</span>」 という記述部分の頭に 「<span class=
145           "quote">/tools</span>」 を付与します。 また二つめの sed コマンドによってハードコーディングされている
146           「<span class="quote">/usr</span>」 という部分を書き換えます。
147           そしてここで加えるべき定義文をファイルの末尾に追加し、検索パスと startfile プリフィックスを変更します。 最後に
148           <span class="command"><strong>touch</strong></span>
149           によってコピーしたファイルのタイムスタンプを更新します。 <span class="command"><strong>cp
150           -u</strong></span>
151           を用いるのは、誤ってコマンドを二度起動したとしてもオリジナルファイルを壊さないようにするためです。
152         </p>
153         <p>
154           x86_64 では GCC の multilib スペックを無効化します。
155           これはホスト上のライブラリにリンクされないようにするためです。
156         </p>
157         <pre class="userinput">
158 <kbd class="command">case $(uname -m) in
159   x86_64)
160     for file in $(find gcc/config -name t-linux64) ; do \
161       cp -v $file{,.orig}
162       sed '/MULTILIB_OSDIRNAMES/d' $file.orig &gt; $file
163     done
164   ;;
165 esac</kbd>
166 </pre>
167         <p>
168           GCC を初めてビルドする際には GMP、MPFR、MPC の各パッケージを必要とします。 tarball
169           を解凍して、所定のディレクトリ名に移動させます。
170         </p>
171         <pre class="userinput">
172 <kbd class="command">tar -jxf ../mpfr-3.0.0.tar.bz2
173 mv -v mpfr-3.0.0 mpfr
174 tar -jxf ../gmp-5.0.1.tar.bz2
175 mv -v gmp-5.0.1 gmp
176 tar -zxf ../mpc-0.8.2.tar.gz
177 mv -v mpc-0.8.2 mpc</kbd>
178 </pre>
179         <p>
180           専用のディレクトリを再度生成します。
181         </p>
182         <pre class="userinput">
183 <kbd class="command">mkdir -v ../gcc-build
184 cd ../gcc-build</kbd>
185 </pre>
186         <p>
187           GCC のビルドに入る前に、デフォルトの最適化フラグを上書きするような環境変数の設定がないことを確認してください。
188         </p>
189         <p>
190           GCC をコンパイルするための準備をします。
191         </p>
192         <pre class="userinput">
193 <kbd class="command">CC="$LFS_TGT-gcc -B/tools/lib/" \
194     AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
195     ../gcc-4.5.2/configure --prefix=/tools \
196     --with-local-prefix=/tools --enable-clocale=gnu \
197     --enable-shared --enable-threads=posix \
198     --enable-__cxa_atexit --enable-languages=c,c++ \
199     --disable-libstdcxx-pch --disable-multilib \
200     --disable-bootstrap --disable-libgomp \
201     --with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
202     --without-ppl --without-cloog</kbd>
203 </pre>
204         <div class="variablelist">
205           <p class="title">
206             <b>configure オプションの意味:</b>
207           </p>
208           <dl>
209             <dt>
210               <span class="term"><em class=
211               "parameter"><code>--enable-clocale=gnu</code></em></span>
212             </dt>
213             <dd>
214               <p>
215                 このオプションはあらゆる状況において C++ ライブラリに対するロケールモデルが正しく設定されるようにします。
216                 configure スクリプト実行時に <span class=
217                 "emphasis"><em>de_DE</em></span> ロケールがインストール済みであることが分かれば、正しい
218                 GNU ロケールモデルが設定されます。 しかし <span class=
219                 "emphasis"><em>de_DE</em></span>
220                 ロケールがインストールされていなかったら、誤った汎用ロケールモデルが設定されてしまうため、アプリケーションバイナリインターフェース
221                 (Application Binary Interface; ABI) とは非互換の C++
222                 ライブラリが生成されてしまう可能性があります。
223               </p>
224             </dd>
225             <dt>
226               <span class="term"><em class=
227               "parameter"><code>--enable-threads=posix</code></em></span>
228             </dt>
229             <dd>
230               <p>
231                 マルチスレッドコードを扱う C++ の例外処理を有効にします。
232               </p>
233             </dd>
234             <dt>
235               <span class="term"><em class=
236               "parameter"><code>--enable-__cxa_atexit</code></em></span>
237             </dt>
238             <dd>
239               <p>
240                 このオプションは <code class="function">atexit</code> を使用せず
241                 <code class="function">__cxa_atexit</code> の使用を有効にします。
242                 これによりローカルなスタティックオブジェクトおよびグローバルオブジェクトに対する C++ デストラクタを登録します。
243                 このオプションは、標準に完全準拠したデストラクタ実装のために必要です。 またこれは C++ ABI に影響するものであり
244                 C++ 共有ライブラリ、C++ プログラムを作り出し、他の Linux ディストリビューションとの互換性を実現します。
245               </p>
246             </dd>
247             <dt>
248               <span class="term"><em class=
249               "parameter"><code>--enable-languages=c,c++</code></em></span>
250             </dt>
251             <dd>
252               <p>
253                 C と C++ の両コンパイラを生成することを指示します。
254               </p>
255             </dd>
256             <dt>
257               <span class="term"><em class=
258               "parameter"><code>--disable-libstdcxx-pch</code></em></span>
259             </dt>
260             <dd>
261               <p>
262                 <code class="filename">libstdc++</code> に対してプリコンパイルヘッダ
263                 (pre-compiled header; PCH) をビルドしないように指示します。
264                 これを含めてしまうとサイズが増えることになり、そもそも利用する必要がありません。
265               </p>
266             </dd>
267             <dt>
268               <span class="term"><em class=
269               "parameter"><code>--disable-bootstrap</code></em></span>
270             </dt>
271             <dd>
272               <p>
273                 GCC のネイティブビルドを行うには、デフォルトでは "ブートストラップ" ビルドを行ないます。 これは単に GCC
274                 をコンパイルするのではなく、数回のコンパイルを繰り返します。
275                 つまり一回めにビルドされたプログラムを使って二回め、三回めのコンパイルを行うものです。
276                 二回め、三回めとコンパイルを繰り返すのは、これによって自分自身を再生成して完璧なものを作り出すためです。
277                 このことによってコンパイルが正確に行われたことを暗に示すことにもなります。 しかし LFS
278                 のビルドでは、何度もブートストラップを行う必要のない、手堅い(solid) コンパイラを作り出します。
279               </p>
280             </dd>
281           </dl>
282         </div>
283         <p>
284           パッケージをコンパイルします。
285         </p>
286         <pre class="userinput">
287 <kbd class="command">make</kbd>
288 </pre>
289         <p>
290           パッケージをインストールします。
291         </p>
292         <pre class="userinput">
293 <kbd class="command">make install</kbd>
294 </pre>
295         <p>
296           最後にシンボリックリンクを作成します。 プログラムやスクリプトの中には <span class=
297           "command"><strong>gcc</strong></span> ではなく <span class=
298           "command"><strong>cc</strong></span> を用いるものが結構あります。
299           シンボリックリンクを作ることで各種のプログラムを汎用的にすることができ、通常 GNU C コンパイラがインストールされていない多くの
300           UNIX システムでも利用できるものになります。 <span class=
301           "command"><strong>cc</strong></span> を利用することにすれば、 システム管理者がどの C
302           コンパイラをインストールすべきかを判断する必要がなくなります。
303         </p>
304         <pre class="userinput">
305 <kbd class="command">ln -vs gcc /tools/bin/cc</kbd>
306 </pre>
307         <div class="admon caution">
308           <img alt="[注意]" src="../images/caution.png" />
309           <h3>
310             注意
311           </h3>
312           <p>
313             この時点で、構築したツールチェーンの基本的な (コンパイルやリンクなどの) 機能が正しく動作していることを確認する必要があります。
314             健全性検査 (sanity check) を行うために以下を実行してください。
315           </p>
316           <pre class="userinput">
317 <kbd class="command">echo 'main(){}' &gt; dummy.c
318 cc dummy.c
319 readelf -l a.out | grep ': /tools'</kbd>
320 </pre>
321           <p>
322             問題なく動作した場合はエラーがなかったということで、最後のコマンドから出力される結果は以下のようになるはずです。
323           </p>
324           <pre class="screen">
325 <code class=
326 "computeroutput">[Requesting program interpreter: /tools/lib/ld-linux.so.2]</code>
327 </pre>
328           <p>
329             ここでダイナミックリンカのディレクトリが <code class="filename">/tools/lib</code>
330             であることを確認してください。 あるいは 64 ビットマシンであれば <code class=
331             "filename">/tools/lib64</code> であることを確認してください。
332           </p>
333           <p>
334             コマンドの出力結果が上と異なっていたり、あるいは何も出力されなかった場合は、何かがおかしいことを意味します。
335             どこに問題があるのか調査・再試行を行って解消してください。 解決せずにこの先に進まないでください。 <span class=
336             "command"><strong>cc</strong></span> ではなく <span class=
337             "command"><strong>gcc</strong></span> を使って再度健全性検査を行ってみてください。
338             これで解決したなら <code class="filename">/tools/bin/cc</code>
339             のシンボリックリンクが正しくないということです。 正しく生成し直してください。 また環境変数 <code class=
340             "envar">PATH</code> が正しいかどうかも確認してください。 <span class=
341             "command"><strong>echo $PATH</strong></span> を実行して、実行パスリストの先頭が
342             <code class="filename">/tools/bin</code> であるかどうか確認します。
343             <code class="envar">PATH</code> が間違っていたなら、実はあなたは <code class=
344             "systemitem">lfs</code> ユーザーでログインしていないのかもしれませんし <a class="xref"
345             href="../chapter04/settingenvironment.html" title=
346             "4.4. 環境設定">4.4.「環境設定」</a> での作業に間違いがあったのかもしれません。
347           </p>
348           <p>
349             すべてが終了したらテストファイルを削除します。
350           </p>
351           <pre class="userinput">
352 <kbd class="command">rm -v dummy.c a.out</kbd>
353 </pre>
354         </div>
355       </div>
356       <div class="content" lang="ja" xml:lang="ja">
357         <p>
358           本パッケージの詳細は <a class="xref" href=
359           "../chapter06/gcc.html#contents-gcc" title=
360           "6.16.2. GCC の構成">6.16.2.「GCC の構成」</a> を参照してください。
361         </p>
362       </div>
363     </div>
364     <div class="navfooter">
365       <ul>
366         <li class="prev">
367           <a accesskey="p" href="binutils-pass2.html" title=
368           "Binutils-2.21 - 2回め">前のページ</a>
369           <p>
370             Binutils-2.21 - 2回め
371           </p>
372         </li>
373         <li class="next">
374           <a accesskey="n" href="tcl.html" title="Tcl-8.5.9">次のページ</a>
375           <p>
376             Tcl-8.5.9
377           </p>
378         </li>
379         <li class="up">
380           <a accesskey="u" href="chapter05.html" title=
381           "第5章 一時的環境の構築">上に戻る</a>
382         </li>
383         <li class="home">
384           <a accesskey="h" href="../index.html" title=
385           "Linux From Scratch - Version 6.8">ホーム</a>
386         </li>
387       </ul>
388     </div>
389   </body>
390 </html>