動(dòng)態(tài)編譯busybox和編譯并安裝busybox
動(dòng)態(tài)編譯busybox和編譯并安裝busybox
動(dòng)態(tài)編譯busybox
進(jìn)入Build Options時(shí),不要選擇Build Busybox as a static binary,其他所有操作步驟跟靜態(tài)編譯一樣,你會(huì)發(fā)現(xiàn)這樣建立的文件系統(tǒng)無(wú)法啟動(dòng),終端上打印出如下消息:
Kernel panic-not synving:No init found. Try passing init=option to kernel.
為什么會(huì)出現(xiàn)這種問(wèn)題呢?這就得回到兩種編譯方式的特點(diǎn)上來(lái)。靜態(tài)編譯時(shí)是將所用到的庫(kù)文件一起編譯了進(jìn)去,而動(dòng)態(tài)編譯時(shí)是在需要時(shí)才調(diào)用相應(yīng)的庫(kù)。我們選擇動(dòng)態(tài)編譯后,沒(méi)有添加任何庫(kù)文件就運(yùn)行,顯然是會(huì)出錯(cuò)的。那么如何查看busybox可執(zhí)行文件里使用的庫(kù)呢。ldd和Readelf都可以顯示。
ldd
下面是查看cat的庫(kù)的結(jié)果,linux-gate.so.1是與內(nèi)核通信的,不用管。所有程序其實(shí)都是通過(guò)ld-linux.so.2來(lái)找?guī)煳募?,它就是一個(gè)中介,必不可少。
#ldd /bin/cat
linux-gate.so.1 => (0x00bfe000)
libc.so.6 => /lib/libc.so.6 (0x00a4a000)
/lib/ld-linux.so.2 (0x00a28000)
readelf
下面是編譯的ARM上的系統(tǒng)的庫(kù)文件查找。
# arm-uclibc-linux-readelf -d busybox
Dynamic section at offset 0xca014 contains 18 entries:
標(biāo)記 類(lèi)型 名稱(chēng)/值
0x00000001 (NEEDED) 共享庫(kù):[libm.so.0]
0x00000001 (NEEDED) 共享庫(kù):[libc.so.0]
0x0000000c (INIT) 0xbe24
0x0000000d (FINI) 0xb2054
0x00000004 (HASH) 0x80e8
0x00000005 (STRTAB) 0xa500
0x00000006 (SYMTAB) 0x8b70
0x0000000a (STRSZ) 3259 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0xda0cc
0x00000002 (PLTRELSZ) 3040 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0xb244
0x00000011 (REL) 0xb1bc
0x00000012 (RELSZ) 136 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x00000000 (NULL) 0x0
從上面的結(jié)果中,我們可以看到,busybox這個(gè)程序使用到了libm.so.0和libc.so.0兩個(gè)庫(kù)文件,實(shí)際上這是2個(gè)符號(hào)鏈接,分別指向libc-0.9.28.so和libuClibc-0.9.28.so。
將以上四個(gè)文件分別拷貝到lib目錄下。按理說(shuō),這樣應(yīng)該就可以了,但是仍然無(wú)法正常運(yùn)行。顯示的錯(cuò)誤信息和剛剛沒(méi)加庫(kù)之前一樣??赡艿脑蛴?種:一是庫(kù)文件沒(méi)有添加全,二是庫(kù)文件沒(méi)有正確被加載。
根據(jù)readelf顯示的結(jié)果應(yīng)該不是第一種原因。那么到底為什么沒(méi)被正確加載呢?原來(lái)庫(kù)文件的加載,還需要一個(gè)共享庫(kù)加載器。找到對(duì)應(yīng)的文件ld-uClibc-0.9.28.so和ld-uClibc.so.0添加到lib目錄下后。運(yùn)行正常。
編譯并安裝busybox
#make
#make install
用 make 命令編譯busybox軟件。
用 make CONFIG_PREFIX=<安裝目錄> install 命令安裝。
如果在命令行中省略CONFIG_PREFIX變量的賦值,則會(huì)安裝缺省值 ./_install 目錄下。CONFIG_PREFIX可以在make menuconfig的配置界面中修改。
編譯好后在busybox目錄下生成子目錄_install,里面的內(nèi)容:
drwxr-xr-x 2 root root 4096 11月 24 15:28 bin
rwxrwxrwx 1 root root 11 11月 24 15:28 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 11月 24 15:28 sbin
Ø bin包含用戶(hù)工具,其中,busybox可執(zhí)行文件就在這個(gè)目錄下,該目錄下其他所有文件都是指向busybox的符號(hào)鏈接
Ø sbin目錄包含操作系統(tǒng)工具,同樣也指向busybox。
Ø linuxrc是一個(gè)鏈接文件,指向busybox。
將文件復(fù)制到你的鏡像根文件夾中。