fu7mu4’s diary

はてなダイアリーから移転しました。

ARM exe on x86 Linux のテストダブル環境の準備

x86ubuntu Linux で ARM 向けクロス開発環境を用意してみよう、のメモ

インストール

たぶん、これだけインストールすればなんとかなりそう。

sudo apt-get install qemu-user-static qemu-user gcc-arm-linux-gnueabihf

gcc-arm-linux-gnueabihf は、クロスコンパイラといい、x86環境でARMバイナリを作成できる。

テストのソース作成

適当な 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でテスト実行が可能になった。