⑴ 如何使用busybox編譯和生成最簡lin
在ubuntu系統下創建一個rootfs目錄,用於存放busybox生成的根文件系統,也可設置為nfs的掛載目錄,直接通過網路文件系統進行掛載,便於開發。我自己就將該目錄創建在/opt/FriendlyARM/mini2440/rootfs處。並在該目錄下創建一些必備的子目錄:
leon@Ubuntu:/opt/FriendlyARM/mini2440/rootfs$ mkdir bin dev etc proc sbin sys tmp usr leon@Ubuntu:/opt/FriendlyARM/mini2440/rootfs$ ls bin dev etc proc sbin sys tmp usr
1、修改Makefile配置
進入busybox目錄,修改Makefile文件,在文件頭處加入內容如下:
ARCH ?= arm CROSS_COMPILE ?= arm-linux-
2、修改配置文件
make menuconfig
選擇Busybox Settings—>
1、Build Options—>,選擇[*] Build Busybox as a static binary(no shared libs); 2、Installtion Options,在busybox instantlltionprefix一欄中,輸入你想要創建rootfs的目錄。比如我的是/opt/FriendlyARM/mini2440/rootfs。
保存,退出。
3、編譯源碼
輸入make,進行編譯;這其中估計會遇到一些錯誤,可參見我的另外一篇博客(linux(ubuntu)編譯busybox遇到的問題處理辦法)。編譯成功後,會給出以下提示:
LINK busybox_unstripped Static linking against glibc, can't use --gc-sections Trying libraries: crypt m Library crypt is not needed, excluding it Library m is needed, can't exclude it (yet) Final link with: m DOC busybox.pod DOC BusyBox.txt DOC busybox.1 DOC BusyBox.html
編譯通過之後,輸入make install命令進行安裝,busybox會自動將rootfs根文件系統安裝到之前設置的目錄下。
⑵ busybox編譯錯誤
上面不是說的很清楚么, 沒有文件:applets/.applets.o.d 可以看一下有沒有 applets 目錄及其下面有沒有.applets.o.d 這個隱藏文件
⑶ 編譯移植busybox出錯,arm-linux-gcc版本4.3.3 busybox版本1.16.0 錯誤代碼如下:
找不到鏈接庫,不這些都是數學庫,加參數 -lm 應該就能解決。
但編譯過程這個東西應該是自己加。
busybox 一般都是靜態的,編譯靜態程序,很多時候需要他以來的函數庫也是靜態的。你這個問題應該是編譯環境不匹配。你編譯了 uclibc 並且正確安裝了沒?
不過話說,不過是個編譯,人家本來就支持 arm ,「移植」這兩個字應該是不需要用了。
⑷ linux驅動編寫過程中遇到的幾個問題及解決
1、顯示錯誤:unknown field 'ioctl' specified in initializer
解決辦法,查看內核include/linux/fs.h文件,發現里邊定義的struct file_operations中沒有ioctl,這里我們用.unlocked_ioctl取代,形參去掉 struct inode*。
2、在應用程序中,將ioctl替換為unlocked_ioctl後,會出現以下錯誤:undefined reference to `unlocked_ioctl'。因為系統調用ioctl是沒有改變的,還是原來的系統調用介面,只是系統調用的實現中,ioctl()變成了unlocked_ioctl,在應用層你根本不用關注內核中的這些實現上的改變,你只需要按照系統調用的用法用就可以了。所以把應用程序里的unlocked_ioctl改為ioctl,編譯,OK,通過。
3、驅動編譯完成,在開發板上insmod,出現以下錯誤:
WARNING: at lib/kobject.c:595 kobject_put+0x50/0x64()
kobject: '撲' (cbc60a00): is not initialized, yet kobject_put() is being called.
---[ end trace da227214a82491b9 ]---
insmod: cannot insert 'led_dev.ko': Cannot allocate memory
原來是忘了寫內存申請的代碼,添加kmalloc和memset。
4、再次insmod,出現下列錯誤代碼:
Unable to handle kernel paging request at virtual address 7f008820
pgd = cbc70000
[7f008820] *pgd=00000000
Internal error: Oops: 5 [#1]
Moles linked in: led_dev(+)
CPU: 0 Tainted: G W (3.0.1 #439)
PC is at led_init+0xa8/0x108 [led_dev]
LR is at kobj_map+0x144/0x154
pc : [<bf0020a8>] lr : [<c0246e70>] psr: 60000013
sp : cbc6bf10 ip : cbc6beb0 fp : cbc6bf24
r10: 00000000 r9 : bf002000 r8 : cbc6a000
r7 : 00000000 r6 : bf0002bc r5 : 00000000 r4 : 00000000
r3 : 00000000 r2 : 00000000 r1 : 7f008000 r0 : 00000000
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 00c5387d Table: 5bc70008 DAC: 00000015
Process insmod (pid: 112, stack limit = 0xcbc6a268)
Stack: (0xcbc6bf10 to 0xcbc6c000)
bf00: 00000000 c07463c0 cbc6bf7c cbc6bf28
bf20: c00343c8 bf00200c cbc6bf64 cbc6bf38 c0073e24 00000000 00000000 00000000
bf40: 00000000 0000ef52 000d5bf9 bf0002bc 00000000 0000ef52 000d5bf9 bf0002bc
bf60: 00000000 c0034ce8 cbc6a000 00000000 cbc6bfa4 cbc6bf80 c0085960 c0034398
bf80: c00e8738 c00e8610 402004a8 000dfcf8 00000000 00000080 00000000 cbc6bfa8
bfa0: c0034b40 c00858e0 402004a8 000dfcf8 00b5d038 0000ef52 000d5bf9 ffff5f01
bfc0: 402004a8 000dfcf8 00000000 00000080 00000069 00000001 be9c2e64 be9c2e68
bfe0: be9c2e68 be9c2b14 00021cfc 402c1d74 60000010 00b5d038 5fffe821 5fffec21
[<bf0020a8>] (led_init+0xa8/0x108 [led_dev]) from [<c00343c8>] (do_one_initcall+0x3c/0x188)
[<c00343c8>] (do_one_initcall+0x3c/0x188) from [<c0085960>] (sys_init_mole+0x8c/0x1a4)
[<c0085960>] (sys_init_mole+0x8c/0x1a4) from [<c0034b40>] (ret_fast_syscall+0x0/0x30)
Code: e59f0060 eb52980e ea00000b e59f1058 (e5910820)
---[ end trace da227214a82491b9 ]---
Segmentation fault
最後是各種網路,各種谷歌,參考別人的驅動,發現它們的開發板硬體地址並不是自己寫的頭文件,而是調用mach中已經定義好的頭文件,好吧,尋找相應開發板,相應埠的地址頭文件,在驅動文件中添加以下頭文件:
#include <mach/map.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank-m.h>
Ok,打完收工,開發板,測試。運行無阻。完成。
5、在做到DS18B20溫度測試模塊驅動的時候,看到網上的代碼有些函數可以直接對引腳的功能進行設置,比如:s3c2410_gpio_cfgpin(DQ_PIN, DQ_PIN_OUTP); 但是對應於我的s3c6410的開發板就不知道用什麼函數了,網上找了半天,發現以上函數是在#include <plat/gpio-cfg.h>中,6410中對應的函數為:extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);
6、最近學習移植linux內核,移植了新的linux內核以及掛載了新的NFS之後, 重新測試led驅動,發現安裝模塊以後,運行測試程序會出現以下錯誤:
-/bin/sh: ./main: not found(main為主機上編譯好的測試程序)
原因:
編譯busybox的時候選擇了靜態編譯:
Build Options->
Build BusyBox as a static binary (no shared libs)
Build with Large File Support (for accessing file>2GB)
如果選擇 Build BusyBox as a static binary (no shared libs) 方式進行編譯時,所需的庫已經與程序靜態地鏈接在一起,這些程序不需要額外的庫就可以單獨運行,但是自己編寫的程序在文件系統上運行必須採用靜態編譯,否則會報諸如:bin/sh: main :not found的錯誤。
靜態編譯如:
arm-linux-gcc –static main.c –o main
7.按照普通方法安裝配置tftp,並且關閉了防火牆,但是在開發板上tftp主機,總會報錯:
tftp: server error: (0) Permission denied
解決辦法:
修改文件 /etc/sysconfig/selinux,設定其中的
SELINUX=disabled
然後重啟電腦即可
⑸ 交叉編譯busybox顯示libc.so.6丟失!
拷貝C 庫
交叉應用程序的開發需要用到交叉編譯的鏈接庫,我們在移植應用程序到我們的目標板的時
候,需要把交叉編譯的鏈接庫也一起移植到目標板上,這里我們用到的交叉工具鏈的路徑是
/usr/local/arm/...../,鏈接庫的目錄是/usr/local/arm/...../arm-linux/lib,將其中部分庫文件及符號鏈接拷貝到root_nfs(你創建的busybox的根目錄)文件夾下的lib文件夾中。
部分庫文件及符號鏈接有:ld-2.3.2.so,ld-linux.so.2,libc-2.3.2.so,libc.so.6
⑹ 在編譯busybox的時候 ,,make 出錯
我也遇到過同樣的問題,不知道是不是和你是同樣的問題,雖然時間很長了,還是把它貼出來,看能不能幫助到別人。這個應該是make版本太老的問題,我下了個3.8.2版本的make,就不再出現make: *** No rule to make target `|', needed by `include/autoconf.h'. Stop.提示。順便說一下,解決問題的思路,| 代表order-only依賴,將此符號去掉,重新編譯,就正常,因此估計是make版本太老。
⑺ 編譯busybox的時候在make以後出錯為conflicting types for '--packed'怎麼解決 非常感謝呀!很著急
在main函數前面要聲明在main函數里調用過的函數,或者直接把函數的實現放到main函數的前面,這樣應該就能解決問題了。建議你看清楚調用函數的地方是不是漏掉了分號,我的就是出現了這樣的問題。
⑻ ubuntu 12.0.4編譯busybox出錯,求解答
#我解壓tarball後,在目錄下建立了build文件夾,我在build目錄里開始編譯。
make KBUILD_SRC=../ -f ../Makefile defconfig
sed -e 's/.*FEATURE_PREFER_APPLETS.*/CONFIG_FEATURE_PREFER_APPLETS=y/' -i .config
sed -e 's/.*FEATURE_SH_STANDALONE.*/CONFIG_FEATURE_SH_STANDALONE=y/' -i .config
make
make install #我沒有執行這個安裝命令,因為我不需要這個軟體。
#檢測一下編譯好的busybox
PATH= ./busybox ash #這條命令的作用是清空PATH系統環境變數,防止執行系統目錄(/bin /usr/bin等)下的可執行文件 如 ls rm等。
這樣,下面的ls命令,是來自busybox 的 ash shell,而非來自系統的bash shell。
/busybox/busybox-1.21.1/build $ ls
Makefile busybox_unstripped.out editors
applets console-tools fintils
archival coreutils include
busybox debianutils include2
busybox_unstripped docs init
busybox_unstripped.map e2fsprogs libbb
make過程的部分屏幕輸出:
CC networking/ifplugd.o
CC networking/ifupdown.o
CC networking/inetd.o #編譯 networking/inetd.o 可以正常通過
CC networking/interface.o
......
CC util-linux/volume_id/sysv.o
CC util-linux/volume_id/udf.o
CC util-linux/volume_id/util.o
CC util-linux/volume_id/volume_id.o
CC util-linux/volume_id/xfs.o
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
你的問題是找不到頭文件,那首先,你檢查一下 gcc 的默認頭文件搜索目錄
echo "" | gcc - -xc -v -E
看輸出是否包含/usr/include
#include <...> 搜索從這里開始:
/usr/lib/gcc/i686-linux-gnu/4.6/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6/include-fixed
/usr/include/i386-linux-gnu
/usr/include
根據結果再做下一步判斷。