OSDN Git Service

Update to lfsbook 7.2.ja
[linuxjf/JF.git] / docs / LFS-BOOK / chapter05 / toolchaintechnotes.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.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-7.2">
15     <div class="navheader">
16       <h4>
17         Linux From Scratch - Version 7.2
18       </h4>
19       <h3>
20         第5章 一時的環境の構築
21       </h3>
22       <ul>
23         <li class="prev">
24           <a accesskey="p" href="introduction.html" title="はじめに">前のページ</a>
25           <p>
26             はじめに
27           </p>
28         </li>
29         <li class="next">
30           <a accesskey="n" href="generalinstructions.html" title=
31           "全般的なコンパイル手順">次のページ</a>
32           <p>
33             全般的なコンパイル手順
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 7.2">ホーム</a>
43         </li>
44       </ul>
45     </div>
46     <div class="sect1" lang="ja" xml:lang="ja">
47       <h1 class="sect1">
48         <a id="ch-tools-toolchaintechnotes" name=
49         "ch-tools-toolchaintechnotes"></a>5.2. ツールチェーンの技術的情報
50       </h1>
51       <p>
52         本節ではシステムをビルドする原理や技術的な詳細について説明します。 この節のすべてをすぐに理解する必要はありません。
53         この先、実際の作業を行っていけば、いろいろな情報が明らかになってくるはずです。
54         各作業を進めながら、いつでもこの節に戻って読み直してみてください。
55       </p>
56       <p>
57         <a class="xref" href="chapter05.html" title=
58         "第5章 一時的環境の構築">第5章</a>の最終目標は一時的なシステム環境を構築することです。
59         この一時的なシステムには、システム構築のための十分なツール類を有し、ホストシステムとは切り離されたものです。 この環境へは chroot
60         によって移行します。この環境は<a class="xref" href="../chapter06/chapter06.html"
61         title="第6章 基本的なソフトウェアのインストール">第6章</a>において、クリーンでトラブルのない LFS
62         システムの構築を行う土台となるものです。
63         構築手順の説明においては、初心者の方であっても失敗を最小限にとどめ、同時に最大限の学習材料となるように心がけています。
64       </p>
65       <div class="admon note">
66         <img alt="[注記]" src="../images/note.png" />
67         <h3>
68           注記
69         </h3>
70         <p>
71           これより先に進む前に、作業するプラットフォームの「<span class="quote">三つの組 (target
72           triplet)</span>」で表される名称を確認してください。 「<span class=
73           "quote">三つの組</span>」は <span class=
74           "command"><strong>config.guess</strong></span>
75           スクリプトを実行することで簡単に確認できます。 そのスクリプトは多くのパッケージのソースに含まれています。 Binutils
76           パッケージのソースを伸張 (解凍) し <strong class=
77           "userinput"><code>./config.guess</code></strong>
78           スクリプトを実行してその出力を確認してみてください。 例えば最近の 32 ビット Intel プロセッサーでは
79           <span class="emphasis"><em>i686-pc-linux-gnu</em></span>
80           のような出力が得られます。
81         </p>
82         <p>
83           利用しているプラットフォームに応じたダイナミックリンカー (dynamic linker) の名前についても確認してください。
84           ダイナミックローダー (dynamic loader) とも表現されるものです。(Binutils が提供する標準的なリンカー
85           <span class="command"><strong>ld</strong></span>
86           とは異なりますので注意してください。) Glibc
87           が提供するこのダイナミックリンカーは、プログラムが必要としている共有ライブラリを見つけ出してロードし、実行のための準備を行った上で実際に実行します。
88           32 ビットマシンのダイナミックリンカーの名前は <code class=
89           "filename">ld-linux.so.2</code> といったものになります。
90           確実にその名前を調べるなら、ホストシステム内のどれでも良いので実行モジュールを選んで <strong class=
91           "userinput"><code>readelf -l
92           &lt;</code></strong>実行モジュール名<strong class="userinput"><code>&gt; |
93           grep interpreter</code></strong> と入力します。 出力される結果を確認してください。
94           あらゆるプラットフォームの情報を知りたいなら Glibc のソースディレクトリのルートにある <code class=
95           "filename">shlib-versions</code> ファイルに記されています。
96         </p>
97       </div>
98       <p>
99         <a class="xref" href="chapter05.html" title=
100         "第5章 一時的環境の構築">第5章</a>におけるビルド手順がどのように機能するのか、その技術的な情報を以下に示します。
101       </p>
102       <div class="itemizedlist">
103         <ul>
104           <li>
105             <p>
106               動作させているプラットフォームの名前を微妙に変えます。 三つの組の "ベンダー "
107               フィールドを変更するもので、<code class="envar">LFS_TGT</code> 変数に定め利用します。
108               こうしておいて Binutils と GCC
109               の初回の構築を行なえば、互換性のあるクロスコンパイラー、クロスリンカーを確実に構築できるようになります。
110               もう一つ別のアーキテクチャーに対する実行モジュールを作らなくても、そのクロスコンパイラーとクロスリンカーを使えば、生成される実行モジュールは現在のハードウェアに適合したものとなります。
111             </p>
112           </li>
113           <li>
114             <p>
115               一時的に構築するライブラリはクロスコンパイルにより生成します。
116               クロスコンパイラーというものは元来、ホストシステムへ依存するものではないためです。
117               こうすることで、ホストシステムのヘッダーやライブラリが、一時的なツール類を壊してしまうような危険を減らすことができ、同時に
118               64 ビットマシンにて 32 ビットあるいは 64 ビットの双方のライブラリを構築することができるようになります。
119             </p>
120           </li>
121           <li>
122             <p>
123               <span class="command"><strong>gcc</strong></span>
124               のソースを適切に調整することで、どのダイナミックリンカーを用いるのかをコンパイラーに指示します。
125             </p>
126           </li>
127         </ul>
128       </div>
129       <p>
130         Binutils をまず初めにインストールします。 この後の GCC や Glibc の <span class=
131         "command"><strong>configure</strong></span>
132         スクリプトの実行ではアセンブラーやリンカーに対するさまざまな機能テストが行われるためで、そこではどの機能が利用可能または利用不能であるかが確認されます。
133         ただ重要なのは Binutils を一番初めにビルドするという点だけではありません。 Gcc や Glibc の configure
134         が正しく処理されなかったとすると、ツールチェーンがわずかながらも不完全な状態で生成されてしまいます。
135         この状態は、すべてのビルド作業を終えた最後になって、大きな不具合となって現れてくることになります。
136         テストスイートを実行することが欠かせません。 これを実行しておけば、この先に行う多くの作業に入る前に不備があることが分かるからです。
137       </p>
138       <p>
139         Binutils はアセンブラーとリンカーを二箇所にインストールします。 <code class=
140         "filename">/tools/bin</code> と <code class=
141         "filename">/tools/$LFS_TGT/bin</code> です。 これらは一方が他方のハードリンクとなっています。
142         リンカーの重要なところはライブラリを検索する順番です。 <span class=
143         "command"><strong>ld</strong></span> コマンドに <em class=
144         "parameter"><code>--verbose</code></em> オプションをつけて実行すれば詳しい情報が得られます。
145         例えば <strong class="userinput"><code>ld --verbose | grep
146         SEARCH</code></strong> を実行すると、検索するライブラリのパスとその検索順を示してくれます。
147         ダミープログラムをコンパイルして <span class="command"><strong>ld</strong></span> に
148         <em class="parameter"><code>--verbose</code></em>
149         オプションをつけてリンクを行うと、どのファイルがリンクされたが分かります。 例えば <strong class=
150         "userinput"><code>gcc dummy.c -Wl,--verbose 2&gt;&amp;1 | grep
151         succeeded</code></strong> と実行すれば、リンカーの処理中にオープンに成功したファイルがすべて表示されます。
152       </p>
153       <p>
154         次にインストールするのは GCC です。 <span class=
155         "command"><strong>configure</strong></span> の実行時には以下のような出力が行われます。
156       </p>
157       <pre class="screen">
158 <code class=
159 "computeroutput">checking what assembler to use... /tools/i686-lfs-linux-gnu/bin/as
160 checking what linker to use... /tools/i686-lfs-linux-gnu/bin/ld</code>
161 </pre>
162       <p>
163         これを示すのには重要な意味があります。 GCC の configure スクリプトは、利用するツール類を探し出す際に PATH
164         ディレクトリを参照していないということです。 しかし <span class=
165         "command"><strong>gcc</strong></span>
166         の実際の処理にあたっては、その検索パスが必ず使われるわけでもありません。 <span class=
167         "command"><strong>gcc</strong></span> が利用する標準的なリンカーを確認するには
168         <strong class="userinput"><code>gcc
169         -print-prog-name=ld</code></strong> を実行します。
170       </p>
171       <p>
172         さらに詳細な情報を知りたいときは、ダミープログラムをコンパイルする際に <em class=
173         "parameter"><code>-v</code></em> オプションをつけて実行します。 例えば <strong class=
174         "userinput"><code>gcc -v dummy.c</code></strong>
175         と入力すると、プリプロセッサー、コンパイル、アセンブルの各処理工程が示されますが、さらに <span class=
176         "command"><strong>gcc</strong></span> がインクルードした検索パスとその読み込み順も示されます。
177       </p>
178       <p>
179         次に健全化された (sanitized) Linux API ヘッダーをインストールします。 これにより、標準 C ライブラリ
180         (Glibc) が Linux カーネルが提供する機能とのインターフェースを可能とします。
181       </p>
182       <p>
183         次のパッケージは Glibc です。 Glibc
184         構築の際に気にかけるべき重要なものは、コンパイラー、バイナリツール、カーネルヘッダーです。
185         コンパイラーについては、一般にはあまり問題にはなりません。 Glibc は常に configure スクリプトにて指定される
186         <em class="parameter"><code>--host</code></em>
187         パラメーターに関連づけしたコンパイラーを用いるからです。 我々の作業では <span class=
188         "command"><strong>i686-lfs-linux-gnu-gcc</strong></span> になります。
189         バイナリツールとカーネルヘッダーは多少複雑です。 従って無理なことはせずに有効な configure オプションを選択することが必要です。
190         <span class="command"><strong>configure</strong></span> 実行の後は
191         <code class="filename">glibc-build</code> ディレクトリにある <code class=
192         "filename">config.make</code> ファイルに重要な情報が示されているので確認してみてください。 なお
193         <em class="parameter"><code>CC="i686-lfs-gnu-gcc"</code></em>
194         とすれば、どこにある実行モジュールを利用するかを制御でき <em class=
195         "parameter"><code>-nostdinc</code></em> と <em class=
196         "parameter"><code>-isystem</code></em>
197         を指定すれば、コンパイラーに対してインクルードファイルの検索パスを制御できます。 これらの指定は Glibc
198         パッケージの重要な面を示しています。 Glibc
199         がビルドされるメカニズムは自己完結したビルドが行われるものであり、ツールチェーンのデフォルト設定には基本的に依存しないことを示しています。
200       </p>
201       <p>
202         Binutils の2回めのビルドにおいては <span class=
203         "command"><strong>ld</strong></span> コマンドのライブラリ検索パスを設定するために configure
204         の <em class="parameter"><code>--with-lib-path</code></em> スイッチを指定します。
205       </p>
206       <p>
207         GCC の第2回目のビルドにおいても、ソースを修正して新しいダイナミックリンカーが用いられるようにします。
208         これをもし誤ってしまうと、ホストシステムの <code class="filename">/lib</code>
209         ディレクトリが埋め込まれたダイナミックリンカーを用いるものとして GCC が生成されてしまいます。
210         こうしてしまうと、ホストシステムに依存しない形を目指すという目的が達成できません。 これ以降、コアとなるツールチェーンは、自己完結し
211         (self-contained)、自分だけで処理できる (self-hosted) ものとなります。 <a class="xref"
212         href="chapter05.html" title="第5章 一時的環境の構築">第5章</a>の残りのパッケージは
213         <code class="filename">/tools</code> にある新たな Glibc を用いてビルドされます。
214       </p>
215       <p>
216         <a class="xref" href="../chapter06/chapter06.html" title=
217         "第6章 基本的なソフトウェアのインストール">第6章</a>での chroot による環境下では、実質的なパッケージとして Glibc
218         を初めにビルドします。 これは上に述べているように自己完結した性質を目指すためです。 <code class=
219         "filename">/usr</code> に Glibc をインストールしたら、ツールチェーンのデフォルトディレクトリの変更を行い
220         LFS システムを構築する残りのパッケージをビルドしていきます。
221       </p>
222     </div>
223     <div class="navfooter">
224       <ul>
225         <li class="prev">
226           <a accesskey="p" href="introduction.html" title="はじめに">前のページ</a>
227           <p>
228             はじめに
229           </p>
230         </li>
231         <li class="next">
232           <a accesskey="n" href="generalinstructions.html" title=
233           "全般的なコンパイル手順">次のページ</a>
234           <p>
235             全般的なコンパイル手順
236           </p>
237         </li>
238         <li class="up">
239           <a accesskey="u" href="chapter05.html" title=
240           "第5章 一時的環境の構築">上に戻る</a>
241         </li>
242         <li class="home">
243           <a accesskey="h" href="../index.html" title=
244           "Linux From Scratch - Version 7.2">ホーム</a>
245         </li>
246       </ul>
247     </div>
248   </body>
249 </html>