5.3. GCC-13.2.0 - 1回め

GCC パッケージは C コンパイラーや C++ コンパイラーなどの GNU コンパイラーコレクションを提供します。

概算ビルド時間: 3.5 SBU
必要ディスク容量: 4.2 GB

5.3.1. クロスコンパイル版 GCC のインストール

GCC は GMP、MPFR、MPC の各パッケージを必要とします。 これらのパッケージはホストシステムに含まれていないかもしれないため、以下を実行してビルドの準備をします。 個々のパッケージを GCC ソースディレクトリの中に伸張 (解凍) し、ディレクトリ名を変更します。 これは GCC のビルド処理においてそれらを自動的に利用できるようにするためです。

[注記]

注記

本節においては誤解が多く発生しています。 ここでの手順は他のものと同様であり、手順の概要 (パッケージビルド手順) は説明済です。 まず初めに gcc-13.2.0 の tarball を伸張 (解凍) し、生成されたソースディレクトリに移動します。 それに加えて本節では、以下の手順を行うものとなります。

tar -xf ../mpfr-4.2.0.tar.xz
mv -v mpfr-4.2.0 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc

x86_64 ホストにおいて、64 ビットライブラリに対するデフォルトのディレクトリ名はlibです。

case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
 ;;
esac

GCC のドキュメントでは、専用のビルドディレクトリを作成することが推奨されています。

mkdir -v build
cd       build

GCC をコンパイルするための準備をします。

../configure                  \
    --target=$LFS_TGT         \
    --prefix=$LFS/tools       \
    --with-glibc-version=2.38 \
    --with-sysroot=$LFS       \
    --with-newlib             \
    --without-headers         \
    --enable-default-pie      \
    --enable-default-ssp      \
    --disable-nls             \
    --disable-shared          \
    --disable-multilib        \
    --disable-threads         \
    --disable-libatomic       \
    --disable-libgomp         \
    --disable-libquadmath     \
    --disable-libssp          \
    --disable-libvtv          \
    --disable-libstdcxx       \
    --enable-languages=c,c++

configure オプションの意味

--with-glibc-version=2.38

このオプションは、ターゲットにおいて用いられることになる Glibc のバージョンを指定します。 これはホストディストリビューションにある libc のバージョンとは関係がありません。 1 回めの GCC によってコンパイルされるものは、すべて chroot 環境内で実行されるものであって、ホストにある libc とは切り離されているためです。

--with-newlib

この時点では利用可能な C ライブラリがまだ存在しません。 したがって libgcc のビルド時に inhibit_libc 定数を定義します。 これを行うことで、libc サポートを必要とするコード部分をコンパイルしないようにします。

--without-headers

完璧なクロスコンパイラーを構築するなら、GCC はターゲットシステムに互換性を持つ標準ヘッダーを必要とします。 本手順においては標準ヘッダーは必要ありません。 このスイッチは GCC がそういったヘッダーを探しにいかないようにします。

--enable-default-pie と --enable-default-ssp

このスイッチは GCC がプログラムをコンパイルする際にデフォルトとして、堅牢なセキュリティ機能(詳しくは PIE と SSP に関するメモ 参照)をある程度含める指示を行います。 厳密には、この段階で必要となるものではありません。 と言うのも、ここでのコンパイラーは一時的な実行ファイルを生み出すだけのものだからです。 ただし一時的なパッケージだとしても、最終形とするパッケージにできるだけ近づけておけば、理解しやすくなります。

--disable-shared

このスイッチは内部ライブラリをスタティックライブラリとしてリンクすることを指示します。 共有ライブラリが Glibc を必要としており、処理しているシステム上にはまだインストールされていないためです。

--disable-multilib

x86_64 に対して LFS は multilib のサポートをしていません。 このオプション指定は x86 には無関係です。

--disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx

これらのオプションは順に、スレッド処理、libatomic, libgomp, libquadmath, libssp, libvtv, C++ 標準ライブラリのサポートをいずれも無効にすることを指示します。 これらの機能を含めていると、クロスコンパイラーをビルドする際にはコンパイルに失敗するかもしれません。 またクロスコンパイルによって一時的な libc ライブラリを構築する際には不要なものです。

--enable-languages=c,c++

このオプションは C コンパイラーおよび C++ コンパイラーのみビルドすることを指示します。 この時点で必要なのはこの言語だけだからです。

GCC をコンパイルします。

make

パッケージをインストールします。

make install

ここでの GCC ビルドにおいては、内部にあるシステムヘッダーファイルをいくつかインストールしました。 そのうちの limits.h というものは、対応するシステムヘッダーファイルである limits.h を読み込むものになっています。 そのファイルはここでは $LFS/usr/include/limits.h になります。 ただし GCC をビルドしたこの時点において $LFS/usr/include/limits.h は存在していません。 したがってインストールされたばかりの内部ヘッダーファイルは、部分的に自己完結したファイルとなり、システムヘッダーファイルによる拡張された機能を含むものになっていません。 Glibc をビルドする際にはこれでもかまわないのですが、後々内部ヘッダーファイルは完全なものが必要になります。 以下のようなコマンドを通じて、その内部ヘッダーファイルの完成版を作り出します。 このコマンドは GCC ビルドが通常行っている方法と同じものです。

[注記]

注記

以下に示すコマンドは、2 つの手法、つまりバッククォートと $() 構文を使って、ネスト化したコマンド置換を行う例を示しています。 これは、両方の置換において一つの手法のみを使って書き換えることもできます。 ただしここでは、両者を混在させても実現できることを示すものです。 一般的には $() 構文による手法がよく用いられます。

cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h

本パッケージの詳細は 「GCC の構成」を参照してください。