新聞中心
序言(廢話):
創(chuàng)新互聯(lián)公司專注于奈曼企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),購(gòu)物商城網(wǎng)站建設(shè)。奈曼網(wǎng)站建設(shè)公司,為奈曼等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)由于本人還是比較偏重于先說(shuō)明原理在說(shuō)明實(shí)際操作步驟,要知其然更要知其所以然,如下圖所示:
傳統(tǒng)的linux系統(tǒng)中的程序基本都依賴于glibc(至于什么是glibc可以百度去),而右邊AOSP(Android Open-Source Project)的程序基本都是依賴于Bionic(由谷歌公司開(kāi)發(fā)類庫(kù),用來(lái)替代glibc)。這就決定了要想移植linux上的程序到android上就必須解決這個(gè)依賴的類庫(kù)不同的問(wèn)題。
一般情況下,有兩種方法。
一個(gè)就是將程序靜態(tài)編譯,將程序中所有需要的庫(kù)全部編譯進(jìn)可執(zhí)行文件中。這樣程序在android中運(yùn)行就不需要鏈接任何動(dòng)態(tài)庫(kù)了。但是帶來(lái)一個(gè)非常大的弊端就是這個(gè)程序會(huì)非常大,資源利用會(huì)非常低下。一個(gè)簡(jiǎn)單的helloWorld!都可以達(dá)到好幾百k!
另一個(gè)就是用ld-llinux.so.3來(lái)替代android系統(tǒng)中/system/bin/linker來(lái)作為鏈接器進(jìn)行動(dòng)態(tài)鏈接,當(dāng)然這就需要將相應(yīng)的動(dòng)態(tài)庫(kù)也拷貝到android中(個(gè)人理解,如果表述不夠準(zhǔn)確請(qǐng)指正)。這樣就可以進(jìn)行動(dòng)態(tài)鏈接,并且正常運(yùn)行了。
靜態(tài)編譯方法:
首先我們以移植一個(gè)helloworld程序作為例子。
#include
void main()
{
printf("HelloWorld!\n");
}
輸入命令進(jìn)行靜態(tài)編譯:arm-none-linux-gnueabi-gcc hello.c -static -o hello.out
然后利用adb push 將helllo.out放進(jìn)android設(shè)備的/system/bin目錄中,
用chmod 755 /system/bin/hello.out 更改其為執(zhí)行權(quán)限。
輸入: hello.out 即可看到屏幕上輸出HelloWorld!
如上說(shuō)所一樣,這個(gè)hello.out程序有近650k,而且其使用的代碼不可重用。
動(dòng)態(tài)鏈接方法:
動(dòng)態(tài)鏈接依舊按照上述helloworld程序作為例子。
編譯命令為:arm-none-linux-gnueabi-gcchello.c -ohello.out -Wl,-dynamic-linker=/system/lib/ld-linux.so.3
這里需要說(shuō)明的是,這個(gè)/system/lib是指android手機(jī)中存放連接器ld-linux.so.3的目錄。正式利用這個(gè)連接器來(lái)替代android系統(tǒng)中/system/bin/linker才能動(dòng)態(tài)鏈接運(yùn)行程序。
也可以加入?yún)?shù) -Wl,-rpath,/system/armcrosslib 在編譯時(shí)指定運(yùn)行時(shí)的動(dòng)態(tài)庫(kù)查找目錄。
編譯完成后,可以輸入命令 readelf -d hello.out 來(lái)查看它的動(dòng)態(tài)鏈接庫(kù)有哪些。比如這個(gè)helloworld程序的動(dòng)態(tài)鏈接庫(kù)如下圖所示:
可以看到libgcc_s.so.1和libc.so.6就是這個(gè)helloworld所需要的動(dòng)態(tài)鏈接庫(kù)。
然后找到arm-none-linux-gnueabi-gcc的安裝目錄。如果你是解壓壓縮包配置path的安裝路徑的話,這些動(dòng)態(tài)鏈接庫(kù)文件就在./arm-none-linux-gnueabi/libc/armv4t/lib 下。
找到ld-linux.so.3和上述需要的動(dòng)態(tài)鏈接庫(kù),將他們cp 出來(lái)。
然后,利用adb push 將他們放入android系統(tǒng)的/system/lib目錄下,將hello.out放入到/system/bin下,更改hello.out和ld-linux.so.3的權(quán)限為可執(zhí)行即可(chmod 755 hello.out)。這里需要說(shuō)明一下,ld-linux.so.3作為他們的連接器,一定需要可執(zhí)行權(quán)限,否則就會(huì)提示permission denied。
做好這些后,輸入hello.out 即可看到屏幕打出helloworld!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站名稱:linux程序移植到android上-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://biofuelwatch.net/article/dhicdh.html