h print this help

クロスコンパイル環境
Scratchbox2
体験記
京都マイクロコンピュータ
小林 哲之
1
はじめに


2007年4月のジャンボリー#14の「Emdebian体験
記」でScratchboxが紹介されました。
それで興味を持ってScratchboxを試してみました。


これはすごい!便利!
でも・・・
そんな体験記です。
2
目次
Scratchboxとは
Scratchbox1のしくみ
Scratchbox1の問題点
Scratchbox2
Scratchbox2のしくみ
Scratchbox2の利点
Scratchbox2の欠点
Scratchbox2を実際に使ってみる
3
Scratchboxとは

最近の多くのオープンソースプロジェクトは

$ ./configure

$ make



でターゲット環境を自動認識してビルドできるように
なっているが、これはビルドのホストとターゲットが
同一であることが前提になっているので、クロスコ
ンパイルではうまくいかない。
Scratchboxはクロスコンパイルでこれを実現するも
の。
http://www.scratchbox.org/
4
Scratchbox1のしくみ



chroot を利用してホストとは独立した仮想のルート
ファイルシステムを作り出す。(サンドボックス)
Linuxカーネルのbinfmt_miscの仕組みを利用して
ARMのバイナリをqemuまたはsbrsh上で動作させ
る。
コンパイラ、アセンブラ、リンカなどはクロスツール
が動作するようにラッパーを設定する。
5
Scratchbox1の問題点

準備されたものをそのまま使うなら問題ないが、自
分のプロジェクトの環境と整合させるのは苦労を要
する。

NOKIAのmaemoプロジェクト用につくられたものなの
で暗黙の前提がいろいろある。

ビルドに必要なツールは全てサンドボックス内に持ち込
む必要がある。
6
Scratchbox2



http://www.freedesktop.org/wiki/Software/sbox2
Scratchboxと同等の環境を全く別のシンプルなしく
みで実現している。
scratchbox.orgでなくfreedesktop.orgでホスティン
グされている。汎用性が高まった。
7
Scratchbox2のしくみ



ダイナミックリンクのLD_PRELOAD,
dlsym(RTLD_NEXT, ...)のしくみを使って、ファイ
ル関連のシステムコールをフックしてファイルのパ
ス名のマッピングを行う。
マッピングのルールはluaというスクリプト言語で記
述できる。
execのシステムコールもフックしてターゲットのバイ
ナリはqemuまたはsbrsh上で実行させる。
8
Scratchbox2の利点




現在使用しているクロスコンパイラを変更なしで利
用できる。
どのディレクトリをどうマッピングさせるかを柔軟に
記述することができる。
コンパクト。シンプル。
コマンドもほとんどがシェルスクリプトなのでカスタ
マイズが容易。
9
Scratchbox2の欠点

まだ完成していない。



バージョン番号が2.00でなく1.99
ドキュメントが不十分。
まだ枯れていないというだけ。
10
Scratchbox2を実際に使ってみる
11
インストール

http://www.freedesktop.org/wiki/Software/sbox2
からソースアーカイブをダウンロードして展開する。
(sbox2-1.99.0.23.tar.bz2)
$ cd sbox2
$ ./configure --prefix=$HOME/scratchbox
$ sudo make install
12
QEMUのインストール




