How to use msys2-crossgcc

クロスコンパイラの初歩的な使い方を説明します。

インストール方法は次の記事を参照してください。

使い方

add.cというファイル名で次の内容のファイルを作成します。
int add(int a, int b) {
    return a + b;
}
コンパイルしてバイナリを生成します。ここでは例として powerpc-elf を指定します。
  • -nostdlib: Cのライブラリ(libc)などをリンクしません。存在しないため指定しないとエラーとなります。
  • -g: 逆アセンブル時にC言語の該当箇所を表示するためデバッグ情報を有効化します。
  • -O: 最適化します。出力される機械語を単純にするために利用しています。外したものと対比してみると良いでしょう。
$ powerpc-elf-gcc -nostdlib -g -O add.c
/opt/cross/lib/gcc/powerpc-elf/4.6.4/../../../../powerpc-elf/bin/ld: 警告: エントリシンボル _start が見つかりません。デフォルトとして 0000000001800054 を使用します
※ 警告は無視します。

出力されたバイナリ(a.out)を逆アセンブルして、どんな機械語が出力されているかを確認します。
  • -S: C言語のソースと対比しながら逆アセンブルします。対象は`-g`付きでコンパイルされている必要があります。
$ powerpc-elf-objdump -S a.out

a.out:     ファイル形式 elf32-powerpc


セクション .text の逆アセンブル:

01800054 <add>:
int add(int a, int b) {
    return a + b;
}
 1800054:       7c 63 22 14     add     r3,r3,r4
 1800058:       4e 80 00 20     blr
引数が`r3`と`r4`で渡されて、戻り値は`r3`で返される様子が読み取れます。

エラー対策

いくつかのアーキテクチャではエラーになるため、対処方法を説明します。

v850 では -mno-prolog-function を追加します。
$ v850-elf-gcc -nostdlib -mno-prolog-function -O -g add.c
/usr/lib/gcc/../../v850-elf/bin/ld: 警告: エントリシンボル _start が見つかりません。デフォルトとして 00100000 を使用します
tilegx, tilepro では -nostdinc を追加します。
$ tilegx-elf-gcc -nostdlib -nostdinc -O -g add.c
/usr/lib/gcc/../../tilegx-elf/bin/ld: 警告: エントリシンボル _start が見つかりません。デフォルトとして 00000000000100e8 を使用します

$ tilepro-elf-gcc -nostdlib -nostdinc -O -g add.c
/usr/lib/gcc/../../tilepro-elf/bin/ld: 警告: エントリシンボル _start が見つかりません。デフォルトとして 00010098 を使用します
ia64, microblaze, rl78 ではリンカを分けて呼びます。
$ ia64-elf-gcc -c -O -g add.c
/tmp/ccfPnyQU.s: Assembler messages:
/tmp/ccfPnyQU.s:19: Warning: Explicit stops are ignored in auto mode
$ ia64-elf-ld add.o
ia64-elf-ld: 警告: エントリシンボル _start が見つかりません。デフォルトとして 40000000000000b0 を使用します

$ microblaze-elf-gcc -c -O -g add.c
$ microblaze-elf-ld add.o
microblaze-elf-ld: 警告: エントリシンボル _start が見つかりません。デフォルトとして 00000050 を使用します

$ rl78-elf-gcc -c -O -g add.c
$ rl78-elf-ld add.o
rl78-elf-ld: 警告: エントリシンボル _start が見つかりません。デフォルトとして 00000000 を使用します

その他

一般的なクロスコンパイラの説明は次の記事を参照してください。
クロスコンパイラで生成したテストコードは次を参照してください。
色々なアーキテクチャに触れて遊ぶ楽しさが伝われば幸いです。