建個(gè)個(gè)人網(wǎng)站一年多少錢網(wǎng)站排名優(yōu)化外包
初級(jí)代碼游戲的專欄介紹與文章目錄-CSDN博客
我的github:codetoys,所有代碼都將會(huì)位于ctfc庫中。已經(jīng)放入庫中我會(huì)指出在庫中的位置。
這些代碼大部分以Linux為目標(biāo)但部分代碼是純C++的,可以在任何平臺(tái)上使用。
源碼指引:github源碼指引_初級(jí)代碼游戲的博客-CSDN博客
? ? ? ? 一臺(tái)設(shè)備是arm64的,不能運(yùn)行arm32程序。硬件是armV8理論上是兼容32位的。
折騰過程
? ? ? ? 比如用ldd查看so,輸出“not a dynamic executable”,不能識(shí)別為可執(zhí)行代碼。用file查看則可以識(shí)別為arm EABI5動(dòng)態(tài)鏈接庫,說明文件沒錯(cuò)。
? ? ? ? 編了一個(gè)測(cè)試程序,拿上去執(zhí)行,當(dāng)然執(zhí)行不了,提示很奇怪,用readelf命令來查看:
root@ubuntu:~# readelf -a a | grep "Shared"Type: DYN (Shared object file)0x00000001 (NEEDED) Shared library: [libpthread.so.0]0x00000001 (NEEDED) Shared library: [libdl.so.2]0x00000001 (NEEDED) Shared library: [libz.so.1]0x00000001 (NEEDED) Shared library: [libm.so.6]0x00000001 (NEEDED) Shared library: [librt.so.1]0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]0x00000001 (NEEDED) Shared library: [libstdc++.so.6]0x00000001 (NEEDED) Shared library: [libc.so.6]0x00000001 (NEEDED) Shared library: [ld-linux-armhf.so.3]
? ? ? ? 程序名叫“a”。
? ? ? ? 逐個(gè)搜了一下,發(fā)現(xiàn)ld-linux-armhf.so 找不到,其余應(yīng)該有但是是64位。
? ? ? ? 找了另外一個(gè)交叉編譯環(huán)境的ld-linux-armhf.so,復(fù)制到/lib,添加執(zhí)行權(quán)限,不然執(zhí)行./a提示沒有權(quán)限(不是a沒有權(quán)限,而是這個(gè)庫沒有權(quán)限)。
? ? ? ? 再執(zhí)行./a,提示
./a: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
? ? ? ? 這就上路了,缺的這些庫同樣找過來,不需要放在/lib,只要能找到就行,也不需要改權(quán)限。
? ? ? ? 把缺失的庫都補(bǔ)上就可以了。
結(jié)論
? ? ? ? arm分幾個(gè)版本,v8支持64位和32程序,但是設(shè)備不一定提供了32位程序支持。
? ? ? ? 32位程序的啟動(dòng)器是ld-linux-armhf.so,缺這個(gè)就不能啟動(dòng)32位程序。這個(gè)文件必須放在/lib并具有可執(zhí)行權(quán)限。
關(guān)于armel和armhf
? ? ? ? 這是兩種不同的fpu策略,不兼容,所以下載各種包的時(shí)候要注意。
檢測(cè)是armel還是armhf
? ? ? ? 執(zhí)行命令:
readelf -A /proc/self/exe | grep Tag_ABI_VFP_args
????????如果返回Tag_ABI_VFP_args: VFP registers就是armhf,沒有返回則是armel(或者根本不是arm)
ubuntu下載交叉編譯需要的包
? ? ? ? 用包搜索可以搜索到所有架構(gòu)的包,比如搜索libc:
apt-cache search libc | grep arm
? ? ? ? 找所有arm的,返回結(jié)果:
返回結(jié)果經(jīng)過了整理
libc6-arm64-cross - GNU C Library: Shared libraries (for cross-compiling)
libc6-armhf-cross - GNU C Library: Shared libraries (for cross-compiling)
libc6-armel-cross - GNU C Library: Shared libraries (for cross-compiling)
libc6-dev-arm64-cross - GNU C Library: Development Libraries and Header Files (for cross-compiling)
libc6-dev-armhf-cross - GNU C Library: Development Libraries and Header Files (for cross-compiling)
libc6-dev-armel-cross - GNU C Library: Development Libraries and Header Files (for cross-compiling)
linux-libc-dev-arm64-cross - Linux Kernel Headers for development (for cross-compiling)
linux-libc-dev-armhf-cross - Linux Kernel Headers for development (for cross-compiling)
linux-libc-dev-armel-cross - Linux Kernel Headers for development (for cross-compiling)
libc6-dbg-arm64-cross - GNU C Library: detached debugging symbols (for cross-compiling)
libc6-dbg-armel-cross - GNU C Library: detached debugging symbols (for cross-compiling)
libc6-dbg-armhf-cross - GNU C Library: detached debugging symbols (for cross-compiling)
libc6-armel-armhf-cross - Dummy package to get libc6:armel installed
libc6-armhf-armel-cross - Dummy package to get libc6:armhf installed
libc6-dev-armel-armhf-cross - Dummy package to get libc6-dev:armel installed
libc6-dev-armhf-armel-cross - Dummy package to get libc6-dev:armhf installed
? ? ? ? 很明顯,都分為arm64、armel、armhf三種。?
? ? ? ? 安裝后的目錄在/usr/arm......,找到需要的用就可以了。
? ? ? ? 直接指定架構(gòu)的安裝方法:
????????sudo apt install libc6:armhf libstdc++6:armhf
????????這樣就會(huì)有l(wèi)d-linux-armhf.so這個(gè)動(dòng)態(tài)庫了,應(yīng)該可以跑32位的程序了。
(這里是文檔結(jié)束)