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

好文章要转:http://blog.chinaunix.net/uid-223060-id-2215345.html

zqqa——呆头呆脑看世界

如何将Linux中现有的众多资源以最小代价移植到android是很多开发人员关注的,下面这篇文章讲了一个比较取巧的方法,我试验了一下,最基本的hello world可以跑,但是复杂的大型程序要考虑很多问题,thread,IPC,效率等等,还有待验证。
原文地址:
 
在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<stdio.h>
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拷贝到编译目录,并且执行时所有文件都在同一个目录。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值