Presentation is loading. Please wait.

Presentation is loading. Please wait.

クロスコンパイル環境 Scratchbox2 体験記 京都マイクロコンピュータ 小林 哲之 1. はじめに 2007 年 4 月のジャンボリー #14 の「 Emdebian 体 験記」で Scratchbox が紹介されました。 それで興味を持って Scratchbox を試してみまし た。 

Similar presentations


Presentation on theme: "クロスコンパイル環境 Scratchbox2 体験記 京都マイクロコンピュータ 小林 哲之 1. はじめに 2007 年 4 月のジャンボリー #14 の「 Emdebian 体 験記」で Scratchbox が紹介されました。 それで興味を持って Scratchbox を試してみまし た。 "— Presentation transcript:

1 クロスコンパイル環境 Scratchbox2 体験記 京都マイクロコンピュータ 小林 哲之 1

2 はじめに 2007 年 4 月のジャンボリー #14 の「 Emdebian 体 験記」で Scratchbox が紹介されました。 それで興味を持って Scratchbox を試してみまし た。  これはすごい!便利! でも・・・ そんな体験記です。 2

3 目次 Scratchbox とは Scratchbox1 のしくみ Scratchbox1 の問題点 Scratchbox2 Scratchbox2 のしくみ Scratchbox2 の利点 Scratchbox2 の欠点 Scratchbox2 を実際に使ってみる 3

4 Scratchbox とは 最近の多くのオープンソースプロジェクトは $./configure $ make でターゲット環境を自動認識してビルドできる ようになっているが、これはビルドのホストと ターゲットが同一であることが前提になってい るので、クロスコンパイルではうまくいかない 。 Scratchbox はクロスコンパイルでこれを実現す るもの。 http://www.scratchbox.org/ 4

5 Scratchbox1 のしくみ chroot を利用してホストとは独立した仮想のル ートファイルシステムを作り出す。 ( サンドボ ックス )‏ Linux カーネルの binfmt_misc の仕組みを利用し て ARM のバイナリを qemu または sbrsh 上で動作 させる。 コンパイラ、アセンブラ、リンカなどはクロス ツールが動作するようにラッパーを設定する。 5

6 Scratchbox1 の問題点 準備されたものをそのまま使うなら問題ないが 、自分のプロジェクトの環境と整合させるのは 苦労を要する。  NOKIA の maemo プロジェクト用につくられたもの なので暗黙の前提がいろいろある。  ビルドに必要なツールは全てサンドボックス内に持 ち込む必要がある。 6

7 Scratchbox2 http://www.freedesktop.org/wiki/Software/sbox2 Scratchbox と同等の環境を全く別のシンプルな しくみで実現している。 scratchbox.org でなく freedesktop.org でホステ ィングされている。汎用性が高まった。 7

8 Scratchbox2 のしくみ ダイナミックリンクの LD_PRELOAD, dlsym(RTLD_NEXT,...) のしくみを使って、フ ァイル関連のシステムコールをフックしてファ イルのパス名のマッピングを行う。 マッピングのルールは lua というスクリプト言 語で記述できる。 exec のシステムコールもフックしてターゲット のバイナリは qemu または sbrsh 上で実行させる 。 8

9 Scratchbox2 の利点 現在使用しているクロスコンパイラを変更なし で利用できる。 どのディレクトリをどうマッピングさせるかを 柔軟に記述することができる。 コンパクト。シンプル。 コマンドもほとんどがシェルスクリプトなので カスタマイズが容易。 9

10 Scratchbox2 の欠点 まだ完成していない。  バージョン番号が 2.00 でなく 1.99 ドキュメントが不十分。 まだ枯れていないというだけ。 10

11 Scratchbox2 を実際に使ってみる 11

12 インストール http://www.freedesktop.org/wiki/Software/sbox2 からソースアーカイブをダウンロードして展開 する。 (sbox2-1.99.0.23.tar.bz2)‏ $ cd sbox2 $./configure --prefix=$HOME/scratchbox $ sudo make install 12

13 QEMU のインストール QEMU は -drop-ld-preload のオプションを受け 付ける新しいバージョンのものが必要。 http://fabrice.bellard.free.fr/qemu/download.html からソースアーカイブをダウンロード。 (qemu- 0.91.tar.gz)‏ QEMU のコンパイルには gcc-4.x ではだめで gcc- 3.x が必要。 scratchbox2 で必要なのはユーザーモードのエ ミュレータだけなので、不必要なものは disable にして config する。 13

14 QEMU のインストール ( 続 )‏ $./configure --disable-system --disable- sdl --target-list=arm-linux-user -- disable-kqemu $ sudo make install 14

15 $ /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. $ オプション -drop-ld-preload がサポートされていることを確認。 15

16 ターゲットのセットアップ PATH に追加。 ターゲットのルートファイルシステムを展開して、そこに cd してから sb2-init コマンドを使用する。 $ export PATH=$PATH:$HOME/scratchbox/bin $ 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

17 ターゲットのセットアップ(続) 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

18 クロスコンパイルの実行 Ruby をビルドしてみる。 作業ディレクトリは /home/user の下がよい。 ここはデフォルトのマッピングの設定でターゲットにマッピングさ れるようになっている。もし他のディレクトリを使う場合には $HOME/scratchbox/share/scratchbox2/lua_scripts/pathmaps/simple の 00_deault.lua にそのディレクトリのマッピング設定を追加する。 18

19 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

20 [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

21 まとめと感想 Scratchbox2 はまだ荒削りな部分が見られるも のの、なんとか動かしてみることはできた。 自分のプロジェクトに利用するならば Scratchbox1 よりも Scratchbox2 の方が融通が利 く。 Scratchbox2 ではクロスコンパイラと QEMU さ え対応できたら ARM 以外の他のアーキテクチャ でも使えるだろう。 クロスコンパイルをする開発者にとってぜひと も会得しておきたいツール。 21


Download ppt "クロスコンパイル環境 Scratchbox2 体験記 京都マイクロコンピュータ 小林 哲之 1. はじめに 2007 年 4 月のジャンボリー #14 の「 Emdebian 体 験記」で Scratchbox が紹介されました。 それで興味を持って Scratchbox を試してみまし た。 "

Similar presentations


Ads by Google