基于glibc的程序在android上的移植
如何將Linux中現(xiàn)有的眾多資源以最小代價(jià)移植到android是很多開發(fā)人員關(guān)注的,下面這篇文章講了一個(gè)比較取巧的方法,我試驗(yàn)了一下,最基本的hello world可以跑,但是復(fù)雜的大型程序要考慮很多問題,thread,IPC,效率等等,還有待驗(yàn)證。
原文地址:
http://groups.google.com/group/android-internals/browse_thread/thread/7c728a36474fbc05
?
在Android上使用動(dòng)態(tài)鏈接庫的一種新方法?-?不使用android linker
?
Android使用的Linker和傳統(tǒng)Linux使用的linker(ld.so,ld-linux.so.2,ld-linux.so.3)不同,
他的Bionic里面的libdl實(shí)際只是一個(gè)stub函數(shù),真正的實(shí)現(xiàn)都在system/bin/Linker里面。
?
我認(rèn)為ld.so針對(duì)a.out格式的二進(jìn)制可執(zhí)行文件,?ld-linux.so.2針對(duì)elf格式的二進(jìn)制可執(zhí)行文件,
ld-linux.so.3是新一代針對(duì)elf格式的二進(jìn)制可執(zhí)行文件的Linker,錯(cuò)了的話請(qǐng)糾正。
實(shí)際上我試驗(yàn)使用ld-linux.so.3代替android的/system/bin/linker來作為系統(tǒng)動(dòng)態(tài)鏈接庫的
linker。
下面給出一個(gè)簡單的例子:?
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使得程序是動(dòng)態(tài)鏈接)。?
然后找到hello.out依賴的動(dòng)態(tài)庫,這里給出的列表是我猜的(因?yàn)槲业腸gywin里沒有l(wèi)dd)。?
ld-linux.so.3,?
libgcc_s.so,?
libc.so.6?
(其實(shí)用readelf -d也可以找到依賴的動(dòng)態(tài)庫。)
我把這些文件從toolchain庫(libc/usr/lib)里面找出來然后上傳到android emulator的/data/app目錄。?
然后將hello.out上傳到同一個(gè)目錄后然后改變其權(quán)限使其可執(zhí)行(chmod).然后執(zhí)行它,
OK?!!you can get it!!
因此,所有的程序不管它是否動(dòng)態(tài)鏈接庫還是其他的,如果在host系統(tǒng)toolchain能成功按上面方法編譯,那理論上它就可以在android系統(tǒng)上運(yùn)行。你只需要將程序和相應(yīng)的動(dòng)態(tài)庫上傳到合適的目錄。
記住最關(guān)鍵的,編譯時(shí)一定要加上“-Wl,-dynamic-linker=/yourpath/ld-linux.so.3" 。
注意,這里的youpath要和你在android模擬器上執(zhí)行這個(gè)程序時(shí)的路徑一樣,否則會(huì)出not found錯(cuò)誤。最好把ld-linux.so.3拷貝到編譯目錄,并且執(zhí)行時(shí)所有文件都在同一個(gè)目錄。
http://blog.chinaunix.net/uid-223060-id-2215345.html
總結(jié)
以上是生活随笔為你收集整理的基于glibc的程序在android上的移植的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建Android的交叉编译器、用NDK
- 下一篇: cmake 入门学习