「クロスコンパイル」というのは,簡単にいえば,ターゲットマシンで実行可能なバイナリをホストマシンで作ることです.
GCCがターゲットマシンにできる環境については,前回説明したとおりです.
たとえば,日立のSH-4用のバイナリを作成するには,それ専用のライブラリをリンクしなければなりません.「ターゲット機種とコンパイラバージョンの指定オプション」で行った説明を補足すると,-bオプションの指定の際に-b sh4と指定したときと,指定しないときでリンクするライブラリを変えたり,実行するプリプロセッサ,狭義のコンパイラ,アセンブラ,リンカを変えることが可能です.ただし,通常は間違いを避けるために,クロスコンパイル用GCCは別の名称にして別のディレクトリに置くのが普通です.
例として,日立のSH-4用クロスコンパイル開発環境を構築してみましょう.
まずbinutil,GCC,newlibをダウンロードします.
GCCはバージョン2の最終版であるGCC-2.95.3.tar.gzをhttp://gcc.gnu.org/からダウンロードします.
binutilは最新版のbinutils-2.13.tar.gzを,http://www.dnsbalance.ring.gr.jp/からダウンロードします.
newlibは最新版のnewlib-1.10.0.tar.gzをhttp://sources.redhat.com/newlib/からダウンロードします.
binutilはアセンブラ・リンカその他のツール類を含んでいます.newlibは標準Cライブラリです.RedHatのWebページにありますが,ほかのディストリビューションでも問題ありません.
まずはbinutilsの作成です.
$ tar zxvf binutils-2.13.tar.gz
$ cd binutils-2.13
$ ./configure --target=sh-hitachi-coff --prefix=/usr/local
$ make
$ make install
以上でbinutilsが作成されました.エラーが起きる場合は環境をチェックしてください.
次にGCCの作成です.newlibのヘッダを使うので,両方とも解凍します.
$ tar zxvf gcc-2.95.3.tar.gz
$ tar zxvf newlib-1.10.0.tar.gz
$ cd gcc-2.95.3
$ mkdir work
$ cd work
$ ../configure --target=sh-hitachi-coff
--prefix=/usr/local --with-newlib
--with-headers=/newlib-1.10.0/
newlib/libc/include
$ make LANGUAGES="c"
$ make install LANGUAGES="c"
これでクロスコンパイル用GCCが作成されました.エラーが起きた場合,やはり環境をチェックしてください.
次にnewlibの作成です.
$ cd newlib-1.10.0
$ mkdir work
$ cd work
$ ../configure --target=sh-hitachi-coff --prefix=/usr/local
$ make
$ make install
これでクロスコンパイル環境が作成されました.
main()
{
printf("hello world!!\n");
}
このように単純な“hello world”をtestsh.cとして保存します.
$ sh-hitachi-coff-gcc testsh.c
このようにするとa.outが作成されます.これはSHのcoff環境で動作します.
では,アセンブラコードで比較してみましょう(リスト1,リスト2).
$ cp testsh.c test.c
$ sh-hitachi-coff-gcc -S testsh.c
$ gcc -S test.c
このように,testsh.sのコードはインテルアーキテクチャとは異質のものです.
クロスコンパイル環境を構築すれば,SigmarionやLinuxザウルスSL-A300のためのバイナリを作成することも可能です.ちなみに,SigmarionはCPUにSH-4,SL-A300はXScaleをそれぞれ使用しているので,コンフィグレーションを適切にセットすれば問題なく動作するでしょう.
クロスコンパイルの詳細については,GCCのインストールの回で詳しく説明します.