QEMUは -drop-ld-preload のオプションを受け付
ける新しいバージョンのものが必要。
http://fabrice.bellard.free.fr/qemu/download.html
からソースアーカイブをダウンロード。(qemu0.91.tar.gz)
QEMUのコンパイルにはgcc-4.xではだめでgcc3.xが必要。
scratchbox2で必要なのはユーザーモードのエミュ
レータだけなので、不必要なものはdisableにして
configする。
13
QEMUのインストール(続)
$ ./configure --disable-system --disablesdl --target-list=arm-linux-user -disable-kqemu
$ sudo make install
14
オプション -drop-ld-preload がサポートされていることを確認。
$ /usr/local/bin/qemu-arm -h
qemu-arm version 0.9.1, Copyright (c) 2003-2008 Fabrice Bellard
usage: qemu-arm [options] program [arguments...]
Linux CPU emulator (compiled for arm emulation)
Standard options:
-h
print this help
-g port
wait gdb connection to port
-L path
set the elf interpreter prefix
(default=/usr/gnemul/qemu-arm)
-s size
set the stack size in bytes (default=524288)
-cpu model
select CPU (-cpu ? for list)
-drop-ld-preload drop LD_PRELOAD for target process
Debug options:
-d options
activate log (logfile=/tmp/qemu.log)
-p pagesize set the host page size to 'pagesize'
-strace
log system calls
Environment variables:
QEMU_STRACE
Print system calls and arguments similar to the
'strace' program. Enable by setting to any
value.
$
15
ターゲットのセットアップ
PATHに追加。
$ export PATH=$PATH:$HOME/scratchbox/bin
ターゲットのルートファイルシステムを展開して、そこにcdしてからsb2-initコマンドを使用する。
$ sb2-init -h
sb2-init - initialize a target root for scratchbox2
Usage:
sb2-init [OPTION]... [TARGETNAME] [COMPILER]
sb2-init is expected to be run in the directory you want
to use as scratchbox 2 target root.
TARGETNAME is what you want to call this target
COMPILER is of the form /home/koba/arm-2006q3/bin/arm-linux-gcc
Options:
-c "command"
specify cpu transparency command, for example:
"qemu-arm", "sbrsh" or "qemu-arm -m 512"
-r [hostname]
generate sbrsh config using remote device address
-l [hostname]
NFS server/localhost address seen by remote device
-d
set target as default scratchbox2 target
-m [mapping_mode] use mapping_mode as default
-h
print this help
-n
don't build libtool for the target
-s
skip checks for target root's /usr/include etc.
-t [tools_dir]
set directory containing the build tools distribution
-C "options"
add extra options for the compiler, for example:
"-fgnu89-inline"
-v
display version
Examples:
sb2-init ARM arm-linux-gcc
sb2-init -m maemo ARM arm-linux-gcc
sb2-init -sn -c sbrsh armel-debian /path/to/arm-linux-gcc
16
ターゲットのセットアップ(続)
sb2-initコマンドでの重要ポイントは
-c を省略せず、必ずフルパスで指定すること。
例
ターゲットのルートファイルシステム
$ cd ~/kzm/root
$ sb2-init -c "/usr/local/bin/qemu-arm -cpu arm1136"
my_target /opt/kmc/.../bin/arm-linux-gcc
17
クロスコンパイルの実行

Rubyをビルドしてみる。

作業ディレクトリは /home/user の下がよい。
ここはデフォルトのマッピングの設定でターゲットにマッピングされるように
なっている。もし他のディレクトリを使う場合には
$HOME/scratchbox/share/scratchbox2/lua_scripts/pathmaps/simple
の00_deault.lua にそのディレクトリのマッピング設定を追加する。
18
koba@ubuntu-i386:~/kzm/root$ sb2 -t my_target
[SB2 my_target] koba@ubuntu-i386 ~/kzm/root $ cd /home/user
[SB2 my_target] koba@ubuntu-i386 /home/user $ mkdir ruby
[SB2 my_target] koba@ubuntu-i386 /home/user $ cd ruby
[SB2 my_target] koba@ubuntu-i386 /home/user/ruby $ tar xf ~/archives/ruby-1.8.6-p114.tar.bz2
[SB2 my_target] koba@ubuntu-i386 /home/user/ruby $ mkdir obj
[SB2 my_target] koba@ubuntu-i386 /home/user/ruby $ cd obj
[SB2 my_target] koba@ubuntu-i386 /home/user/ruby/obj $ ../ruby-1.8.6-p114/configure
checking build system type... arm-unknown-linux-gnu
checking host system type... arm-unknown-linux-gnu
checking target system type... arm-unknown-linux-gnu
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
...
checking whether ELF binaries are produced... yes
checking whether OS depend dynamic link works... yes
checking for nroff... /usr/bin/nroff
creating config.h
configure: creating ./config.status
config.status: creating Makefile
[SB2 my_target] koba@ubuntu-i386 /home/user/ruby/obj $ ls
Makefile config.h config.log config.status
configureは成功し、Makefileとconfig.hが生成された。
今回使用している環境は uClibc なのでmakefileを一箇所手で修正する必要があった。
(CFLAGSに -D__dietlibc__=1 を追加。)
19
[SB2 my_target] koba@ubuntu-i386 /home/user/ruby/obj $ time make >& errlog
real
0m53.452s
user
0m38.490s
sys
0m14.110s
[SB2 my_target3] koba@ubuntu-i386 /home/user/ruby/obj $ file ./ruby
./ruby: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked
(uses shared libs), not stripped
[SB2 my_target3] koba@ubuntu-i386 /home/user/ruby/obj $ make test
test succeeded
-cpuarm1136[SB2 my_target3] koba@ubuntu-i386 /home/user/ruby/obj $
makeは成功し、rubyの実行ファイルができた。これはARMのバイナリ。
make testも成功。
参考までに同じマシンでネイティブ向けにrubyをmakeした時の所要時間
real 0m34.264s
user 0m25.870s
sys 0m6.600s
20
まとめと感想




Scratchbox2はまだ荒削りな部分が見られるもの
の、なんとか動かしてみることはできた。
自分のプロジェクトに利用するならばScratchbox1
よりもScratchbox2の方が融通が利く。
Scratchbox2ではクロスコンパイラとQEMUさえ対
応できたらARM以外の他のアーキテクチャでも使
えるだろう。
クロスコンパイルをする開発者にとってぜひとも会
得しておきたいツール。
21