Chinaunix首页 | 论坛 | 博客
  • 博客访问: 586264
  • 博文数量: 192
  • 博客积分: 3780
  • 博客等级: 中校
  • 技术积分: 1487
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-26 10:11
文章存档

2012年(6)

2011年(160)

2010年(26)

分类: 嵌入式

2011-07-09 10:53:40



介绍过交叉编译的方法,可是在使用过程中发现它的ping,traceroute以及其它的一些网络命令在使用域名作为参数时会出现
ping: bad address
traceroute: bad address
等错误,进而不能够正常工作

原因就是之前静态编译的链接于glibc上,它其中用来获取DNS信息的getaddrinfo函数在android下是有问题的,而android所使用的libc库是个google自己开发.
与glibc相比,Bionic Libc有如下一些特点:

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

很明显getaddrinfo是POSIX的标准函数,由于并不完全支持POSIX,所以它应该有它自己的实现方法,这里不探究它如何实现,现在要做的是怎么让能够使用来链接。

感谢伟大的开源运动,cyanogenmod已经提供了修改好的busybox源代码,由于cyanogenmod并不兼容milestone,而它对android官方的内核以及bionic修改幅度较大所以将它的bionic完全移植过来难度还是很大的,所以这里仅仅移植一些busybox需要用到的一些函数,这样对原bionic修改幅度较小,也比较容易实现,这里说说我所修改的部分。

首先是busybox部分

cyanogenmod修改过的busybox源代码,地址在这里

将其放入android源代码的external/busybox/中

有三个文件需要修改,分别是

coreutile/df.c
util-linux/mount.c
util-linux/umount.c

三个文件仅需要在文件前添加

#include 

即可

接下来是bionic部分

在链接过程中busybox需要是用的adjtimex,stime,swapon,swapoff,sysinfo,getsid这几个函数愿bionic中是没有的,这里要做的工作就是把这几个函数包含进syscall,需要修改或者增加的文件有:
需要添加的文件

bionic/libc/arch-arm/syscalls/adjtimex.S
bionic/libc/arch-arm/syscalls/stime.S
bionic/libc/arch-arm/syscalls/swapoff.S
bionic/libc/arch-arm/syscalls/swapon.S
bionic/libc/arch-arm/syscalls/sysinfo.S
bionic/libc/arch-arm/syscalls/getsid.S

需要修改的文件

bionic/libc/arch-arm/syscalls.mk
bionic/libc/include/sys/linux-syscalls.h

需要增加的那几个文件请从

获取

修改bionic/libc/arch-arm/syscalls.mk文件
在第122行syscall_src += arch-arm/syscalls/utimes.S下添加

syscall_src += arch-arm/syscalls/adjtimex.S

然后在行尾添加

syscall_src += arch-arm/syscalls/stime.S
syscall_src += arch-arm/syscalls/swapon.S
syscall_src += arch-arm/syscalls/swapoff.S
syscall_src += arch-arm/syscalls/sysinfo.S
syscall_src += arch-arm/syscalls/getsid.S

修改bionic/libc/include/sys/linux-syscalls.h文件
在第105行#define __NR_setitimer (__NR_SYSCALL_BASE + 104)后添加

#define __NR_adjtimex                     (__NR_SYSCALL_BASE + 124)

然后在131行#define __NR_poll (__NR_SYSCALL_BASE + 168)后添加

#define __NR_stime                        (__NR_SYSCALL_BASE + 25)
#define __NR_swapon                       (__NR_SYSCALL_BASE + 87)
#define __NR_swapoff                      (__NR_SYSCALL_BASE + 115)
#define __NR_sysinfo                      (__NR_SYSCALL_BASE + 116)
#define __NR_getsid                       (__NR_SYSCALL_BASE + 147)

接下来在android源代码的根目录运行
make busybox
编译好后下面这两个文件是我们所需要的
out/get/product/generic/obj/lib/libc.so
out/target/product/generic/system/xbin/busybox
获取这两个文件后,将libc.so文件拷入手机/system/lib中
busybox文件拷入/system/xbin
具体过程如下:

adb push libc.so /tmp/
adb push busybox /tmp/
adb shell
su
cd /tmp
mount -o remount,rw /dev/block/mtdblock6 /system
cp -f libc.so /system/lib/libc.so
chmod 4755 /system/lib/libc.so
cp -f busybox /system/xbin/busybox
chmod 4755 /system/xbin/busybox
mount -o remount,ro /dev/block/mtdblock6 /system
exit

这里我提供一下我编译好的两个文件
注意,替换libc.so危险系数较高,我这里也就是仅仅提供一些移植cyanogenmod里面好东西思路。而以上的内容在我的手机上是能够正常工作的,如果你不在意静态编译出来的busybox的一些网络命令那就不要随便尝试了。

阅读(999) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~