通过ARMv8手册,我有以下问题来帮助理解大局。
可以使用传统的32位应用。 (ARMv7或更早版本)在ARMv8 OS上按原样运行?
如果需要为ARMv8重建遗留应用程序并假设我将应用程序重建为32位(Aarch32),那么这需要32位操作系统底层支持吗? (了解寻址机制如何在这里工作很有趣。)
请尽可能提供参考。
PS:我的目标是支持Aarch64支持的Linux操作系统(3.7及更高版本)
答案 0 :(得分:5)
Aarch64平台可以运行32位ARM,但这种兼容性是可选的。
要运行AArch32二进制文件,您需要所有库应用程序在32位版本中使用。与x86-64系统上的i686二进制文件相同。
答案 1 :(得分:0)
在https://github.com/torvalds/linux/blob/v4.17/arch/arm64/Kconfig#L1274处还有一个Linux arm64 CONFIG_COMPAT
,上面写着:
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中已弃用)。
对于裸机,您通常会遇到从另一个平台使用二进制文件的所有常见问题。因此,在大多数情况下,您将需要进行某种程度的移植。
然后我用this QEMU full system setup自己尝试了一次,但是尝试失败了:我使用armv7编译器编译了一个C hello世界,如下:
arm-linux-gcc -static hello_world.c
并将生成的文件放入aarch64目标中,但是当我尝试运行该文件时,它失败了:
a.out: line 1: syntax error: unexpected word (expecting ")")
即使/proc/config.gz
说设置了CONFIG_COMPAT
。
似乎Linux内核不是identifying it as an ELF file,而是回退到/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-a-different-architechture