http://blog./User/AT91RM9200/Article/47315_1.htm 選定 busybox-1.9.2.tar.bz2 這個(gè)版本, 以靜態(tài)方式編譯, 即生成的 busybox 不需要共享庫的支持就能運(yùn)行。這樣做我們就不需要布署程序庫了,。缺點(diǎn)是自己寫的 arm-linux 程序在這個(gè)根文件系統(tǒng)中是不能運(yùn)行的,因?yàn)槿鄙俟蚕沓绦驇斓闹С?。不過不用擔(dān)心,通過在目標(biāo)機(jī)里以掛接NFS 的方式, 將宿主機(jī)的 arm-linux-gcc 編譯器的庫文件掛到 arm-linux 的 /lib 下, 就可完美的運(yùn)行我們自己的程序了。 現(xiàn)在開始制作靜態(tài)鏈接庫的根文件系統(tǒng),。
1,、準(zhǔn)備根文件系統(tǒng) 首先準(zhǔn)備制作工具BusyBox1.9.2。 準(zhǔn)備交叉編譯工具arm-linux-gcc 3.3.2,。 在機(jī)器上建立rootfs的文件夾 #mkdir rootfs 在rootfs中建立linux系統(tǒng)中典型的文件夾 #cd rootfs #mkdir root home bin sbin etc dev usr lib tmp mnt sys proc #mkdir usr/lib usr/bin #pwd /home/su/rootfs 2,、解壓源碼包 #vi Makefile CROSS_COMPILE ?= 注:這個(gè)版本的 busybox 用 3.4.1 的 arm-linux-gcc 編譯有些問題, 用 3.3.2 版則可順利編譯,。 #make defconfig 進(jìn)到配置選項(xiàng) #make menuconfig 設(shè)置靜態(tài)編譯方式 Busybox Settings ---> Install Options ---> 中輸入建立根文件系統(tǒng)的文件所在的路徑/home/su/rootfs。 其它的默認(rèn),。 編譯出錯(cuò), 信息如下: 按照提示,修改文件 applets/applets.c 第 21 行, 將 執(zhí)行 make 重新編譯 編譯通過, busybox 被生成了, 然后執(zhí)行 busybox 就被安裝到指定的路徑下了/home/su/rootfs,這時(shí)可發(fā)現(xiàn)rootfs下多了個(gè)liunxrc的文件,,bin,、sbin下也多了很多文件。用ls –l命令查看其中的一個(gè)文件,,可發(fā)現(xiàn)其是鏈接到busybox的一個(gè)連接符,,所以我們之后在目標(biāo)機(jī)上運(yùn)行的命令大多都會(huì)調(diào)用busybox這個(gè)文件的。 若之前忘了指定路徑,,默認(rèn)生成到臨時(shí)目錄busybox-1.9.2/_install 下了,。 6、編寫配置/etc下的初始化程序(可省略) 最簡單的做法是把busybox-1.9.2/examples/bootfloppy/etc下的全部文件拷到目標(biāo)文件的etc目錄下 #cd /home/su/busybox-1.9.2/examples/bootfloppy/etc #cp –rf * /home/su/rootfs/etc 也可自己寫這些文件,。 7,、把rootfs做成鏡像 #mkcramfs rootfs rootfs.cramfs 8、把rootfs.cramfs燒寫到目標(biāo)機(jī)中,。 9,、運(yùn)行目標(biāo)機(jī) 這時(shí)會(huì)遇到一個(gè)錯(cuò)誤信息: Can’t open tty2 Can’t open tty3 Can’t open tty4 解決辦法:把/rootfs/etc/ inittab 文件的第三行“tty2::askfirst:-bin/sh”刪除掉。 返回到第7步重做。
現(xiàn)實(shí)中,,動(dòng)態(tài)編譯的方法更適合工程的需要,,所以一般是采用動(dòng)態(tài)的方法編譯根文件系統(tǒng)的。若選擇動(dòng)態(tài)編譯的辦法,,大體方法還是一樣的,,存在一些不同之處是: 不同之處之一是: 進(jìn)到配置選項(xiàng) #make menuconfig 選擇動(dòng)態(tài)方式 Busybox Settings ---> Build Options ---> [*] Build Shared libbusybox 不同之處之二是: 上面靜態(tài)編譯出現(xiàn)的出錯(cuò)信息不會(huì)出現(xiàn)了,所以不需對程序做任何修改,,但還是必須用arm-linux-gcc 3.3.2編譯,否則還是會(huì)有麻煩,。 不同之處之三是(最大的不同之處): 編譯完成后,,需進(jìn)到rootfs目錄的lib中,往里面添加一些庫文件 #cd /home/su/rootfs/lib 這里有點(diǎn)麻煩,,我怎么知道需要什么庫文件的支持呢,? 最簡單的辦法是把arm-linux-gcc 3.3.2下的整個(gè)lib庫拷進(jìn)來,簡單省事,。但是這么做存在一個(gè)問題,,做出的根文件系統(tǒng)非常大。 另一個(gè)辦法是: #cd /home/su/rootfs/bin #arm-linux-readelf busybox | grep shared 這樣就可以顯示出系統(tǒng)運(yùn)行起來需要什么庫文件,,再把相應(yīng)的庫文件拷到/home/su/rootfs/lib下,。一般而言,系統(tǒng)庫用到兩個(gè):動(dòng)態(tài)鏈接器ld-linux.so和c函數(shù)庫Glibc,,Glibc包括: ld-linux:動(dòng)態(tài)鏈接庫,,必需 libc: 標(biāo)準(zhǔn)c函數(shù)庫,必需 libm: 數(shù)學(xué)庫,,一般需要 libdl: 用于動(dòng)態(tài)裝載共享庫,,較少用到 libcrypt: 加密附加庫,需要認(rèn)證的程序用到,,較少用 libpthread: POSIX線程庫,,一般需要 如果需要某個(gè)函數(shù)庫,我們可以將這些庫和對應(yīng)的符號(hào)鏈接拷到目標(biāo)根文件系統(tǒng)的/lib目錄下,。簡單起見,,應(yīng)該使用-d選項(xiàng)或-a選項(xiàng)調(diào)用cp命令,這樣可保留完整的符號(hào)鏈接信息,。 例: #cp –a libc.so.6 /home/su/rootfs/lib/ 為了減少運(yùn)行時(shí)庫的大小,,我們應(yīng)該使用交叉編譯版本即arm-linux-gcc 3.3.2的strip工具來處理根文件系統(tǒng)的庫文件,把二進(jìn)制文件中的包含的符號(hào)表和調(diào)試信息刪除掉,。 例: #arm-linux-strip /home/su/rootfs/lib/*.so
注意: 使用busybox做文件系統(tǒng)時(shí),,運(yùn)行make命令,系統(tǒng)會(huì)馬上顯示: 沒有/dev/null這個(gè)文件 但是還是能最終編譯出根文件系統(tǒng),,問題出在重啟linux系統(tǒng),,機(jī)器進(jìn)不去了,。提示出錯(cuò),信息如下: /etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system /etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system /etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system /etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system /etc/rc.d/rc.sysinit: line 200:/dev/null: read-only file system . . . ***An error occured during the file system check. ***Dropping you to a shell;the system will reboot ***when you leave the shell Give root password for maintenance (or type Control-D to continue): 解決辦法: 按提示輸入root用戶的密碼,,回車,,可看到 (Repair filesystem)1#: 依次輸入命令: (Repair filesystem)1# mount -n -o remount,rw / (Repair filesystem)1# rm -f /dev/null (Repair filesystem)1# mknod -m 0666 /dev/null c 1 3 (Repair filesystem)1# reboot 問題解決。 |
|