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">
5 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
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" />
14 <body class="lfs" id="lfs-6.8">
15 <div class="navheader">
17 Linux From Scratch - Version 6.8
24 <a accesskey="p" href="binutils-pass2.html" title=
25 "Binutils-2.21 - 2回め">前のページ</a>
31 <a accesskey="n" href="tcl.html" title="Tcl-8.5.9">次のページ</a>
37 <a accesskey="u" href="chapter05.html" title=
38 "第5章 一時的環境の構築">上に戻る</a>
41 <a accesskey="h" href="../index.html" title=
42 "Linux From Scratch - Version 6.8">ホーム</a>
46 <div class="wrap" lang="ja" xml:lang="ja">
48 <a id="ch-tools-gcc-pass2" name="ch-tools-gcc-pass2"></a>5.10.
51 <div class="package" lang="ja" xml:lang="ja">
53 GCC パッケージは C コンパイラや C++ コンパイラなどの GNU コンパイラコレクションを提供します。
55 <div class="segmentedlist">
56 <div class="seglistitem">
58 <strong class="segtitle">概算ビルド時間:</strong> <span class=
59 "segbody">9.0 SBU</span>
62 <strong class="segtitle">必要ディスク容量:</strong> <span class=
63 "segbody">1003 MB</span>
68 <div class="installation" lang="ja" xml:lang="ja">
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 ディレクトリ内のライブラリにリンクされたコンパイラを作り出すことが必要であるため、以下のパッチを適用します。 このパッチは、部分的に
81 <pre class="userinput">
82 <kbd class="command">patch -Np1 -i ../gcc-4.5.2-startfiles_fix-1.patch</kbd>
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 スクリプトの実行を無効とするために以下を実行します。
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 > gcc/Makefile.in</kbd>
100 x86 マシンにおいてブートストラップビルドを行うと、コンパイラフラグ <code class=
101 "option">-fomit-frame-pointer</code> が設定されます。
102 しかしブートストラップではないビルドの場合はデフォルトではこのフラグが無効化されてしまいます。
103 ここで実現したいのは、ブートストラップビルドを行った場合とまったく同じコンパイラをビルドすることです。 そこで以下の
104 <span class="command"><strong>sed</strong></span>
105 コマンドにより、強制的に上のフラグを利用するようにします。
107 <pre class="userinput">
108 <kbd class="command">cp -v gcc/Makefile.in{,.tmp}
109 sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
110 > gcc/Makefile.in</kbd>
113 以下のコマンドは GCC が利用するダイナミックリンカの場所を変更して <code class=
114 "filename">/tools</code> ディレクトリにインストールしたものを用いるようにします。 同時に GCC
115 が探索するインクルードファイルのパスから <code class="filename">/usr/include</code>
116 を取り除きます。 インストールの後にスペックファイルを調整する方法もありますが、今ここでこのようにするのは GCC
117 の実際のビルドにおいて新しいダイナミックリンカを用いるようにするためです。
118 つまりここでのビルドを通じてすべての実行モジュール類を新しい Glibc に対してリンクするものです。
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)
126 sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
127 -e 's@/usr@/tools@g' $file.orig > $file
129 #undef STANDARD_INCLUDE_DIR
130 #define STANDARD_INCLUDE_DIR 0
131 #define STANDARD_STARTFILE_PREFIX_1 ""
132 #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
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
151 を用いるのは、誤ってコマンドを二度起動したとしてもオリジナルファイルを壊さないようにするためです。
154 x86_64 では GCC の multilib スペックを無効化します。
155 これはホスト上のライブラリにリンクされないようにするためです。
157 <pre class="userinput">
158 <kbd class="command">case $(uname -m) in
160 for file in $(find gcc/config -name t-linux64) ; do \
162 sed '/MULTILIB_OSDIRNAMES/d' $file.orig > $file
168 GCC を初めてビルドする際には GMP、MPFR、MPC の各パッケージを必要とします。 tarball
169 を解凍して、所定のディレクトリ名に移動させます。
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
176 tar -zxf ../mpc-0.8.2.tar.gz
177 mv -v mpc-0.8.2 mpc</kbd>
182 <pre class="userinput">
183 <kbd class="command">mkdir -v ../gcc-build
184 cd ../gcc-build</kbd>
187 GCC のビルドに入る前に、デフォルトの最適化フラグを上書きするような環境変数の設定がないことを確認してください。
190 GCC をコンパイルするための準備をします。
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>
204 <div class="variablelist">
206 <b>configure オプションの意味:</b>
210 <span class="term"><em class=
211 "parameter"><code>--enable-clocale=gnu</code></em></span>
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 ライブラリが生成されてしまう可能性があります。
226 <span class="term"><em class=
227 "parameter"><code>--enable-threads=posix</code></em></span>
231 マルチスレッドコードを扱う C++ の例外処理を有効にします。
235 <span class="term"><em class=
236 "parameter"><code>--enable-__cxa_atexit</code></em></span>
240 このオプションは <code class="function">atexit</code> を使用せず
241 <code class="function">__cxa_atexit</code> の使用を有効にします。
242 これによりローカルなスタティックオブジェクトおよびグローバルオブジェクトに対する C++ デストラクタを登録します。
243 このオプションは、標準に完全準拠したデストラクタ実装のために必要です。 またこれは C++ ABI に影響するものであり
244 C++ 共有ライブラリ、C++ プログラムを作り出し、他の Linux ディストリビューションとの互換性を実現します。
248 <span class="term"><em class=
249 "parameter"><code>--enable-languages=c,c++</code></em></span>
253 C と C++ の両コンパイラを生成することを指示します。
257 <span class="term"><em class=
258 "parameter"><code>--disable-libstdcxx-pch</code></em></span>
262 <code class="filename">libstdc++</code> に対してプリコンパイルヘッダ
263 (pre-compiled header; PCH) をビルドしないように指示します。
264 これを含めてしまうとサイズが増えることになり、そもそも利用する必要がありません。
268 <span class="term"><em class=
269 "parameter"><code>--disable-bootstrap</code></em></span>
273 GCC のネイティブビルドを行うには、デフォルトでは "ブートストラップ" ビルドを行ないます。 これは単に GCC
274 をコンパイルするのではなく、数回のコンパイルを繰り返します。
275 つまり一回めにビルドされたプログラムを使って二回め、三回めのコンパイルを行うものです。
276 二回め、三回めとコンパイルを繰り返すのは、これによって自分自身を再生成して完璧なものを作り出すためです。
277 このことによってコンパイルが正確に行われたことを暗に示すことにもなります。 しかし LFS
278 のビルドでは、何度もブートストラップを行う必要のない、手堅い(solid) コンパイラを作り出します。
286 <pre class="userinput">
287 <kbd class="command">make</kbd>
292 <pre class="userinput">
293 <kbd class="command">make install</kbd>
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 コンパイラをインストールすべきかを判断する必要がなくなります。
304 <pre class="userinput">
305 <kbd class="command">ln -vs gcc /tools/bin/cc</kbd>
307 <div class="admon caution">
308 <img alt="[注意]" src="../images/caution.png" />
313 この時点で、構築したツールチェーンの基本的な (コンパイルやリンクなどの) 機能が正しく動作していることを確認する必要があります。
314 健全性検査 (sanity check) を行うために以下を実行してください。
316 <pre class="userinput">
317 <kbd class="command">echo 'main(){}' > dummy.c
319 readelf -l a.out | grep ': /tools'</kbd>
322 問題なく動作した場合はエラーがなかったということで、最後のコマンドから出力される結果は以下のようになるはずです。
326 "computeroutput">[Requesting program interpreter: /tools/lib/ld-linux.so.2]</code>
329 ここでダイナミックリンカのディレクトリが <code class="filename">/tools/lib</code>
330 であることを確認してください。 あるいは 64 ビットマシンであれば <code class=
331 "filename">/tools/lib64</code> であることを確認してください。
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> での作業に間違いがあったのかもしれません。
349 すべてが終了したらテストファイルを削除します。
351 <pre class="userinput">
352 <kbd class="command">rm -v dummy.c a.out</kbd>
356 <div class="content" lang="ja" xml:lang="ja">
358 本パッケージの詳細は <a class="xref" href=
359 "../chapter06/gcc.html#contents-gcc" title=
360 "6.16.2. GCC の構成">6.16.2.「GCC の構成」</a> を参照してください。
364 <div class="navfooter">
367 <a accesskey="p" href="binutils-pass2.html" title=
368 "Binutils-2.21 - 2回め">前のページ</a>
374 <a accesskey="n" href="tcl.html" title="Tcl-8.5.9">次のページ</a>
380 <a accesskey="u" href="chapter05.html" title=
381 "第5章 一時的環境の構築">上に戻る</a>
384 <a accesskey="h" href="../index.html" title=
385 "Linux From Scratch - Version 6.8">ホーム</a>