天天看點

交叉編譯busybox(轉載)

交叉編譯器: 3.3.2

# wget -c http://www.busybox.net/downloads/busybox-1.7.0.tar.bz2

# tar jxvf busybox-1.7.0.tar.bz2

修改源碼、配置、編譯

-----------------------------------------------

# cd busybox-1.7.0

# vi Makefile +176

ARCH            ?= arm

CROSS_COMPILE   ?= /usr/local/arm/3.3.2/bin/arm-linux-

# make menuconfig

Busybox Settings --->

    Build Options --->

  • Build BusyBox as a static binary (no shared libs) //(1)

        Installation Options --->

  • Don't use /usr               //(2)

    Linux System Utilities --->

  • mdev                             //(3)
  • Support /etc/mdev.conf
  • Support command execution at device addition/removal

    Shells --->   

        Choose your default shell (

    msh

    ) ---> //(4)

    (1) 這個選項是一定要選擇的,這樣才能把busybox編譯成靜态連結的可執行檔案,運作時才獨立于其他函數庫.否則必需要其他庫檔案才能運作,在單一個linux核心不能使他正常工作。

    (2) 這個選項也一定要選,否則make install後,busybox将安裝在原系統的/usr下,這将覆寫掉系統原有的指令.選擇這個選項後,make install後會在busybox目錄下生成一個叫_install的目錄,裡面有busybox和指向他的連結.

    (3) 如果沒有啟動

    udev

    ,造成/dev下沒有裝置檔案。也就是說所有的裝置都沒有挂接進來。最新的busybox已經包含了udev的簡化版本即mdev,且使用非常簡單。 要使用mdev還需要在rootfs中做适當配置。

    vi rootfs/etc/init.d/rcS

    ---------------------------

    mount -t tmpfs mdev /dev

    mkdir /dev/pts

    mount -t devpts devpts /dev/pts

    mount -t sysfs sysfs /sys

    mount -a

    echo /sbin/mdev > /proc/sys/kernel/hotplug

    mdev -s

    配置linux kernel

    -----------------------------------------------

        mdev需要改寫/dev和/sys兩個目錄。是以必須保證這兩個目錄是可寫的(一般會用到sysfs,tmpfs。是以要重新編譯核心)。然後在你的啟動腳本檔案中加入/sbin/mdev -s

    linux-2.6.19 -- make menuconfig

    File systems --->

        Pseudo filesystems --->

  • sysfs file system support   
  • Virtual memory file system support (former shm fs)
  •    Tmpfs POSIX Access Control Lists

    (4) 由于ash功能不夠強大,不能支援tab補齊,曆史紀錄等等的進階功能,是以使用busybox裡面的msh代替ash.

        因為busybox主要應用于對空間要求非常嚴格的嵌入式系統,是以它推薦使用uclibc而不鼓勵使用glibc,如果你沒有安裝uclibc,而且在 build Options也選擇了Build BusyBox as a static binary(no shared libs),那肯定無法編譯通過的,當然如果你之前build Options選擇的是動态編譯的話就不會有這樣的問題出現了。假設你是第一種情況,我們可以這樣解決:把applets/applets.c開頭的幾行 warning注釋掉

    # vi applets/applets.c

    # make

    # make install

    這時會在你的編譯目錄下生成一個_install的目錄,裡面包含了生成的所有檔案和目錄結構。

    編譯時遇到的問題(1):

    -----------------------------------------------

    如果busybox編譯成static linking

    Busybox Settings --->

        Build Options --->

  • Build BusyBox as a static binary (no shared libs)

    # make

    将會遇到下面問題:

    applets/applets.c:20:2: error: #warning Static linking against glibc produces buggy executables

    applets/applets.c:21:2: error: #warning (glibc does not cope well with ld --gc-sections).

    applets/applets.c:22:2: error: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400

    applets/applets.c:23:2: error: #warning Note that glibc is unsuitable for static linking anyway.

    applets/applets.c:24:2: error: #warning If you still want to do it, remove -Wl,--gc-sections

    applets/applets.c:25:2: error: #warning from top-level Makefile and remove this warning.

    make[1]: *** [applets/applets.o] Error 1

    這個警告的定義在applets/applets.c中。将這段警告注釋掉就可以了。

    這段警告的意思是告訴你最好用uclibc編譯,而不是用glibc因為glibc比較大,busybox在寸土寸金的嵌入式系統中運用比較多,是以會有這樣的要求。

    # vi /busybox-1.7.0/applets/applets.c +20

    注釋掉20 -- 28行内容即可

    miscutils/taskset.c:17: error: parse error before '*' token

    -----------------------------------------------

    最根本的解決辦法是換一個libc庫,可是現在還不知道哪個庫最合适,唯有暫時将有問題的指令關掉

    Miscellaneous Utilities --->

        [ ] taskset

    [

    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)
    交叉編譯busybox(轉載)

    ]各式各樣的

    runit/runsv.c: In function `gettimeofday_ns':

    -----------------------------------------------

    Runit Utilities --->

        [ ] runsv   

    核心啟動時遇到的問題:

    -----------------------------------------------

    “could not run '/bin/sh': No such file or directory”

    解決方法:

    要這樣配置:

    Shells --->   

        Choose your default shell (ash) --->      

    如果是這樣配置的話,雖然可以生成ash,但不能生成sh,将會在核心啟動時出現上面出現的問題:

    Shells --->   

        Choose your default shell (none) --->

  • ash 本文來自ChinaUnix部落格,如果檢視原文請點: http://blog.chinaunix.net/u2/78225/showart_1299803.html

繼續閱讀