以下省略!

タイダルウ(ry ほぼ毎日1記事執筆運動実施中。 ※記事に広告(アフィリエイト)リンクを掲載している場合があります。

ARMでクロスコンパイルしたやつを母艦で実行してみる

f:id:abyssluke:20161222165544p:plain:w200:left何気に、Air Card向けのARMクロスコンパイル環境を構築したわけだが、実機で動かす前に母艦PCで試しに動かしてみたアレ。QEMUを使う故、記事画像はQEMUのサイト。書いていたらちょっと長くなったので続きを読むから。

目次

ユーザーモードエミュレータのインストールじゃ

まずqemu-user or qemu-user-staticをインストールする(static版のほうがいいかも)。仮想マシンでお馴染みQEMUユーザーモード版。他のCPU(ARMとかMIPSとか)向けに作られたバイナリをQEMUを介して実行できる。

$ apt-get install qemu-user-static

そして起動へ…

そのあと、qemu-(CPUタイプ) (バイナリ)みたいな感じで起動する。マシンエミュレート時とは異なりsystem抜きであることに注意。ARMの場合は以下のようにする(qemu-user-staticをインストールした場合はCPUタイプの後に-staticを追加すること)。

$ qemu-arm-static busybox

ここではARMでクロスコンパイルしたbusyboxを起動している。スタティックリンクでビルドしている場合は普通に起動するはず。

uname(母艦) 対 busybox uname(QEMU)

母艦とQEMUを通したbusyboxuname -mするとこうなる。

$ uname -m
x86_64
$ qemu-arm-static busybox uname -m
armv7l
ダイナミックリンクの罠

なお、ダイナミックリンクの場合はARM向けのライブラリとかを揃えないと動かないのでそこら辺は注意が必要。apt-getでgcc-arm-linux-gnueabiとかをいれたり(必要なライブラリがインストールされる)、ARM向けのライブラリ(libcなど)があるパスをqemu-armの-Lオプションで指定すればいけるかも。

$ qemu-arm sl
/lib/ld-linux.so.3: No such file or directory

蛇足:binfmtのちからってすげー!

qemu-user-staticを入れた場合、インストールの時点でbinfmtの設定がされるためqemu-arm-static 〜などとしなくても直接起動できたりする。
ちなみにbinfmtとはバイナリ実行時に動作するもので、特定のパターンに一致した時に指定されたプログラム等にファイルを投げつけ実行させるカーネルの機能(でいいですよね?)。

$ update-binfmts --display qemu-arm
qemu-arm (enabled):
     package = qemu-user-static
        type = magic
      offset = 0
       magic = \x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
        mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
 interpreter = /usr/bin/qemu-arm-static
    detector = 
$ uname -m
x86_64
$ ./busybox uname -m
armv7l

蛇足2:電圧不足なのかは知らん

今日Air Card IIが届いたのだが、手持ちのカードリーダーでは動作が不安定っぽい。一応Wi-Fi接続先の設定/自動的にWi-Fiに接続するautorun.shの設置はしておいた。あつをリーダーなどの電源入力だけでも動作するAir Card動作報告ありなカードリーダーを買うべきか。