ARM エミュレータ環境はなぜ必要なのか
RaspberryPI を始めとするBareMetal やスマートフォン等に広く搭載されているプロセッサです。Core i7 などのIntel 製プロセッサとは命令セットが異なるため、ARM プロセッサ用バイナリをPCで実行することはできません。
ちょっとしたプログラムを作成し、ARM 環境での動作確認をしたい場合でも、ターゲットとなるボードがなければ実行できないのは大変不便です。
そこでQEMU という有名なエミュレータソフトウェアを用いてお手軽にARMエミュレータ 環境を作成し、簡単なプログラムを動かす方法を解説します。環境はUbuntu を想定しています。またプログラム例はC言語となります。
ユーザーモードエミュレーションの利用
今回の方法ではユーザーモードエミュレーションというQEMU の機能を利用します。これはARM 環境を完全にエミュレートするのではなく、PC上でARMバイナリをユーザーモードで動作させ、プロセスとして起動する、というものです。QEMU というと、仮想環境のイメージ等を用意しなkればいけないイメージですが、ユーザーモードエミュレーションは以下に示すように大変簡単に実行できます。
環境のセットアップ
ユーザーモードエミュレーションのQEMU をインストールします。
$ sudo apt-get install qemu-user-static
次にARM 用のgcc をインストールします。
$ sudo apt-get install gcc-arm-linux-gnueabi
これで環境が整いました。
プログラムの作成とコンパイル
なんでもいいのですが、以下のような簡単なプログラムを作成します。
#include <stdio.h>
int
main(int argc, char *argv[])
{
int a = 100;
printf("Hello,World\n");
printf("a:%d, &a:%p\n",a,&a);
return 0;
}
コンパイルします。
$ arm-linux-gnueabi-gcc sample.c
readelf で出来上がったa.out がARM 向けバイナリであることを見てみます。
$ arm-linux-gnueabi-readelf -h a.out
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x833c
Start of program headers: 52 (bytes into file)
Start of section headers: 4536 (bytes into file)
Flags: 0x5000202, has entry point, Version5 EABI, soft-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 30
Section header string table index: 27
Machine がARM になっています。
作成したバイナリをQEMU で実行する
実行します。qemu-arm-static
コマンドを使いユーザーモードエミュレーションで起動します。-L
で指定しているのはARM 向けライブラリです。これは前半で説明したインストール時に同時に導入されているはずです。
$ qemu-arm-static -L /usr/arm-linux-gnueabi a.out
Hello,World
a:100, &a:0xf6fff44c
おわりに
QEMU ユーザーモードエミュレーションによるARM エミュレータ環境を解説しました。Ubuntu であればapt-get
のみで環境が整ってしまうお手軽さが魅力です。