arm64系统不支持32位的解决armel armhf
初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
一台设备是arm64的,不能运行arm32程序。硬件是armV8理论上是兼容32位的。
折腾过程
比如用ldd查看so,输出“not a dynamic executable”,不能识别为可执行代码。用file查看则可以识别为arm EABI5动态链接库,说明文件没错。
编了一个测试程序,拿上去执行,当然执行不了,提示很奇怪,用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”。
逐个搜了一下,发现ld-linux-armhf.so 找不到,其余应该有但是是64位。
找了另外一个交叉编译环境的ld-linux-armhf.so,复制到/lib,添加执行权限,不然执行./a提示没有权限(不是a没有权限,而是这个库没有权限)。
再执行./a,提示
./a: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
这就上路了,缺的这些库同样找过来,不需要放在/lib,只要能找到就行,也不需要改权限。
把缺失的库都补上就可以了。
结论
arm分几个版本,v8支持64位和32程序,但是设备不一定提供了32位程序支持。
32位程序的启动器是ld-linux-armhf.so,缺这个就不能启动32位程序。这个文件必须放在/lib并具有可执行权限。
关于armel和armhf
这是两种不同的fpu策略,不兼容,所以下载各种包的时候要注意。
检测是armel还是armhf
执行命令:
readelf -A /proc/self/exe | grep Tag_ABI_VFP_args
如果返回Tag_ABI_VFP_args: VFP registers就是armhf,没有返回则是armel(或者根本不是arm)
ubuntu下载交叉编译需要的包
用包搜索可以搜索到所有架构的包,比如搜索libc:
apt-cache search libc | grep arm
找所有arm的,返回结果:
返回结果经过了整理
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......,找到需要的用就可以了。
直接指定架构的安装方法:
sudo apt install libc6:armhf libstdc++6:armhf
这样就会有ld-linux-armhf.so这个动态库了,应该可以跑32位的程序了。
(这里是文档结束)