【问题标题】:Running 32-bit ARM binary on aarch64 not working despite CONFIG_COMPAT尽管 CONFIG_COMPAT 在 aarch64 上运行 32 位 ARM 二进制文件仍无法正常工作
【发布时间】: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 也是一样,以拇指模式运行。

标签: linux arm arm64


【解决方案1】:

好的,不幸的是,这里的潜在问题似乎不在于软件。我们使用的 CPU,Cavium ThunderX2,是少数支持 aarch32 的 64 位 ARM 芯片之一。引用WikiChip:

  • 仅支持 64 位 AArch64 执行状态。不支持 32 位 AArch32。

所以,这就解释了为什么它不能运行 32 位 ARM 二进制文件。我仍然相当确定其他 64 位 ARM 芯片,例如 Cortex-A57,能够做到这一点。

更新:较旧的 32 位 ARM 二进制文件确实可以在具有支持它的 CPU 的 aarch64 上运行,如下所示,在 AWS ARM a1.metal 实例上:

ubuntu@ip-172-31-12-156:~$ cat /proc/cpuinfo | tail

processor   : 15
BogoMIPS    : 166.66
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part    : 0xd08
CPU revision    : 3

ubuntu@ip-172-31-12-156:~$ uname -a
Linux ip-172-31-12-156 4.15.0-1054-aws #56-Ubuntu SMP Thu Nov 7 16:18:50 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux
ubuntu@ip-172-31-12-156:~$ dpkg --print-foreign-architectures
armhf
ubuntu@ip-172-31-12-156:~$ file hello_hf
hello_hf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 3.2.0, BuildID[sha1]=c95f0c46dfab925db53506751d7677156e334e5c, not stripped
ubuntu@ip-172-31-12-156:~$ ./hello_hf
hello, world!

【讨论】:

  • 如果您有GCC Compile Farm 帐户,那么 GCC117 和 GCC118 是 ARMv8a 和 Cortex A-57 的。我相信他们有你实验所需要的东西。 FOSS 开发人员可以免费使用编译场帐户。 (不要使用 GCC113-GCC116。它们是早期的 Mustang 板,缺少 A 配置文件扩展)。
  • 如果您需要它,我可以提供远程 SSH 访问多个带有 Cortex A-53 的开发板。例如,Libre 计算机LePotato。通过 noloader, gmail 帐户向我发送电子邮件。
  • 我实际上只是启动了一台新的 AWS ARM 裸机机器,并确认 gnueabi 和 gnueabihf 工具链生成的旧 ARM 二进制文件可以在那里工作!
【解决方案2】:

随着 32 位 ARM 芯片的逐步淘汰,这个问题变得更加重要。 我,我喜欢看到新的 64 位硬件支持旧的 32 位二进制文​​件。不是很重要,但很方便。 我取出了旧的 Raspberry Pi Zero(32 位)和 Raspberry Pi 3B+(64 位),第一次在 3B+ 上安装了 64 位操作系统,尽管有错误警告等,并进行了一些编译。 没有特殊的 make 参数。只是普通的32位编译。 在 32 位和 64 位上运行良好。 控制器和虚拟机将运行 32 位架构多年。 4GB 内存限制是痛苦的。但对于小型应用来说,这不是问题。

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多