<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
<title>
- 5.5. GCC-4.5.2 - 1回め
+ 5.5. GCC-4.7.1 - 1回め
</title>
<link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
<link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
"text/css" media="print" />
</head>
- <body class="lfs" id="lfs-6.8">
+ <body class="lfs" id="lfs-7.2">
<div class="navheader">
<h4>
- Linux From Scratch - Version 6.8
+ Linux From Scratch - Version 7.2
</h4>
<h3>
第5章 一時的環境の構築
<ul>
<li class="prev">
<a accesskey="p" href="binutils-pass1.html" title=
- "Binutils-2.21 - 1回め">前のページ</a>
+ "Binutils-2.22 - 1回め">前のページ</a>
<p>
- Binutils-2.21 - 1回め
+ Binutils-2.22 - 1回め
</p>
</li>
<li class="next">
<a accesskey="n" href="linux-headers.html" title=
- "Linux-2.6.37 API ヘッダ">次のページ</a>
+ "Linux-3.5.2 API ヘッダー">次のページ</a>
<p>
- Linux-2.6.37 API ヘッダ
+ Linux-3.5.2 API ヘッダー
</p>
</li>
<li class="up">
</li>
<li class="home">
<a accesskey="h" href="../index.html" title=
- "Linux From Scratch - Version 6.8">ホーム</a>
+ "Linux From Scratch - Version 7.2">ホーム</a>
</li>
</ul>
</div>
<div class="wrap" lang="ja" xml:lang="ja">
<h1 class="sect1">
<a id="ch-tools-gcc-pass1" name="ch-tools-gcc-pass1"></a>5.5.
- GCC-4.5.2 - 1回め
+ GCC-4.7.1 - 1回め
</h1>
<div class="package" lang="ja" xml:lang="ja">
<p>
- GCC ã\83\91ã\83\83ã\82±ã\83¼ã\82¸ã\81¯ C ã\82³ã\83³ã\83\91ã\82¤ã\83©ã\82\84 C++ ã\82³ã\83³ã\83\91ã\82¤ã\83©ã\81ªã\81©ã\81® GNU ã\82³ã\83³ã\83\91ã\82¤ã\83©コレクションを提供します。
+ GCC ã\83\91ã\83\83ã\82±ã\83¼ã\82¸ã\81¯ C ã\82³ã\83³ã\83\91ã\82¤ã\83©ã\83¼ã\82\84 C++ ã\82³ã\83³ã\83\91ã\82¤ã\83©ã\83¼ã\81ªã\81©ã\81® GNU ã\82³ã\83³ã\83\91ã\82¤ã\83©ã\83¼コレクションを提供します。
</p>
<div class="segmentedlist">
<div class="seglistitem">
<div class="seg">
<strong class="segtitle">概算ビルド時間:</strong> <span class=
- "segbody">5.0 SBU</span>
+ "segbody">5.5 SBU</span>
</div>
<div class="seg">
<strong class="segtitle">必要ディスク容量:</strong> <span class=
- "segbody">809 MB</span>
+ "segbody">1.4 GB</span>
</div>
</div>
</div>
ソースディレクトリの中に伸張 (解凍) し、ディレクトリ名を変更します。 これは GCC
のビルド処理においてそれらを自動的に利用できるようにするためです。
</p>
+ <div class="admon note">
+ <img alt="[注記]" src="../images/note.png" />
+ <h3>
+ 注記
+ </h3>
+ <p>
+ 本節においては誤解が多く発生しています。 ここでの手順は他のものと同様であり、手順の概要 (<a class="xref"
+ href="generalinstructions.html#buildinstr">パッケージビルド手順</a>)
+ は説明済です。 まず初めに gcc の tarball を伸張 (解凍) し、生成されたソースディレクトリに移動します。
+ それに加えて本節では、以下の手順を行うものとなります。
+ </p>
+ </div>
+ <pre class="userinput">
+<kbd class="command">tar -Jxf ../mpfr-3.1.1.tar.xz
+mv -v mpfr-3.1.1 mpfr
+tar -Jxf ../gmp-5.0.5.tar.xz
+mv -v gmp-5.0.5 gmp
+tar -zxf ../mpc-1.0.tar.gz
+mv -v mpc-1.0 mpc</kbd>
+</pre>
+ <p>
+ 以下のコマンドは GCC のデフォルトのダイナミックリンカーの配置ディレクトリを、既にインストールされている <code class=
+ "filename">/tools</code> とします。 また GCC のインクルードパスから <code class=
+ "filename">/usr/include</code> を除きます。
+ </p>
+ <pre class="userinput">
+<kbd class="command">for file in \
+ $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
+do
+ cp -uv $file{,.orig}
+ sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
+ -e 's@/usr@/tools@g' $file.orig > $file
+ echo '
+#undef STANDARD_STARTFILE_PREFIX_1
+#undef STANDARD_STARTFILE_PREFIX_2
+#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
+#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
+ touch $file.orig
+done</kbd>
+</pre>
+ <p>
+ 上のコマンドがよく分からない場合は一つ一つ読み下していってください。 まず <code class=
+ "filename">gcc/config</code> ディレクトリには <code class=
+ "filename">linux.h</code>, <code class="filename">linux64.h</code>,
+ <code class="filename">sysv4.h</code> といったファイルのいずれかがあります。
+ それらが存在したら、ファイル名称の末尾に「<span class=
+ "quote">.orig</span>」をつけたファイルとしてコピーします。 そして一つめの sed
+ コマンドでは、そのファイル内にある「<span class="quote">/lib/ld</span>」,
+ 「<span class="quote">/lib64/ld</span>」, 「<span class=
+ "quote">/lib32/ld</span>」という記述部分の頭に「<span class=
+ "quote">/tools</span>」を付与します。 また二つめの sed
+ コマンドによってハードコーディングされている「<span class=
+ "quote">/usr</span>」という部分を書き換えます。 そしてここで加えるべき定義文をファイルの末尾に追加し、検索パスと
+ startfile プリフィックスを変更します。 この際に「<span class=
+ "quote">/tools/lib/</span>」の終わりには「<span class=
+ "quote">/</span>」が必要となります。 最後に <span class=
+ "command"><strong>touch</strong></span>
+ によってコピーしたファイルのタイムスタンプを更新します。 <span class="command"><strong>cp
+ -u</strong></span>
+ を用いるのは、誤ってコマンドを二度起動したとしてもオリジナルファイルを壊さないようにするためです。
+ </p>
+ <p>
+ GCC はスタックプロテクション (stack protection) を正しく検出しません。 このことは Glibc-2.16.0
+ においてビルドする際には問題となります。 そこで以下のコマンドを実行することで解消します。
+ </p>
<pre class="userinput">
-<kbd class="command">tar -jxf ../mpfr-3.0.0.tar.bz2
-mv -v mpfr-3.0.0 mpfr
-tar -jxf ../gmp-5.0.1.tar.bz2
-mv -v gmp-5.0.1 gmp
-tar -zxf ../mpc-0.8.2.tar.gz
-mv -v mpc-0.8.2 mpc</kbd>
+<kbd class=
+"command">sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure</kbd>
</pre>
<p>
GCC のドキュメントでは、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。
cd ../gcc-build</kbd>
</pre>
<p>
- GCC をコンパイルするための準備を行います。
+ GCC をコンパイルするための準備をします。
</p>
<pre class="userinput">
-<kbd class="command">../gcc-4.5.2/configure \
- --target=$LFS_TGT --prefix=/tools \
- --disable-nls --disable-shared --disable-multilib \
- --disable-decimal-float --disable-threads \
- --disable-libmudflap --disable-libssp \
- --disable-libgomp --enable-languages=c \
- --with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
- --without-ppl --without-cloog</kbd>
+<kbd class="command">../gcc-4.7.1/configure \
+ --target=$LFS_TGT \
+ --prefix=/tools \
+ --with-sysroot=$LFS \
+ --with-newlib \
+ --without-headers \
+ --with-local-prefix=/tools \
+ --with-native-system-header-dir=/tools/include \
+ --disable-nls \
+ --disable-shared \
+ --disable-multilib \
+ --disable-decimal-float \
+ --disable-threads \
+ --disable-libmudflap \
+ --disable-libssp \
+ --disable-libgomp \
+ --disable-libquadmath \
+ --enable-languages=c \
+ --with-mpfr-include=$(pwd)/../gcc-4.7.1/mpfr/src \
+ --with-mpfr-lib=$(pwd)/mpfr/src/.libs</kbd>
</pre>
<div class="variablelist">
<p class="title">
- <b>configure オプションの意味:</b>
+ <b>configure オプションの意味:</b>
</p>
<dl>
<dt>
<span class="term"><em class=
- "parameter"><code>--disable-shared</code></em></span>
+ "parameter"><code>--with-newlib</code></em></span>
</dt>
<dd>
<p>
- このオプションは内部ライブラリをスタティックライブラリとしてリンクすることを指示します。
- ホストシステムに関係しそうな問題を回避するためです。
+ この時点では利用可能な C ライブラリがまだ存在しません。 したがって libgcc のビルド時に
+ inhibit_libc 定数を定義します。 これを行うことで、libc
+ サポートを必要とするコード部分をコンパイルしないようにします。
</p>
</dd>
<dt>
<span class="term"><em class=
- "parameter"><code>--disable-decimal-float, --disable-threads,
- --disable-libmudflap, --disable-libssp,
- --disable-libgomp</code></em></span>
+ "parameter"><code>--without-headers</code></em></span>
</dt>
<dd>
<p>
- これらのオプションは順に、十進浮動小数点制御、スレッド処理、libmudflap、libssp、libgomp
- のサポートをいずれも無効にすることを指示します。
- これらの機能を含めていると、クロスコンパイラをビルドする際にはコンパイルに失敗します。
- またクロスコンパイルによって一時的な libc ライブラリを構築する際には不要なものです。
+ 完璧なクロスコンパイラーを構築するなら、GCC はターゲットシステムに互換性を持つ標準ヘッダーを必要とします。
+ 本手順においては標準ヘッダーは必要ありません。 このスイッチは GCC がそういったヘッダーを探しにいかないようにします。
</p>
</dd>
<dt>
<span class="term"><em class=
- "parameter"><code>--disable-multilib</code></em></span>
+ "parameter"><code>--with-local-prefix=/tools</code></em></span>
</dt>
<dd>
<p>
- x86_64 に対して LFS は まだ multilib のサポートをしていません。 このオプション指定は x86
- には無関係です。
+ ローカルプリフックス (local prefix) は、GCC
+ がローカルにインストールされているインクルードファイルを探しにいくディレクトリを意味します。 そのデフォルトは
+ <code class="filename">/usr/local</code> です。 この設定を
+ <code class="filename">/tools</code> とすることで、GCC が探し出すパスから
+ <code class="filename">/usr/local</code> を除外します。
</p>
</dd>
<dt>
<span class="term"><em class=
- "parameter"><code>--enable-languages=c</code></em></span>
+ "parameter"><code>--with-native-system-header-dir=/tools/include</code></em></span>
+ </dt>
+ <dd>
+ <p>
+ GCC がシステムヘッダーを探し出すデフォルトのパスは <code class=
+ "filename">/usr/include</code> です。 後に root を変更する際には、このディレクトリは
+ <code class="filename">$LFS/usr/include</code> となります。
+ しかしこの直後の2つの作業を通じて、ヘッダーをインストールする先は <code class=
+ "filename">$LFS/tools/include</code> としています。 つまり本スイッチは GCC
+ がヘッダーを正しく見つけ出せるようにするものです。 GCC
+ の2回めのビルドでは、同じスイッチを用いて、ホストシステムのヘッダーは一切見つけ出さないようにします。
+ </p>
+ </dd>
+ <dt>
+ <span class="term"><em class=
+ "parameter"><code>--disable-shared</code></em></span>
</dt>
<dd>
<p>
- このオプションは C コンパイラのみビルドすることを指示します。 この時点で必要なのはこの言語だけだからです。
+ このオプションは内部ライブラリをスタティックライブラリとしてリンクすることを指示します。
+ ホストシステムに関係しそうな問題を回避するためです。
</p>
</dd>
<dt>
<span class="term"><em class=
- "parameter"><code>--with-gmp-include=...</code></em></span>
+ "parameter"><code>--disable-decimal-float, --disable-threads,
+ --disable-libmudflap, --disable-libssp, --disable-libgomp,
+ --disable-libquadmath</code></em></span>
</dt>
<dd>
<p>
- このオプションは GCC に対して GMP のヘッダファイルの場所を指定するものです。
+ これらのオプションは順に、十進浮動小数点制御、スレッド処理、libmudflap、libssp、libgomp,
+ libquadmath, libiberty, zlib のサポートをいずれも無効にすることを指示します。
+ これらの機能を含めていると、クロスコンパイラーをビルドする際にはコンパイルに失敗します。
+ またクロスコンパイルによって一時的な libc ライブラリを構築する際には不要なものです。
</p>
</dd>
<dt>
<span class="term"><em class=
- "parameter"><code>--with-gmp-lib=...</code></em></span>
+ "parameter"><code>--disable-multilib</code></em></span>
</dt>
<dd>
<p>
- このオプションは GCC に対して GMP のライブラリファイルの場所を指定するものです。
+ x86_64 に対して LFS は まだ multilib のサポートをしていません。 このオプション指定は x86
+ には無関係です。
</p>
</dd>
<dt>
- <span class="term"><em class="parameter"><code>--without-ppl,
- --without-cloog</code></em></span>
+ <span class="term"><em class=
+ "parameter"><code>--enable-languages=c</code></em></span>
</dt>
<dd>
<p>
- このオプションは、PPL および CLooG ライブラリがホストシステムに存在していたとしても、chroot
- 環境ではそれらを利用することが出来ないため、リンクしないようにします。
+ このオプションは C コンパイラーのみビルドすることを指示します。 この時点で必要なのはこの言語だけだからです。
</p>
</dd>
</dl>
<p>
コンパイルが終了しました。 この時点でもテストスイートを実行することはできます。
ただ前にも述べているように、テストスイートのフレームワークがまだ準備できていません。
- さらにこの時点で生成されるプログラムは、すぐに次の生成作業によって置き換えられますから、
- この時点でテストを実行することはあまり意味がありません。
+ さらにこの時点で生成されるプログラムは、すぐに次の生成作業によって置き換えられますから、この時点でテストを実行することはあまり意味がありません。
</p>
<p>
パッケージをインストールします。
<em class="parameter"><code>--disable-shared</code></em>
オプションを指定すると <code class="filename">libgcc_eh.a</code>
を生成せずインストールしません。 Glibc パッケージはこのライブラリに依存しており、ビルドの際に <em class=
- "parameter"><code>-lgcc_eh</code></em> を指定することで利用されます。依存している点は
+ "parameter"><code>-lgcc_eh</code></em> を指定することで利用されます。 依存している点は
<code class="filename">libgcc.a</code> へのシンボリックリンクを生成しておけば問題はありません。
- <code class="filename">libgcc_eh.a</code> に含まれるオブジェクトが、 最終的には
+ <code class="filename">libgcc_eh.a</code> に含まれるオブジェクトが、最終的には
<code class="filename">libgcc.a</code> の中にも含まれることになるからです。
</p>
<pre class="userinput">
<kbd class=
-"command">ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \
- sed 's/libgcc/&_eh/'`</kbd>
+"command">ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`</kbd>
</pre>
</div>
<div class="content" lang="ja" xml:lang="ja">
<p>
本パッケージの詳細は <a class="xref" href=
"../chapter06/gcc.html#contents-gcc" title=
- "6.16.2. GCC の構成">6.16.2.「GCC の構成」</a> を参照してください。
+ "6.17.2. GCC の構成">6.17.2.「GCC の構成」</a>を参照してください。
</p>
</div>
</div>
<ul>
<li class="prev">
<a accesskey="p" href="binutils-pass1.html" title=
- "Binutils-2.21 - 1回め">前のページ</a>
+ "Binutils-2.22 - 1回め">前のページ</a>
<p>
- Binutils-2.21 - 1回め
+ Binutils-2.22 - 1回め
</p>
</li>
<li class="next">
<a accesskey="n" href="linux-headers.html" title=
- "Linux-2.6.37 API ヘッダ">次のページ</a>
+ "Linux-3.5.2 API ヘッダー">次のページ</a>
<p>
- Linux-2.6.37 API ヘッダ
+ Linux-3.5.2 API ヘッダー
</p>
</li>
<li class="up">
</li>
<li class="home">
<a accesskey="h" href="../index.html" title=
- "Linux From Scratch - Version 6.8">ホーム</a>
+ "Linux From Scratch - Version 7.2">ホーム</a>
</li>
</ul>
</div>