uchan note

プログラミングや電子工作の話題を書きます

フリースタンディングな 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--targetbinutils と同じものを指定する。--enable-languages は自分が使いたいプログラミング言語を指定する。数が少ないほどビルド時間が短くなる。--without-nls は母国語サポート(Native Language Support)を無効にするオプション。コンパイルエラーなどを母国語で出す機能はいらないので削った。欲しい人は指定しないでおこう。

--without-headers は自作 OS 向けクロスコンパイラのビルドに(ほぼ)必須のオプション。これを付けないと、ターゲットシステム向けの C 言語標準ライブラリがあることを要求される。自作 OS をコンパイルするときに標準ライブラリなんてないのだからこのオプションが必要なのだ。このオプションを付けなくてよいのは、自作 OS の上 で動くアプリ用のコンパイラを作るときである。

make に指定した all-gccinstall-gcc は、これを付けないとビルドエラーが出る。libstdc++ とかのビルドをしようとしてコケるようだ。そりゃ自作 OS のビルド時に C++ 標準ライブラリなんて存在しないわ。