【发布时间】:2019-12-17 18:08:01
【问题描述】:
我有一台 64 位 ARM 机器,我想在它上面运行 32 位 ARM 二进制文件。作为一个测试用例,我使用arm-linux-gnueabihf-gcc 工具链为 32 位 ARM 构建了一个小型 hello world。 file 显示为:
root@ubuntu:/home/ubuntu# file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=61ffe5e22117a6d4c2ae37a1f4c76617d3e5facc, not stripped
但尝试运行它会产生:
root@ubuntu:/home/ubuntu# ./hello
bash: ./hello: cannot execute binary file: Exec format error
基于a prior question,我检查了内核是否是用CONFIG_COMPAT选项构建的,结果是:
root@ubuntu:/home/ubuntu# grep CONFIG_COMPAT= /boot/config-$(uname -r)
CONFIG_COMPAT=y
我还验证了armhf 架构已添加,并且加载程序的armhf 版本存在。请注意,加载程序本身也不运行:
root@ubuntu:/home/ubuntu# dpkg --print-foreign-architectures
armhf
root@ubuntu:/home/ubuntu# dpkg -l libc6:armhf
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-=============-============-=================================
ii libc6:armhf 2.30-0ubuntu2 armhf GNU C Library: Shared libraries
root@ubuntu:/home/ubuntu# file /lib/arm-linux-gnueabihf/ld-2.30.so
/lib/arm-linux-gnueabihf/ld-2.30.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=dff2b536287d61ddca68f3e001e14b7c235bbf68, stripped
root@ubuntu:/home/ubuntu# /lib/arm-linux-gnueabihf/ld-2.30.so
bash: /lib/arm-linux-gnueabihf/ld-2.30.so: cannot execute binary file: Exec format error
其他相关系统信息:
root@ubuntu:/home/ubuntu# cat /proc/cpuinfo
processor : 0
BogoMIPS : 400.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics cpuid asimdrdm
CPU implementer : 0x43
CPU architecture: 8
CPU variant : 0x1
CPU part : 0x0af
CPU revision : 2
root@ubuntu:/home/ubuntu# uname -a
Linux ubuntu 5.3.0-24-generic #26-Ubuntu SMP Thu Nov 14 01:14:25 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux
在这一点上,我已经没有东西可以尝试了。知道如何让内核识别这些二进制文件并运行它们吗?
【问题讨论】:
-
64 位 ARM 机器是 Aarch64。看起来您的二进制文件是 ARM A-32,而不是 Aarch32。我不相信您可以在 Aarch64 上运行 ARM A-32 二进制文件。您可能需要通过https://unix.stackexchange.com/ 确认。
-
我可能弄错了,但我相信 32 位 EL0 是 Aarch32,而不是 ARM A-32。 EL0 是 Exception Level 0,我相当肯定这是 Aarch 的特性。您可能应该确切地确定 Linux Aarch64 提供了哪些 32 位支持。我相信这个问题会在https://unix.stackexchange.com/找到一个家。
-
为了它的价值,几年前我尝试在 Aarch64 上为 Aarch32 设置一个测试环境。我最终不得不放弃它,因为几乎没有可用的实用信息。我想你可能比我当时掌握的信息更多。
-
您还可以查看 GCC AArch64 Options 页面。我认为您需要使用
-mabi=name来获取 32 位二进制文件。我相信 32 位二进制文件是 Aarch32,而不是 ARM A-32。 ARM A-32 是 ARMv8 之前的 32 位指令集。 A-32 是 ARM 公司所称的 ARMv5、ARMv7 等指令集。 -
这些cmets不正确,我认为它们代表了对术语的误解。为 Armv7-A(32 位 Arm)编译的二进制文件可以在运行 AArch64(64 位 Arm,有时称为 arm64)的合适 Armv8-A 内核上运行,只要 1)硬件本身支持 32 位 Arm,2 ) 内核支持运行 COMPAT 任务。 A32 用于在 Arm 模式下运行的 Armv8-A 中的 32 位执行状态。 T32 也是一样,以拇指模式运行。