基于glibc的程序在android上的移植

如何将Linux中现有的众多资源以最小代价移植到android是很多开发人员关注的,下面这篇文章讲了一个比较取巧的方法,我试验了一下,最基本的hello world可以跑,但是复杂的大型程序要考虑很多问题,thread,IPC,效率等等,还有待验证。

原文地址:

http://groups.google.com/group/android-internals/browse_thread/thread/7c728a36474fbc05

 

在Android上使用动态链接库的一种新方法 - 不使用android linker

 

Android使用的Linker和传统Linux使用的linker(ld.so,ld-linux.so.2,ld-linux.so.3)不同,

他的Bionic里面的libdl实际只是一个stub函数,真正的实现都在system/bin/Linker里面。

 

我认为ld.so针对a.out格式的二进制可执行文件, ld-linux.so.2针对elf格式的二进制可执行文件,

ld-linux.so.3是新一代针对elf格式的二进制可执行文件的Linker,错了的话请纠正。

实际上我试验使用ld-linux.so.3代替android的/system/bin/linker来作为系统动态链接库的

linker。

下面给出一个简单的例子: 
hello.c 
#include 
int main() 

        printf("\n Hello World \n"); 
        return 0; 

 


所用的Toolchain从Code Sourcery得到。使用的是arm gnu/linux系列。

编译方式: 
arm-none-linux-gnueabi-gcc -o hello.out hello.c -Wl,-dynamic-linker=/yourpath/ld-linux.so.3  (不要使用-static使得程序是动态链接)。 

然后找到hello.out依赖的动态库,这里给出的列表是我猜的(因为我的cgywin里没有ldd)。 
ld-linux.so.3, 
libgcc_s.so, 
libc.so.6 
(其实用readelf -d也可以找到依赖的动态库。)

我把这些文件从toolchain库(libc/usr/lib)里面找出来然后上传到android emulator的/data/app目录。 

然后将hello.out上传到同一个目录后然后改变其权限使其可执行(chmod).然后执行它,

OK !!you can get it!!

因此,所有的程序不管它是否动态链接库还是其他的,如果在host系统toolchain能成功按上面方法编译,那理论上它就可以在android系统上运行。你只需要将程序和相应的动态库上传到合适的目录。

记住最关键的,编译时一定要加上“-Wl,-dynamic-linker=/yourpath/ld-linux.so.3" 。

注意,这里的youpath要和你在android模拟器上执行这个程序时的路径一样,否则会出not found错误。最好把ld-linux.so.3拷贝到编译目录,并且执行时所有文件都在同一个目录。

http://blog.chinaunix.net/uid-223060-id-2215345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值