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-7.2">
15 <div class="navheader">
17 Linux From Scratch - Version 7.2
24 <a accesskey="p" href="introduction.html" title="はじめに">前のページ</a>
30 <a accesskey="n" href="generalinstructions.html" title=
31 "全般的なコンパイル手順">次のページ</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 7.2">ホーム</a>
46 <div class="sect1" lang="ja" xml:lang="ja">
48 <a id="ch-tools-toolchaintechnotes" name=
49 "ch-tools-toolchaintechnotes"></a>5.2. ツールチェーンの技術的情報
52 本節ではシステムをビルドする原理や技術的な詳細について説明します。 この節のすべてをすぐに理解する必要はありません。
53 この先、実際の作業を行っていけば、いろいろな情報が明らかになってくるはずです。
54 各作業を進めながら、いつでもこの節に戻って読み直してみてください。
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
63 構築手順の説明においては、初心者の方であっても失敗を最小限にとどめ、同時に最大限の学習材料となるように心がけています。
65 <div class="admon note">
66 <img alt="[注記]" src="../images/note.png" />
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>
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 <</code></strong>実行モジュール名<strong class="userinput"><code>> |
93 grep interpreter</code></strong> と入力します。 出力される結果を確認してください。
94 あらゆるプラットフォームの情報を知りたいなら Glibc のソースディレクトリのルートにある <code class=
95 "filename">shlib-versions</code> ファイルに記されています。
99 <a class="xref" href="chapter05.html" title=
100 "第5章 一時的環境の構築">第5章</a>におけるビルド手順がどのように機能するのか、その技術的な情報を以下に示します。
102 <div class="itemizedlist">
106 動作させているプラットフォームの名前を微妙に変えます。 三つの組の "ベンダー "
107 フィールドを変更するもので、<code class="envar">LFS_TGT</code> 変数に定め利用します。
108 こうしておいて Binutils と GCC
109 の初回の構築を行なえば、互換性のあるクロスコンパイラー、クロスリンカーを確実に構築できるようになります。
110 もう一つ別のアーキテクチャーに対する実行モジュールを作らなくても、そのクロスコンパイラーとクロスリンカーを使えば、生成される実行モジュールは現在のハードウェアに適合したものとなります。
115 一時的に構築するライブラリはクロスコンパイルにより生成します。
116 クロスコンパイラーというものは元来、ホストシステムへ依存するものではないためです。
117 こうすることで、ホストシステムのヘッダーやライブラリが、一時的なツール類を壊してしまうような危険を減らすことができ、同時に
118 64 ビットマシンにて 32 ビットあるいは 64 ビットの双方のライブラリを構築することができるようになります。
123 <span class="command"><strong>gcc</strong></span>
124 のソースを適切に調整することで、どのダイナミックリンカーを用いるのかをコンパイラーに指示します。
130 Binutils をまず初めにインストールします。 この後の GCC や Glibc の <span class=
131 "command"><strong>configure</strong></span>
132 スクリプトの実行ではアセンブラーやリンカーに対するさまざまな機能テストが行われるためで、そこではどの機能が利用可能または利用不能であるかが確認されます。
133 ただ重要なのは Binutils を一番初めにビルドするという点だけではありません。 Gcc や Glibc の configure
134 が正しく処理されなかったとすると、ツールチェーンがわずかながらも不完全な状態で生成されてしまいます。
135 この状態は、すべてのビルド作業を終えた最後になって、大きな不具合となって現れてくることになります。
136 テストスイートを実行することが欠かせません。 これを実行しておけば、この先に行う多くの作業に入る前に不備があることが分かるからです。
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>&1 | grep
151 succeeded</code></strong> と実行すれば、リンカーの処理中にオープンに成功したファイルがすべて表示されます。
154 次にインストールするのは GCC です。 <span class=
155 "command"><strong>configure</strong></span> の実行時には以下のような出力が行われます。
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>
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> を実行します。
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> がインクルードした検索パスとその読み込み順も示されます。
179 次に健全化された (sanitized) Linux API ヘッダーをインストールします。 これにより、標準 C ライブラリ
180 (Glibc) が Linux カーネルが提供する機能とのインターフェースを可能とします。
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 がビルドされるメカニズムは自己完結したビルドが行われるものであり、ツールチェーンのデフォルト設定には基本的に依存しないことを示しています。
202 Binutils の2回めのビルドにおいては <span class=
203 "command"><strong>ld</strong></span> コマンドのライブラリ検索パスを設定するために configure
204 の <em class="parameter"><code>--with-lib-path</code></em> スイッチを指定します。
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 を用いてビルドされます。
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 システムを構築する残りのパッケージをビルドしていきます。
223 <div class="navfooter">
226 <a accesskey="p" href="introduction.html" title="はじめに">前のページ</a>
232 <a accesskey="n" href="generalinstructions.html" title=
233 "全般的なコンパイル手順">次のページ</a>
239 <a accesskey="u" href="chapter05.html" title=
240 "第5章 一時的環境の構築">上に戻る</a>
243 <a accesskey="h" href="../index.html" title=
244 "Linux From Scratch - Version 7.2">ホーム</a>