免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1549 | 回复: 0
打印 上一主题 下一主题

基于Android Bionic 库动态编译busybox [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览

最近在基于Android做IPV6方面的开发和测试,需要使用busybox中提供的ping, ping6, nslookup, traceroute6等工具。经过测试发现:网络上介绍交叉编译busybox并放到Android中运行的文章很多,交叉编译好的busybox也可以直接下载到。但是,由于它们都是静态编译busybox并链接在标准的glibc上,导致一些功能在Android中不能正常运行,例如:#busybox ping www.baidu.com

 

Android并没有采用glibc作为C库,而是采用了Google自己开发的Bionic Libc,它的官方Toolchain也是基于Bionic Libc而并非glibc的。与glibc相比,Bionic Libc有如下一些特点:

  • 采用BSD License,而不是glibc的GPL License;
  • 大小只有大约200k,比glibc差不多小一半,且比glibc更快;
  • 实现了一个更小、更快的pthread;
  • 提供了一些Android所需要的重要函数,如”getprop”, “LOGI”等;
  • 不完全支持POSIX标准,比如C++ exceptions,wide chars等;
  • 不提供libthread_db 和 libm的实现

我这里要做的就是基于bionic libc来编译busybox,以更好的提供对网络相关工具的支持。上网搜索发现,已经有一些人对busybox的移植做了许多工作,并且工作了自己的成果,比如:

  • cyanogenmod已经提供了修改好的busybox源代码下载,但是基于froyo,而且没有打开ipv6设置
  • http://lazyhack.net/compile-busybox-linked-bionic/ 介绍《为Milestone/Droid动态编译busybox并连接至bionic》,但是需要修改bionic,替换libc.so

对他们的文章和源码进行了研究与尝试,可以基于cyanogenmod的源码方便的移植busybox到Android,打开ipv6相关功能,并且不需要替换libc.so。下面是我的移植步骤和经验总结:

 

1. 下载cyanogenmod修改过的busybox源码,并解压到<src>/external/busybox目录

下载地址:http://github.com/CyanogenMod/android_external_busybox

 

2. 编译busybox并修正编译错误

在Andorid源码根目录中执行: # make -j4 busybox

 

可能遇到的第一类编译错误如下:

  1. In file included from external/busybox/coreutils/df.c:25:  
  2. bionic/libc/include/mntent.h:48: error: expected '='','';''asm' or '__attribute__' before 'struct'  

解决方法是在出错的文件中,包含头文件stdio.h。例如在df.c中增加

  1. #include <stdio.h>  

类似的编译出错的文件可能会有:

  1. coreutile/df.c  
  2. util-linux/mount.c  
  3. util-linux/umount.c  

 

可能遇到的第二类编译错误如下:

  1. external/busybox/shell/ash.c:12714: error: 'rlim_t' undeclared (first use in this function)  

出错原因是你使用的是早期的Android版本,其中rlim_t没有定义。解决方法是在<src>/bionic/libc/include/sys/resource.h中增加

  1. typedef unsigned long rlim_t;  

可以参考Froyo中<src>/bionic/libc/include/sys/resource.h文件。

 

可能遇到的第三类编译错误如下:

  1. busybox/networking/ntpd.c:1458: undefined reference to `adjtimex'  

出错原因是bionic中没有定义adjtimex,stime,swapon,swapoff,sysinfo,getsid等函数。解决方法是修改Android.mk,增加

  1. CYANOGEN_BIONIC:=true  

 

3. 将编译好的busybox拷贝到手机/system/xbin/目录下测试

#adb push busybox /system/xbin/

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP