フリースタンディングな GCC 5.3 をビルド on Ubuntu 15.10
自作 OS 製作などでお世話になるフリースタンディングな GCC をビルドする手順のメモ。完全にきれいな環境でビルドしたわけではなく、依存関係をすべてメモに記載できていない。手順通りにビルドしてもツールが不足していたりしてエラーになることがあるが、悪しからず。
binutils
GCC のクロスコンパイラを作るには、対応する binutils も必要になるのでビルド。binutils は執筆時点の最新をダウンロード。
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.26.tar.bz2
$ tar xf binutils-2.26.tar.bz2
$ cd binutils-2.26/
$ ./configure --prefix=$HOME/gcc-5.3.0-i686-elf --target=i686-elf
$ make -j4
$ make install
--prefix
はツールのインストール先なので自由に設定。--target
は今回は PC で動く OS をビルドしたかったので、シンプルに i686-elf
を選択。GCC のターゲットは「CPU ファミリまたはモデル」「ベンダ名」「OS 名」の三つ組で表す(参考:Target Triplet - OSDev Wiki)が、ベンダ名は省略可能なので省略した。そして自作 OS の名前なんて GCC が知るわけもないので、OS 名と言いつつ、汎用に使える elf にしておく。ELF はよく普及していてツール間の互換性が良い。
GCC
GCC 本体と依存ライブラリをダウンロードする。依存ライブラリは最新バージョンを使う必要性はないので、GCC のマニュアル に記載のバージョンを使うことにする。これらのバージョンなら確実にビルドできることが確認されていて安心だ。
$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2
$ wget http://ftp.jaist.ac.jp/pub/GNU/gmp/gmp-4.3.2.tar.bz2
$ wget http://ftp.jaist.ac.jp/pub/GNU/mpfr/mpfr-2.4.2.tar.bz2
$ wget http://www.multiprecision.org/mpc/download/mpc-0.8.1.tar.gz
それぞれ展開して、ライブラリのディレクトリ名と位置を、GCC のビルドスクリプトが認識できるように調整する。
$ tar xf gcc-5.3.0.tar.bz2
$ tar xf gmp-4.3.2.tar.bz2
$ tar xf mpfr-2.4.2.tar.bz2
$ tar xf mpc-0.8.1.tar.gz
$ mv gmp-4.3.2 gcc-5.3.0/gmp
$ mv mpfr-2.4.2 gcc-5.3.0/mpfr
$ mv mpc-0.8.1 gcc-5.3.0/mpc
いよいよビルドする。GCC はソースコードと別のディレクトリでビルドすることが公式に推奨されている。
$ mkdir build
$ cd build
$ ../gcc-5.3.0/configure --prefix=$HOME/gcc-5.3.0-i686-elf --target=i686-elf \
--enable-languages=c,c++ --without-nls --without-headers
$ make -j4 all-gcc
$ make install-gcc
--prefix
と --target
は binutils と同じものを指定する。--enable-languages
は自分が使いたいプログラミング言語を指定する。数が少ないほどビルド時間が短くなる。--without-nls
は母国語サポート(Native Language Support)を無効にするオプション。コンパイルエラーなどを母国語で出す機能はいらないので削った。欲しい人は指定しないでおこう。
--without-headers
は自作 OS 向けクロスコンパイラのビルドに(ほぼ)必須のオプション。これを付けないと、ターゲットシステム向けの C 言語標準ライブラリがあることを要求される。自作 OS をコンパイルするときに標準ライブラリなんてないのだからこのオプションが必要なのだ。このオプションを付けなくてよいのは、自作 OS の上 で動くアプリ用のコンパイラを作るときである。
make
に指定した all-gcc
と install-gcc
は、これを付けないとビルドエラーが出る。libstdc++ とかのビルドをしようとしてコケるようだ。そりゃ自作 OS のビルド時に C++ 標準ライブラリなんて存在しないわ。