戻る

前へ

buildroot 復習 その1

最初に 此処に有る ものは かなり 長い ということです。 buildroot-0.9.27 を 使用するのですが linux-libc-headers-2.4.31.tar.bz2 に 入れ換える という ことを 行います。 最後に hello.c を コンパイルして 実行する というところまで 一式扱うので 長くなります。

buildroot-0.9.27.tar.bz2 の セットアップ

展開・伸長・抜き出し

まず 現在位置 と 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/

前準備 その1

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

前準備 その2

これは 行うか どうかは もう 趣味の 領域ですし、この方法が 正鵠である と云う事ではありません(本当に 参考ということです)

通常は ”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

ほた

$ 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 ディレクトリ

”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

へたら 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/

これにて 一件ちゃくちゃく でございます。

hello.c の コンパイル

いままでは ”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

が 有るようです。

hello.c の作成

正直にいうとパクリです。個猫 は 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 の 実行 その1

つまり 無視 されているのです。hello を 何処か 無視されない 場所に コ -ピーして実行する。

/buildroot/build_i386/root/

途中を 端折って いるのは良くないのですが ” /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/” というところは 一式 ルート ファイル システムが 出来ている という 場所の様なので ここで 動かしてみよう と云 う事です。

chroot

ここで ”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

これで 実行 する事が 出来ました。 無視 されなくて 良かった 良かった!

hello の 実行 その2

”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 作成


前へ

戻る

Copyright © 2006.-2010. nyantarou All Rights Reserved.