最初に 此処に有る ものは かなり 長い ということです。 buildroot-0.9.27 を 使用するのですが linux-libc-headers-2.4.31.tar.bz2 に 入れ換える という ことを 行います。 最後に hello.c を コンパイルして 実行する というところまで 一式扱うので 長くなります。
まず 現在位置 と buildroot-0.9.27.tar.bz2 を 展開 します。
$ pwd /home/ggg/proj $ ls buildroot-0.9.27.tar.bz2 $ tar jxvf buildroot-0.9.27.tar.bz2
作成された ディレクトリ buildroot/ に 移動します。
$ ls buildroot/ buildroot-0.9.27.tar.bz2 $ cd buildroot/ $ ls -a ./ .defconfig Makefile config.i386 config.powerpc package/ ../ CVS/ config.arm config.mips config.sh4 target/ .cvsignore Config.in config.armeb config.mipsel docs/ toolchain/
make の時に このような 状態で 停止 するのを避けるため 対策を 施します 。
target/jffs2/jffs2root.mk:22: *** ターゲットパターンが `%' を含んでいません。中止。
詳細は
http://lists.uclibc.org/pipermail/uclibc/2004-December/031685.html
を 参考にして頂く事にします。
$ cd target/jffs2/ $ cp jffs2root.mk jffs2root.mk-ORG $ vi jffs2root.mk $ ls CVS/ Config.in Makefile.in jffs2root.mk jffs2root.mk-ORG
これは 行うか どうかは もう 趣味の 領域ですし、この方法が 正鵠である と云う事ではありません。(本当に 参考ということです)
通常は ”linux-libc-headers-2.4.27.tar.bz2” を 使用するのですが 今回 ”linux-libc-headers-2.4.31.tar.bz2”を 使用してみます。繰り返しになりま すが あくまで 趣味の領域です。参考の資料 として
https://summersoft.fay.ar.us/repos/dwall/trunk/buildroot/toolchain/kernel-headers/kernel-headers.mk
があります。
$ cd - /home/ggg/proj/buildroot $ cd toolchain/kernel-headers/ $ cp Config.in Config.in-ORG $ cp kernel-headers.mk kernel-headers.mk-ORG $ vi Config.in $ vi kernel-headers.mk $ ls CVS/ Makefile.in linux-libc-headers-2.6.8-cleanup.patch Config.in kernel-headers.mk Config.in-ORG kernel-headers.mk-ORG $ cd - /home/ggg/proj/buildroot
これで make menuconfig の 準備が できました。
ほたら
$ make menuconfig
”Use the daily snapshot” は uClibc と BusyBox 両方とも 無効にします。 これは 最新の ”snapshot”を 使おうとした時 個猫 の環境では 上手くゆかな かった という点で 使用を 諦めました。
また 後になるのですが 手動で ” dl”ディレクトリ を作成して そこに 必要なファイルをコピー します。 これは ”buildroot-0.9.27” いうものが 少々 古いので 必要な ファイルを ダウンロード する場合に ファイルの場所 が (”buildroot-0.9.27”が そのと きの 最新 であれば 有効で有った と考えられるのですが )現状では 移動さ れていたりして その都度 ”make ”が 停止する という状況を 避けるために 行います。以下のものが 参考に なるかもしれません。えいごです。
http://buildroot.uclibc.org/buildroot.html
Offline builds
$ make source
”dl” ディレクトリ を 作成して 必要となる ファイルを コピー します。
$ mkdir dl $ cd dl $ cp ../../../dokoka/hozonnsaki/buildroot/dl/* . $ ls binutils-2.15.91.0.2.tar.bz2 genext2fs_1.3.orig.tar.gz busybox-1.00.tar.bz2 linux-libc-headers-2.4.31.tar.bz2 ccache-2.3.tar.gz sed-4.1.2.tar.gz gcc-3.4.2.tar.bz2 uClibc-0.9.27.tar.bz2 $ cd - /home/ggg/proj/buildroot
これで ファイルを探して ダウンロードする 事が 無くなります。
へたら make します。
$ pwd /home/ggg/proj/buildroot $ make $ ls -a ./ .tmpconfig.h config.i386 package/ ../ CVS/ config.mips root_fs_i386.ext2 .config Config.in config.mipsel target/ .config.cmd Makefile config.powerpc toolchain/ .config.old build_i386/ config.sh4 toolchain_build_i386/ .cvsignore config.arm dl/ .defconfig config.armeb docs/ $ ls build_i386/ busybox-1.00/ genext2fs-1.3/ root/ staging_dir/ $ ls build_i386/root/ bin/ etc/ lib/ mnt/ proc/ sbin/ usr/ dev/ home/ linuxrc@ opt/ root/ tmp/ var/
これにて 一件ちゃくちゃく でございます。
いままでは ”root”で 実行する 場合は 皆無 でした これ以降では ”root” に なる必要が 発生します。本当は もっとスマートな方法が 有るのでしょうが 見つけられなかったので こういう方法を 取った と云う事です。したがってこ れ以降の事を行う場合は。
この作業はコンピュータに損害を与える可能性があります。
と 一応のお断りを しておきます。場所を 適当に決めます。
$ cd $ mkdir work/ $ cd work/ $ ls -a ./ ../
個別に 一々 指定するのも何なので
$ export PATH=$PATH:~/proj/buildroot/build_i386/staging_dir/bin
参考資料 として
https://summersoft.fay.ar.us/repos/dwall/trunk/buildroot/docs/buildroot.html
Using the uClibc toolchain
が 有るようです。
正直にいうとパクリです。個猫 は C に 対しては 無知なもんですから
$ vi hello.c $ cat hello.c #include <stdio.h> int main() { puts("hello world!"); return 0; }
では コンパイルしましょう。
$ i386-linux-gcc -o hello hello.c
はい 出来ました お疲れさまでした
$ ls -l | sed 1d -rwxr-xr-x 1 ggg users 4446 2月 12日 21:08 hello* -rw-r--r-- 1 ggg users 75 2月 12日 21:02 hello.c $ file hello hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), \ dynamically linked (uses shared libs), not stripped $ ldd hello /usr/bin/ldd: line 154: ./hello: そのようなファイルやディレクトリはありません $ ./hello -bash: ./hello: そのようなファイルやディレクトリはありません
個猫 は 茫然自失 です ああーー!
つまり 無視 されているのです。hello を 何処か 無視されない 場所に コ -ピーして実行する。
途中を 端折って いるのは良くないのですが ” /buildroot/build_i386/root/” という ディレクトリが 有りました。
$ ls /home/ggg/proj/buildroot/build_i386/root/ $ ls /home/ggg/proj/buildroot/build_i386/root/sbin/ fdisk@ ifconfig@ insmod@ modprobe@ rmmod@ swapoff@ getty@ ifdown@ klogd@ pivot_root@ route@ swapon@ halt@ ifup@ ldconfig* poweroff@ start-stop-daemon@ syslogd@ hwclock@ init@ lsmod@ reboot@ sulogin@ udhcpc@
そこの ”sbin/” ディレクトリに ”hello” を コピー します。コピーす る事は 別に ”root”に なる 必要は 有りませんが もう此処で ”root”に なっ て処理します。
$ su - Password: # cd /home/ggg/proj/buildroot/build_i386/root/ # ls -a ./ bin/ etc/ lib/ mnt/ proc/ sbin/ usr/ ../ dev/ home/ linuxrc@ opt/ root/ tmp/ var/ # cd sbin/ # cp -a ../../../../../work/hello . # ls -l hello -rwxr-xr-x 1 ccc users 4446 Feb 12 21:32 hello* # cd ../../
”/buildroot/build_i386/root/” というところは 一式 ルート ファイル システムが 出来ている という 場所の様なので ここで 動かしてみよう と云 う事です。
ここで ”root”に なるのでしょうが もうなっています。
# chroot root/ /bin/ash BusyBox v1.00 (2010.02.12-12:01+0000) Built-in shell (ash) Enter 'help' for a list of built-in commands. # cd sbin/ # ./hello hello world! # ldd hello ldd: can't open cache '/etc/ld.so.cache' libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40007000) libc.so.0 => /lib/libc.so.0 (0x4000d000) ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x40000000) # ldconfig # ldd hello libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40008000) libc.so.0 => /lib/libc.so.0 (0x4000e000) ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x40000000) # ./hello hello world! # exit # pwd /home/ggg/proj/buildroot/build_i386
これで 実行 する事が 出来ました。 無視 されなくて 良かった 良かった!
”chroot”で 実行 する事が 出来たのですが 今回の場合は 作成する 側 も 使う側も 同じ ”ARCH”は”i386”という事です。つまり hello という プログ ラムを ”ARCH”が ”i386”の 計算機に 持ってゆき それを 動かす 事が 出来 る筈です。 そうでないと 辻褄が 合いません。しかしながら 無視 されました。 これは /lib に 必要な ファイルが 無いという事が 考えられます。”chroot” で 次の様な場所が 見受けられました。再掲すると。
# ldd hello libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40008000) libc.so.0 => /lib/libc.so.0 (0x4000e000) ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x40000000)
です
それならば 上記のファイルを ”/lib ”に コピー すれば ”chroot”しな くても 実行できる筈 です。では コピー するものと リンクの必要と 思われる ものには リンクを作成しましょう。
本来 ”/lib”に 同じ名前の ファイルが 無い事を 確認してから コピー す べきなのですが(そうしないと いけません)
# cd /lib # cp -a /home/ggg/proj/buildroot/build_i386/staging_dir/lib/libgcc_s.so.1 . # cp -a /home/ggg/proj/buildroot/build_i386/staging_dir/lib/libuClibc-0.9.27.so . # cp -a /home/ggg/proj/buildroot/build_i386/staging_dir/lib/ld-uClibc-0.9.27.so . # ln -s libuClibc-0.9.27.so libc.so.0 # ln -s ld-uClibc-0.9.27.so ld-uClibc.so.0
さて その後で 実行すれば どうなるでしょうか?
はい お待ちかね ”hello”の 実行です。
$ pwd /home/ggg/work $ ./hello hello world! $ ldd hello libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4000f000) libc.so.0 => /lib/libc.so.0 (0x40015000) ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x40000000)
まあ こういうことのようです つまり 必要な ライブラリが 今回の場合は ”/lib”に存在してあれば ”chroot”しなくても いいと云う事です。
いずれにせよ ”root”に なる事が 必要になる という点では 同じです。
おかたずけ♪おかたずけ♪...
# pwd /lib # ls -l ld-uClibc.so.0 # ls -l ld-uClibc.so.0 lrwxrwxrwx 1 root root 19 Feb 12 21:09 ld-uClibc.so.0 -> ld-uClibc-0.9.27.so* # rm ld-uClibc.so.0 ld-uClibc-0.9.27.so # ls -l libc.so.0 lrwxrwxrwx 1 root root 19 Feb 12 21:09 libc.so.0 -> libuClibc-0.9.27.so # rm libc.so.0 libuClibc-0.9.27.so # ls -l libgcc_s.so.1 -rw-r--r-- 1 ccc users 20716 Feb 12 21:01 libgcc_s.so.1 # rm libgcc_s.so.1
しくみが 確認できたので 現状 回復を しておきます。
$ ./hello -bash: ./hello: そのようなファイルやディレクトリはありません
当然の事です。
これで 個猫が 予想 していたものに 近い 事が わかりました。誤解してい る おそれは 十分に 考えられますが、 まあ おおよそ 当たっているのでは!
にゃんたろう 拝!
2010年 2月12日 (金) 23:37:54 JST 作成