Cのプログラムをx86-64のマシン上でPowerPC向けにコンパイルする
x86-64のマシン + Ubuntu 16.04で、PowerPC 64bit向けにC言語のプログラムをコンパイルする方法を紹介します。俗に言うクロスコンパイルっていうやつです。
以下のように、必要なものをaptで入れます。binutilsにはアセンブラやローダが入っています。
$ sudo apt install gcc-powerpc-linux-gnu binutils-powerpc-linux-gnu
これで環境は整ったので、実際に動かしてみます。まず、以下のファイルをa.cとして保存します。
int fact(int n) { if (n == 1) return 1; return n * fact(n - 1); }
以下のようなコマンドでコンパイルします。わかりやすさのために最適化オプションを無効にし、アセンブリを出力しています。
$ powerpc64-linux-gnu-gcc -S a.c -O0
以下のような(見慣れた?)PowerPCのアセンブリを得ることができました。
.file "a.c" .machine power7 .section ".toc","aw" .section ".text" .align 2 .globl fact .section ".opd","aw" .align 3 fact: .quad .L.fact,.TOC.@tocbase,0 .previous .type fact, @function .L.fact: mflr 0 std 0,16(1) std 31,-8(1) stdu 1,-128(1) mr 31,1 mr 9,3 stw 9,176(31) lwz 9,176(31) cmpwi 7,9,1 bne 7,.L2 li 9,1 b .L3 .L2: lwz 9,176(31) addi 9,9,-1 extsw 9,9 mr 3,9 bl fact mr 9,3 mr 10,9 lwz 9,176(31) mullw 9,9,10 extsw 9,9 .L3: mr 3,9 addi 1,31,128 ld 0,16(1) mtlr 0 ld 31,-8(1) blr .long 0 .byte 0,0,0,1,128,1,0,1 .size fact,.-.L.fact .ident "GCC: (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609"
とても簡単で最高ですね。
ちなみに、今回入ったアプリケーションたちのバージョンはこのような感じでした。
$ powerpc64-linux-gnu-gcc --version powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 ...
$ powerpc64-linux-gnu-as --version GNU assembler (GNU Binutils for Ubuntu) 2.26.1 ...
$ powerpc64-linux-gnu-ld --version GNU ld (GNU Binutils for Ubuntu) 2.26.1 ...