|
debian_jessie_armhf_miniroot †を先に済ませておくこと qemu のインストール †# apt-get install qemu-user-static
#include <stdio.h> int main(){ printf("hello\n"); return 0; } hello.cを作り arm向けにビルドする # arm-linux-gnueabihf-gcc hello.c # file a.out a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=87755657e33fd0d2666512c5e2b584b306d35534, not stripped qemuをインストールした状態なら armバイナリが実行できる # ./a.out hello パッケージの展開 †miniroot/ ディレクトリに自分でビルドした libc, libncurses, bash, busybox を展開する # dpkg -x build/bash/bash_4.3-11+deb8u1_armhf.deb miniroot/ # dpkg -x build/busybox/busybox_1.22.0-9+deb8u1_armhf.deb miniroot/ # dpkg -x build/libc6/libc6_2.19-18+deb8u10_armhf.deb miniroot/ # dpkg -x build/libncurses5/libncurses5_5.9+20140913-1_armhf.deb miniroot/ # dpkg -x build/libncurses5/libtinfo5_5.9+20140913-1_armhf.deb miniroot/ # tree miniroot/ ディレクトリツリーの確認 # cp /usr/bin/qemu-arm-static miniroot/usr/bin/ qemuを miniroot/ 内にコピー # chroot miniroot/ miniroot/ 内にchrootしてみる I have no name!@debian:/# qemuのおかげでARMバイナリのbashが起動する!! I have no name!@debian:/# busybox ls -l busyboxのlsを実行してみる busyboxへのシンボリックリンクを作る I have no name!@debian:/# cd bin/ I have no name!@debian:/bin# busybox ln -s busybox ln I have no name!@debian:/bin# busybox ln -s busybox ls I have no name!@debian:/bin# busybox ln -s busybox mv I have no name!@debian:/bin# busybox ln -s busybox cp lsという名前でbusyboxを呼び出せるようになる I have no name!@debian:/bin# ls -l -rwxr-xr-x 1 0 0 653984 Aug 6 15:38 bash -rwxr-xr-x 1 0 0 494652 Aug 6 15:46 busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 cp -> busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 ln -> busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 ls -> busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 mv -> busybox lrwxrwxrwx 1 0 0 4 Aug 6 15:37 rbash -> bash (rbash は bash -r と同じ制限付きシェル今回は使わない) lrwxrwxrwx 1 0 0 7 Aug 7 02:12 rm -> busybox I have no name!@debian:/# exit chrootを抜けるには exit 最小限の環境を作る †bashとbusyboxがリンクされているライブラリ(シェアドオブジェクト 拡張子.so)を調べる # chroot miniroot/ I have no name!@debian:/# /lib/ld-linux-armhf.so.3 --list /bin/bash libncurses.so.5 => /lib/arm-linux-gnueabihf/libncurses.so.5 (0xf67ad000) libtinfo.so.5 => /lib/arm-linux-gnueabihf/libtinfo.so.5 (0xf6783000) libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xf6770000) libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xf667e000) /lib/ld-linux-armhf.so.3 (0xf6fd7000) I have no name!@debian:/# /lib/ld-linux-armhf.so.3 --list /bin/busybox libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xf66e2000) /lib/ld-linux-armhf.so.3 (0xf6fd7000) それぞれのファイルはシンボリックリンクになっているので実体ファイルを調べる I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libncurses.so.5 lrwxrwxrwx 1 0 0 17 Aug 7 01:13 /lib/arm-linux-gnueabihf/libncurses.so.5 -> libncurses.so.5.9 I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libtinfo.so.5 lrwxrwxrwx 1 0 0 15 Aug 7 02:07 /lib/arm-linux-gnueabihf/libtinfo.so.5 -> libtinfo.so.5.9 I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libdl.so.2 lrwxrwxrwx 1 0 0 13 Aug 6 14:49 /lib/arm-linux-gnueabihf/libdl.so.2 -> libdl-2.19.so I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libc.so.6 lrwxrwxrwx 1 0 0 12 Aug 6 14:49 /lib/arm-linux-gnueabihf/libc.so.6 -> libc-2.19.so I have no name!@debian:/# ls -l /lib/ld-linux-armhf.so.3 lrwxrwxrwx 1 0 0 30 Aug 6 14:49 /lib/ld-linux-armhf.so.3 -> arm-linux-gnueabihf/ld-2.19.so I have no name!@debian:/# exit chrootを抜けるには exit target/ ディレクトリを作り、先ほどの miniroot/ からコピーしていく # mkdir target # mkdir target/bin # mkdir target/usr/bin -p # mkdir target/sbin # mkdir target/lib/arm-linux-gnueabihf/ -p # mkdir target/proc # mkdir target/dev # cp -a miniroot/bin/* target/bin/ # cp -a miniroot/lib/arm-linux-gnueabihf/libncurses.so.5 target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/arm-linux-gnueabihf/libncurses.so.5.9 target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/arm-linux-gnueabihf/libtinfo.so.5 target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/arm-linux-gnueabihf/libtinfo.so.5.9 target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/arm-linux-gnueabihf/libdl.so.2 target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/arm-linux-gnueabihf/libdl-2.19.so target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/arm-linux-gnueabihf/libc.so.6 target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/arm-linux-gnueabihf/libc-2.19.so target/lib/arm-linux-gnueabihf/ # cp -a miniroot/lib/ld-linux-armhf.so.3 target/lib/ # cp -a miniroot/lib/arm-linux-gnueabihf/ld-2.19.so target/lib/arm-linux-gnueabihf/ # cp -a /usr/bin/qemu-arm-static target/usr/bin/ Linuxは起動直後に /sbin/init を筆頭プロセスとして起動するので /sbin/init は /bin/bash へのシンボリックリンクとする # cd target/sbin/ # ln -s ../bin/bash init # cd (homeに戻る) # tree target/ target/ |-- bin | |-- bash | |-- busybox | |-- cp -> busybox | |-- ln -> busybox | |-- ls -> busybox | |-- mv -> busybox | |-- rbash -> bash | `-- rm -> busybox |-- dev |-- lib | |-- arm-linux-gnueabihf | | |-- ld-2.19.so | | |-- libc-2.19.so | | |-- libc.so.6 -> libc-2.19.so | | |-- libdl-2.19.so | | |-- libdl.so.2 -> libdl-2.19.so | | |-- libncurses.so.5 -> libncurses.so.5.9 | | |-- libncurses.so.5.9 | | |-- libtinfo.so.5 -> libtinfo.so.5.9 | | `-- libtinfo.so.5.9 | `-- ld-linux-armhf.so.3 -> arm-linux-gnueabihf/ld-2.19.so |-- proc |-- sbin | `-- init -> ../bin/bash `-- usr `-- bin `-- qemu-arm-static target/ 内に chroot して動作確認 # chroot target/ bash-4.3# ls -l bin/ total 1124 -rwxr-xr-x 1 0 0 653984 Aug 6 15:38 bash -rwxr-xr-x 1 0 0 494652 Aug 6 15:46 busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 cp -> busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 ln -> busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 ls -> busybox lrwxrwxrwx 1 0 0 7 Aug 7 02:12 mv -> busybox lrwxrwxrwx 1 0 0 4 Aug 6 15:37 rbash -> bash lrwxrwxrwx 1 0 0 7 Aug 7 02:12 rm -> busybox # exit (またはCTRL+D) 関連 † |