Bootstrap

Android版busybox编译

Androidbusybox编译

1 下载busybox源码

busybox官网上下载busybox最新版源码:http://www.busybox.net/downloads/

2 解压

tar -xvf busybox-1.23.2.tar.bz2

3 android版的配置脚本

解压后的源码里,configs文件压有android版本的配置脚本:

android2_defconfig       android_defconfig        android_ndk_defconfig

我选用的是android2_defconfig

4 编译armbusybox

1 export arm的编译工具:

export PATH=$PATH:/xxx/yyy/android_source/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin

2)修改编译工具

打开android2_defconfig

CONFIG_CROSS_COMPILER_PREFIX=" arm-eabi-"

改为

CONFIG_CROSS_COMPILER_PREFIX="arm-linux-androideabi-"

3)修改sysroot路径

由于arm-linux-androideabi-4.6目录下没有sysroot目录,因此需要指定,否则编译时会出现找不到一些头文件的错误,如:

include/platform.h:141:20: fatal error:limits.h: No such file or directory

compilation terminated.

make[1]: *** [applets/applets.o]错误 1

make: *** [applets_dir]错误 2

 

打开android2_defconfig

CONFIG_CROSS_COMPILER_PREFIX下再添加一行:

CONFIG_SYSROOT=":/xxx/yyy/android_source/prebuilts/ndk/android-ndk-r7/platforms/android-14/arch-arm"

或者是在make android2_defconfig之后,进入配置选项里改,其位置是在:

Busybox Settings  --->

       BuildOptions  --->

              ()  Path to sysroot (NEW)

4)编译

make android2_defconfig        //选项编译脚本

make       //开始编译

 

5 编译mipsbusybox

1 export mips的编译工具:

export PATH=$PATH:/xxx/yyy/android_source/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7/bin

2)修改编译工具

打开android2_defconfig

CONFIG_CROSS_COMPILER_PREFIX="arm-eabi-"

改为

CONFIG_CROSS_COMPILER_PREFIX="mipsel-linux-android-"

3)修改sysroot路径

mipsel-linux-android-4.7目录下已包含sysroot目录,不需要修改,默认就行。

4)编译

make android2_defconfig        //选项编译脚本

make       //开始编译

6 编译异常

编译时会出现几次错误,处理原则是将该错误对应的工具选项关闭,实际上很多工具用不上,如果确实需要,才对错误进行修复。

 

下面是几个错误的处理过程:

Error:

coreutils/touch.c: In function'touch_main':

coreutils/touch.c:171:21: error: 'lutimes'undeclared (first use in this function)

coreutils/touch.c:171:21: note: eachundeclared identifier is reported only once for each function it appears in

make[1]: *** [coreutils/touch.o]错误 1

make: *** [coreutils]错误 2

Solution:

coreutils/touch.c可看出是core utils里的touch工具出问题,所以进入编译选项coreutilestouch的选项的勾去掉。如下:

make menuconfig  //配置编译选项

Coreutils --->  

              [*]touch 

touch去掉,然后退出保存,再继续编译。

Error:

networking/udhcp/dhcpc.c: In function'udhcp_recv_raw_packet':

networking/udhcp/dhcpc.c:852:24: error: invalidapplication of 'sizeof' to incomplete type 'struct tpacket_auxdata'

networking/udhcp/dhcpc.c:915:26: error:'PACKET_AUXDATA' undeclared (first use in this function)

networking/udhcp/dhcpc.c:915:26: note: eachundeclared identifier is reported only once for each function it appears in

networking/udhcp/dhcpc.c:922:11: error:dereferencing pointer to incomplete type

networking/udhcp/dhcpc.c:852:16: warning:unused variable 'cmsgbuf' [-Wunused-variable]

networking/udhcp/dhcpc.c: In function'udhcp_raw_socket':

networking/udhcp/dhcpc.c:1050:33: error:'PACKET_AUXDATA' undeclared (first use in this function)

make[1]: *** [networking/udhcp/dhcpc.o]错误 1

make: *** [networking/udhcp]错误 2

Solution:

去掉:

Networking Utilities  ---> 

       [*]udhcp client (udhcpc) 

 

Error:

libbb/lib.a(pw_encrypt.o): In function`pw_encrypt':

pw_encrypt.c:(.text.pw_encrypt+0x10):undefined reference to `crypt'

libbb/lib.a(replace.o): In function`xmalloc_substitute_string':

replace.c:(.text.xmalloc_substitute_string+0xa8):undefined reference to `mempcpy'

replace.c:(.text.xmalloc_substitute_string+0xbc):undefined reference to `mempcpy'

collect2: error: ld returned 1 exit status

make: *** [busybox_unstripped]错误 1

Solution:

Crypt错误改起来麻烦,就直接将libbb/ pw_encrypt.c里的crypt(clear, salt);摒蔽掉了。

libbb/replace.c则将mempcpy改为memcpy

 

然后编译就通过了,并在源码根目录下产生busybox,如果只是要提取busybox里的某个工具,则继续下面的编译。

7 编译出工具包

Don't use/usr选项勾上,会将工具包编出到源码根目录下。

make menuconfig  //配置编译选项

Busybox Settings  --->

       GeneralConfiguration  --->

              [*]Don't use /usr

make //开始编译

 

编译完成后会生成_install文件夹,里面有各种工具文件。

;