基于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
總結
以上是生活随笔為你收集整理的基于glibc的程序在android上的移植的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建Android的交叉编译器、用NDK
- 下一篇: Linux(Ubuntu)下嵌入式gdb