日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

安卓跑linux程序_Android下运行Linux可执行程序

發布時間:2023/12/2 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓跑linux程序_Android下运行Linux可执行程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019-07-22

關鍵字:/system/bin/sh: xxx: No such file or directory

雖然說 Android 也是基于 Linux 的,但總歸來說它們的編譯鏈還是很有可能不一樣的,這就導致編譯出來的程序有可能不能通用,即使它們都是基于 Linux 的。

而有些不能通用的根本原因在于程序運行時所依賴的環境不滿足,比如常見的就是一些庫文件缺失了。

筆者這邊有個需求,需要將一個第三方的,原本目標運行環境是 Linux 嵌入式環境的可執行程序在 Android4.4 的環境上運行起來。

剛一接到這個需求的時候我就一陣頭大,一想到編譯鏈不同我就兩腳發軟。

果然,剛一想運行這一程序,它就給報了一個這樣的錯誤提示

/system/bin/sh: ./system/home1/ctstor/ctserver: No such file or directory

想都不帶想的,肯定是編譯鏈不同導致運行環境不滿足使得程序不能運行的。

但問題還得解決啊,總不能直接就和領導說編譯鏈不同搞不了吧。

怎么辦呢?看看它到底缺了些什么。

用純正 Linux 環境來看一下這個可執行程序的環境依賴信息。筆者這邊是將程序放到 ubuntu 下去分析,因為筆者的 Android4.4 上沒有相關程序。

通過以下命令查看這個可執行程序的編譯依賴信息

readelf -l xxx

結果如下所示

Elf file type is EXEC (Executable file)

Entry point0xe6e0There are8 program headers, starting at offset 52Program Headers:

Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align

EXIDX0x00be90 0x00013e90 0x00013e90 0x00008 0x00008 R 0x4PHDR0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4INTERP0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1[Requesting program interpreter:/lib/ld-linux.so.3]

LOAD0x000000 0x00008000 0x00008000 0x0be9c 0x0be9c R E 0x8000LOAD0x00c000 0x0001c000 0x0001c000 0x0067c 0x006cc RW 0x8000DYNAMIC0x00c01c 0x0001c01c 0x0001c01c 0x00130 0x00130 RW 0x4NOTE0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4GNU_STACK0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4Section to Segment mapping:

Segment Sections...00.ARM.exidx01

02.interp03 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame04.init_array .fini_array .jcr .dynamic .got .data .bss05.dynamic06 .note.ABI-tag07

可以看到上面紅色加粗的部分表明程序的運行需要一個 “解釋器” 。說白了就是要想加載這個程序,運行環境中必須要有上面黃色加粗部分的庫,就是 /lib/ld-linux.so.3 庫。

那這是不是說,只要我將這個庫放到指定路徑下,它就可以加載了呢?試一下就知道了。

不過在這之前,我們還有一個關鍵的步驟:必須要知道這個可執行程序所使用的編譯鏈。

筆者這邊有個文檔,記載了它的編譯鏈為: arm-none-linux-gnueabi

直接去網上下載這個編譯鏈,然后在里面找到 ld-linux.so.3 庫,再放進 Android 開發板中去就好了。

這里要注意,它要求的是根目錄下的 lib 目錄,Android4.4 系統默認是不帶 /lib 目錄的。要自己創建。

先開一下根目錄的操作僅限

mount -o remount r,w /

當然,這一步不見得都能執行成功,如果執行不成功,那就得您自個去找找原因了。

然后再 mkdir /lib 并將 ld-linux.so.3 下載到這個目錄下去。

這里也有一個關鍵點:不能修改創建出來的目錄以及下載下去的文件的權限。否則的話,在運行的時候是會報 permission denied 錯誤的。

然后試一下,這個程序果然不報前面那個 No such file or directory 的錯誤了。但是報了另外一個錯誤

error while loading shared libraries: libqte.so.3: cannot open shared object file: No such file or directory

還是 No such file or directory 錯誤,只不過是另外一個 No such file or directory 錯誤。而且這個錯誤也很明顯,就是運行時的動態庫缺失。

這個時候,得再回到前面 ubuntu 中去看看這個可執行程序在運行時期需要什么庫依賴。

readelf -d xxx

然后可以看到下列結果

Dynamic section at offset 0xc01c contains 33entries:

Tag Type Name/Value0x00000001 (NEEDED) Shared library: [libqte.so.3]0x00000001 (NEEDED) Shared library: [libts-0.0.so.0]0x00000001 (NEEDED) Shared library: [librt.so.1]0x00000001 (NEEDED) Shared library: [libpthread.so.0]0x00000001 (NEEDED) Shared library: [libdl.so.2]0x00000001 (NEEDED) Shared library: [libstdc++.so.6]0x00000001 (NEEDED) Shared library: [libm.so.6]0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]0x00000001 (NEEDED) Shared library: [libc.so.6]0x0000000f (RPATH) Library rpath: [/usr/qte338-target2/lib]0x0000000c (INIT) 0xd778

0x0000000d (FINI) 0x1317c

0x00000019 (INIT_ARRAY) 0x1c000

0x0000001b (INIT_ARRAYSZ) 20(bytes)0x0000001a (FINI_ARRAY) 0x1c014

0x0000001c (FINI_ARRAYSZ) 4(bytes)0x00000004 (HASH) 0x8168

0x00000005 (STRTAB) 0xa184

0x00000006 (SYMTAB) 0x8b24

0x0000000a (STRSZ) 10293(bytes)0x0000000b (SYMENT) 16(bytes)0x00000015 (DEBUG) 0x0

0x00000003 (PLTGOT) 0x1c14c

0x00000002 (PLTRELSZ) 2608(bytes)0x00000014(PLTREL) REL0x00000017 (JMPREL) 0xcd48

0x00000011 (REL) 0xcd08

0x00000012 (RELSZ) 64(bytes)0x00000013 (RELENT) 8(bytes)0x6ffffffe (VERNEED) 0xcc88

0x6fffffff (VERNEEDNUM) 4

0x6ffffff0 (VERSYM) 0xc9ba

0x00000000 (NULL) 0x0

然后就很清晰了,將上面的幾個標示為 NEEDED 的庫文件全部拷貝到 /lib 目錄下。這些庫文件一般都可以在指定的編譯鏈中找到,如果有一些特殊的庫不是直接包含在編譯鏈中的,那就得另想辦法去尋找了。一般而言,稍微負點責任的程序提供方都會將這些庫一并給過來的。

在弄好庫文件以后,再去運行就發現可以了。我們的原本目標運行環境是嵌入式 Linux 環境的可執行程序就在 Android 下跑起來了。

總結

以上是生活随笔為你收集整理的安卓跑linux程序_Android下运行Linux可执行程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。