それでは、出来上がったバイナリをCPUエミュレータ「QEMU」を使って動かしてみましょう。
今回はBusyBoxのバイナリ単体では動作せず、共有ライブラリを必要とするので、QEMUに対して「-L」オプションで“~/bb_uclibc”へのパスを指定して、ライブラリを読み込めるようにする必要があります(リスト1)。
いかがでしょうか? ちゃんと動作しましたか? 前回と変わりなく動作していると思います。うまくいった方は試しにいくつかコマンドを実行して確認してみてください。もし、動作しない場合はもう一度本稿を参考に設定などの見直しをしてみてください。
$ cd ~/bb_uclibc $ qemu-arm bin/busybox ←「-L」オプションがない場合 /lib/ld-uClibc.so.0: No such file or directory ←ライブラリが見つからない $ qemu-arm -L /home/shinji/bb_uclibc bin/busybox ←「-L」オプションを指定した場合 BusyBox v1.11.1 (2008-08-18 04:10:59 JST) multi-call binary Copyright (C) 1998-2008 Erik Andersen, Rob Landley, Denys Vlasenko and others. Licensed under GPLv2. See source distribution for full notice. (中略) vlock, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip $ qemu-arm -L /home/shinji/bb_uclibc bin/ls -l drwxrwxr-x 2 shinji shinji 4096 Aug 17 19:13 bin drwxr-xr-x 2 shinji shinji 4096 Aug 17 18:36 lib lrwxrwxrwx 1 shinji shinji 11 Aug 17 19:13 linuxrc -> bin/busybox drwxrwxr-x 2 shinji shinji 4096 Aug 17 19:13 sbin drwxrwxr-x 4 shinji shinji 4096 Aug 17 19:13 usr $
リスト1 QEMUに対して「-L」オプションを指定 |
最後に、glibcとuClibcのそれぞれを使ってBusyBoxを構築すると何が違うのかを比較してみたいと思います。
ここでは、それぞれのライブラリごとに静的リンク/動的リンクのBusyBoxを構築してサイズを測ってみます。今回使用したアーキテクチャは「i386」で、glibcのバージョンは「2.8」、uClibcのバージョンは「0.9.29」です。
計測した結果は以下のようになりました(表2)。
glibc(2.8) | uClibc(0.9.29) | |||
---|---|---|---|---|
静的リンク | BusyBoxサイズ | 1424.4KB | BusyBoxサイズ | 710.4KB |
動的リンク | BusyBoxサイズ | 619.3KB | BusyBoxサイズ | 619.1KB |
ライブラリサイズ | 2056.6KB | ライブラリサイズ | 239.4KB | |
動的リンク合計 | 2675.9KB | 動的リンク合計 | 858.5KB | |
表2 glibcとuClibcを比較 |
まず、静的リンク/動的リンクで比較してみましょう。表2から、glibc、uClibcともに動的リンクの合計サイズよりも静的リンクした方が小さくなっていることが分かります。この結果だけを見ると「ライブラリを使わない方がサイズが小さくなってよいのではないか?」と思うかもしれませんが、ターゲットにBusyBox以外のプログラムが複数含まれる場合、すべてのプログラムを静的リンクしてしまうとかえって総ファイルサイズが増えてしまうことになります。そのため、BusyBox以外のプログラムもターゲットに複数組み込む場合は、共有ライブラリを作成して動的リンクする方がよいでしょう。
続いて、glibcとuClibcの違いを見てみましょう。静的リンクの場合ではuClibcを使うことにより半分のサイズに抑えられています。また動的リンクの場合、BusyBox本体のサイズはほぼ一緒になっていますが、BusyBoxが必要とするライブラリ(注3)を含めた合計サイズは、glibcを使った場合と比べて、uClibcを使った場合には2MB近く小さくなっています。
このことから、uClibcがより組み込み向けであることが分かっていただけると思います。
今回はBusyBoxと併せて使われることの多いライブラリ「uClibc」について解説しました。さて次回は、実際に組み込み機器にBusyBox+uClibcによる環境を組み込んでいく予定です。ご期待ください!(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.