mattintosh note

どこかのエンジニアモドキの備忘録

Raspberry Pi (ARM) で i386 Linux のバイナリを実行する

Raspberry Pi で Nero AAC Codec(neroAacEnc)を使えるようにしてみた。

f:id:mattintosh4:20160911023334p:plain

ただし、激遅である。

QEMU のビルド

Arch Linux ARM で i386バイナリを実行するためにまずは QEMU のビルドから始める。実用性が低いためか、Pacman にはまだ用意されていない。Raspbian や Ubuntu MATE for Raspberry Pi とかでも必要なパッケージをインストールしておけばビルドできる(はず。Ubuntu MATE は確認済み)。Python 2.x 必須。

git clone httpshttp://git.qemu.org/git/qemu.git
mkdir qemu/build
cd qemu/build
../configure --prefix=/opt/local/qemu --target-list=i386-linux-user --python=/usr/bin/python2
make
make install

i386GNU C Library を用意する

i386GNU C Library が必要になるが、ビルドするのが少々面倒。i386Ubuntu などがあるならそこから引っ張ってくるという手もある。

ld-linux.so.2 どっかに無かったかな〜と思って locate してみたら Chromium のソースディレクトリに入ってた。格納先のコードを見てみたら、どうやら Chromium のビルド用にバイナリ一式を引っ張って来るらしい。ということはこれでビルドの手間を省ける。

元々このソースは本家ではなく、Raspberry Pi の Arch Linux ARM 用として拾ってきたもの。https://aur.archlinux.org/packages/chromium-dev/ に行けば最新版が手に入る。Chromium 本家の方(https://chromium.googlesource.com/chromium/src.git/+/master/build/linux/)でもソースは入手できるが、別途、GYP が必要になる。AUR の方はバイナリがそのまま落ちてくるので楽。難点を挙げれば公式も AUR もファイルサイズがでかい。

AUR のソースの場合、install_script.py を実行すれば chromium/build/linux/debian_wheezy_i386-sysroot が出来るのであとはそれを拝借する。

cd build/linux/sysroot_scripts
python2 install_script.py --arch i386

本家の方は GYP があれば恐らく AUR と同じようにバイナリが落ちてくるんだろうけど、そもそも install-sysroot.pyhttps://chromium.googlesource.com/chromium/src/build/+/master/linux/sysroot_scripts/install-sysroot.py)にバイナリのダウンロードに必要な URL が書かれているのでそれを使った方が手っ取り早いし低コスト。

install-sysroot.py 内の subprocess.call に合わせて書くとこんな感じになる。こちらと AUR の方では i386sysroot の間が -_ という違いがあるのでパス補完を使わない人は注意した方がいいかもしれない。

curl --fail --retry 3 -L -O 'https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/24f935a3d8cdfcdfbabd23928a42304b1ffc52ba/debian_wheezy_i386_sysroot.tgz'

展開してあとは qemu-i386 -L /path/to/debian_wheezy_i386_syroot とでもしておけばよい。

mkdir -p debian_wheezy_i386_sysroot
tar xf debian_wheezy_i386_sysroot.tgz -C debian_wheezy_i386_sysroot

ツールチェインを切り替えることはあまり無いので自分の場合は alias でツールチェインを固定している。-L オプション以外に QEMU_LD_PREFIX 環境変数を使う方法もある。

alias qemu-i386="/opt/local/qemu/bin/qemu-i386 -L /opt/local/debian_wheezy_i386_sysroot"

今回、Raspberry Pii386 のプログラムを実行したかったのは CD の取り込みから WAV 抽出まで自動化したのに、AAC への変換で困っていたから。Libavcodec なんかのフリーの AAC コーデックだと音質があまり良くない(気がする)。本当は qaac で Apple の CoreAudio を使いたかったのだけど、Raspberry Pii386 の WINE を実行できる環境を構築するにはまだ時間が足りない。

Raspberry Pi 世界累計出荷台数1,000万台突破おめでとう!!