クロスコンパイル環境 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
© Copyright 2024 ExpyDoc