在阅读ARMv8手册时,我有以下几个问题来帮助理解全局。
请尽可能提供参考资料。
PS:我以Linux为目标,支持Aarch64 (3.7及更高版本)
发布于 2014-04-12 09:15:25
Aarch64平台可以运行32位ARM,但这种兼容性是可选的。
要运行AArch32二进制文件,您需要在32位版本中使用所有库应用程序。与x86-64系统上的i686二进制文件相同。
发布于 2018-07-22 15:42:37
还有一个Linux arm64 CONFIG_COMPAT at: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世界,如:
arm-linux-gcc -static hello_world.c并将构建的文件放入aarch64目标,但当我尝试运行它时,它失败了:
a.out: line 1: syntax error: unexpected word (expecting ")") 尽管/proc/config.gz说CONFIG_COMPAT已经设置好了。
似乎Linux内核不是将其标识为ELF文件,而是返回到/bin/sh,如果我这样做的话,我会得到同样的错误:
sh /mnt/9p/a.out试着用弹壳代替ELF。
尤其是,我知道Linux内核可以从binfmt签名中选择archs,因为qemu-user这样做:https://unix.stackexchange.com/questions/41889/how-can-i-chroot-into-a-filesystem-with-a-different-architechture。
https://stackoverflow.com/questions/22460589
复制相似问题