x86 の ubuntu Linux で ARM 向けクロス開発環境を用意してみよう、のメモ
インストール
たぶん、これだけインストールすればなんとかなりそう。
sudo apt-get install qemu-user-static qemu-user gcc-arm-linux-gnueabihf
テストのソース作成
適当な c のソースを作成する。
// test.c // test c source for ARM // #include <stdio.h> int main(int argc, char* argv[]){ printf("Hello from ARM binary \n"); return 0; }
クロスコンパイル
クロス用のコンパイラを使えばそのままARM実行ファイルが作成できる。
arm-linux-gnueabi-gcc test.c
これでARMの実行ファイルができている。fileコマンドで調べればARMとなっている。
このままだとだめである。 arm-linux-gnueabi-gcc 用のライブラリにリンクしていないからである。だから静的に必要なライブラリにリンクする。
arm-linux-gnueabi-gcc -static test.c
これで作成できた。
ARM実行ファイルをx86環境で実行
こうして作成した、ARMの実行ファイルはx86で実行できる。
./a.out
ARMの実行ファイルがなぜx86環境で実行できたのだろう?
これは、Linux の binfmt_miscという設定で、ARM の実行ファイルが qemu-user-static にわたされて実行されているからである。つまり、影で qemuがARMのCPUをエミュレート?しているのだ。
これで、x86環境でもARM実行形式がうごかせるようになった。
Makefile のターゲットでクロスコンパイルするときのコンパイラ(CC)を arm-linux-gnueabi-gcc にして、フラグ(CFLAGS)にstatic を追加すればよいのだ。
これでx86でテスト実行が可能になった。