gcc クロスコンパイル環境について

研究や仕事で、色々な OS / CPU 上のプログラムをコンパイルしてテスト実行することがよくあります。
たとえば OS では Linux / Solaris / FreeBSD / Mac OS X 等があり、CPU では x86, x86_64, SH4, MIPS, ARM, PowerPC, SPARC 等があります。


これらの OS には gcc 等のコンパイラが入っており、ssh で接続してソースコードを転送し make すれば、一応、コンパイルはできますが、組み込み機器などでハードディスクや CPU が非常に遅い場合は、少しのプログラムをコンパイルする場合でも数十分〜数時間かかってしまうことがあります。


このような場合は gcc をターゲットの OS / CPU に合わせてコンパイルすることによって、手元の高速な PC / ワークステーション上でターゲットの OS / CPU 用のプログラムを高速にコンパイルすることができるようになります。

gcc を任意の OS / CPU に合わせて構築する方法

たとえば手元に Windows XP がインストールされた PC があり、普段の日常生活やプログラミングには Windows を使用している場合で、ターゲットとなるコンピュータが CPU がとても遅い組み込み機器の場合は、手元の Windows XP 上でターゲットとなる機器用のコードを生成できる gcc を構築することによりその機器で動作するバイナリを直接吐き出すことができます。その機器で動くカーネルコンパイルも可能です。
このような手法を「クロスコンパイル」と呼びます。


gcc を用いてクロスコンパイル環境を構築する方法は簡単です。
手元の PC が LinuxFreeBSD であれば当然可能ですが、Windows XP 等の場合でも cygwin を入れれば可能です。


cygwin を入れて適当なディレクトリを作成し、そのディレクトリにターゲットとなる機器からコピーしてきた /usr/include、/lib、/usr/lib 等を置きます。このディレクトリを prefix と呼びます。


gcc を構築するためにはまず cygwin 上で binutils を構築する必要があります。http://core.ring.gr.jp/pub/GNU/binutils/ 等からダウンロードしてきて、tar xzvf で展開します。
configure で --with-included-gettext --target=mipsel-pc-linux-gnu --host=i686-pc-cygwin --build=i686-pc-cygwin --prefix=/tmp/files/ 等と指定して Makefile を生成して make するだけです。すると、「target」で指定した CPU および OS 用のバイナリを扱える binutils を生成できます。


次に gcc を構築します。http://core.ring.gr.jp/pub/GNU/gcc/ 等からダウンロードしてきて同様に展開し、configure で --enable-languages=c,c++ --with-included-gettext --disable-libgomp --enable-shared --enable-threads=posix --target=mipsel-pc-linux-gnu --host=i686-pc-cygwin --build=i686-pc-cygwin --prefix=/tmp/files/ --with-mpfr=/usr/local/ -v 等と指定して make すると、gcc が構築できます。



gcc の構築には数時間かかる場合もあります。一旦、gcc が構築されれば、あとはいつでもその gcc を用いてターゲット機器用のバイナリファイルを生成することができます。

target として指定すべき文字列

binutilsgcc の configure の中身を見てみればわかるのですが、以下のように指定するのが良いようです。

Linux の場合

FreeBSD の場合

Solaris の場合

  • i386-pc-solaris2
  • x86_64-pc-solaris2
  • sparc-sun-solaris2
  • sparc64-sun-solaris2

Mac OS X の場合

  • i686-pc-darwin9
  • x86_64-pc-darwin9
  • powerpc-pc-darwin9
  • powerpc64-pc-darwin9