5

通过 ARMv8 手册,我有以下问题可以帮助理解全局。

  1. 可以使用旧版 32 位应用程序。(ARMv7 或更早版本)在 ARMv8 操作系统上按原样运行?

  2. 如果需要为 ARMv8 重建遗留应用程序并假设我将应用程序重建为 32 位 (Aarch32),这是否需要 32 位操作系统底层支持?(在这里了解寻址机制是如何工作的很有趣。)

请尽可能提供参考。

PS:我的目标是支持 Aarch64 的 Linux 操作系统(3.7 及更高版本)

4

2 回答 2

5

Aarch64 平台可以运行 32 位 ARM,但这种兼容性是可选的。

要运行 AArch32 二进制文件,您需要应用程序在 32 位版本中使用的所有库。与 x86-64 系统上的 i686 二进制文件相同。

于 2014-04-12T09:15:25.633 回答
2

还有一个 Linux arm64CONFIG_COMPAT在:https ://github.com/torvalds/linux/blob/v4.17/arch/arm64/Kconfig#L1274它说:

  This option enables support for a 32-bit EL0 running under a 64-bit
  kernel at EL1. AArch32-specific components such as system calls,
  the user helper functions, VFP support and the ptrace interface are
  handled appropriately by the kernel.

这可能是必需的,并且在此线程中提到的 ARM 员工:https ://community.arm.com/processors/f/discussions/5535/running-armv7-binaries-on-armv8 用户态指令与一些例外:

对于像 Linux 应用程序这样的东西,是的。ARMv8-A 包括 AArch32,它提供与 ARMv7-A 的向后兼容性。有一些限制,例如不再支持 SWP 指令。但这些是应用程序不太可能使用的类型(并且在 ARMv7 中已弃用)。

对于裸机,您会遇到在另一个平台上使用二进制文件的所有常见问题。因此,在大多数情况下,您将需要进行某种程度的移植。

然后我用这个 QEMU 完整系统设置为自己尝试了它,但我的尝试失败了:我用 armv7 编译器编译了一个 C hello world:

arm-linux-gcc -static hello_world.c

并将构建的文件放入 aarch64 目标,但是当我尝试运行它时它失败了:

a.out: line 1: syntax error: unexpected word (expecting ")")     

即使/proc/config.gzCONFIG_COMPAT已经设置好了。

似乎 Linux 内核没有将其识别为 ELF 文件,而是回退到/bin/sh,如果这样做,我会得到同样的错误:

sh /mnt/9p/a.out

正在尝试使用 shell binfmt 而不是 ELF。

特别是,我知道 Linux 内核可以从 binfmt 签名中选择拱门,因为qemu-user这样做:https ://unix.stackexchange.com/questions/41889/how-can-i-chroot-into-a-filesystem-with -不同的架构

于 2018-07-22T15:42:37.810 回答