【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

クロスコンパイラ

第7回 IT初心者勉強会 アセンブラ大会に参加しました。色々なCPUのアセンブリ言語を比較していて、とても楽しかったです。

そこで使われていたクロスコンパイラをWindows用にビルドしたので配布します。MSYS用です。MSYSはgccを動かすのに特化しており、Cygwinより手軽です。インストール方法はこちらを参照してください。

インストール

/usr/localに展開するだけで完了です。以下にPowerPCのインストール例を示します。他のアーキテクチャのインストール方法も同様です。

$ mkdir /usr/local
$ tar xvJf gcc-4.6.1-msys-cross-powerpc-elf.tar.xz -C /usr/local

※ 既に/usr/localが存在する場合、mkdirは不要です。

使い方

配布バイナリにはlibcが含まれていないため、実行ファイルを出力する際には -nostdlib オプションを付けてください。出力ファイルを指定しないと a.out というファイル名で出力されます。

以下にPowerPCでの使用例を示します。他のアーキテクチャも同様です。

$ powerpc-elf-gcc -nostdlib hello.c
$ file a.out
a.out: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped

詳しい使い方は全資料に含まれるMakefileを参照してください。

ビルド手順

バイナリを使うだけなら必要ないのですが、参考までに配布物のビルド手順を書いておきます。

IT初心者勉強会環境構築方法とは若干異なります。

  • 勉強会のサンプルではlibcを使っていないため、newlibは省略しています。
  • gccのバージョンを4.6.1に上げました。
依存ライブラリ

まずgcc-4.6.1の依存ライブラリをビルドします。

  • gmp-5.0.2.tar.bz2
$ tar xvjf gmp-5.0.2.tar.bz2
$ cd gmp-5.0.2
$ ./configure
$ make
$ make install
  • mpfr-3.0.1.tar.xz
$ tar xvJf mpfr-3.0.1.tar.xz
$ cd mpfr-3.0.1
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure
$ make
$ make install
  • mpc-0.9.tar.gz
$ tar xvzf mpc-0.9.tar.gz
$ cd mpc-0.9
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure
$ make
$ make install
binutils/gcc

binutilsgccは各アーキテクチャでソースを共用するため、ソースの外でビルドします。このようにすれば、ソースの展開は1回で済みます。

$ tar xvjf binutils-2.21.1.tar.bz2
$ tar xvjf gcc-core-4.6.1.tar.bz2

以下にPowerPC用クロスコンパイラのビルド手順を示します。

$ mkdir powerpc-elf
$ cd powerpc-elf
$ mkdir binutils
$ cd binutils
$ ../../binutils-2.21.1/configure --target=powerpc-elf
$ make
$ make install
$ cd ..
$ mkdir gcc
$ cd gcc
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ../../gcc-4.6.1/configure --target=powerpc-elf
$ CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib make all-target-libgcc
$ make install-gcc
$ make install-target-libgcc

他のアーキテクチャはtargetを変えるだけで手順は同様です。ただしMSYSではMIPSのlibgccがメモリ不足でビルドできなかったため、配布バイナリにはNetBSDでビルドしたものを入れています。

アーカイブ

配布バイナリの作成では、make installを一時ディレクトリに対して行いアーカイブしています。

$ cd powerpc-elf/binutils
$ make prefix=/opt install
$ cd ../gcc
$ make prefix=/opt install-gcc
$ make prefix=/opt install-target-libgcc
$ cd /opt
$ find . -name "*.exe" | xargs strip
$ tar cvJf gcc-4.6.1-msys-cross-powerpc-elf.tar.xz *

このようにして作成したバイナリを配布しています。