旧的 ARM32 二进制文件可以在 AARCH64 内核上运行吗?

Posted

技术标签:

【中文标题】旧的 ARM32 二进制文件可以在 AARCH64 内核上运行吗?【英文标题】:Can old ARM32 binary files be run on AARCH64 kernel? 【发布时间】:2016-04-11 11:17:31 【问题描述】:

我很好奇在 AARCH64-Linux 机器上运行旧的 ARM32-Linux 程序的可行性,我进行了一些实验:

    编写程序“Hello, World!”并使用 arm-none-linux-gnueabi-gcc 和 aarch64-linux-gnu-gcc 进行静态编译。 使用 busybox 和 aarch64 编译器静态构建和创建 ramdisk。 把 2“你好,世界!”程序(在 ARM32 和 AARCH64 中)到 ramdisk。 使用 vexpress_defconfig 和 aarch64 编译器构建简单的 AARCH64-Linux 内核。 使用 qemu-system-aarch64 运行内核和 ramdisk。

(ramdisk中包括busybox在内的所有二进制文件都是静态编译的。)

结果:

    “你好,世界!” AARCH64 中的程序已成功执行。 “你好,世界!” ARM32 中的程序无法运行,但显示消息:

第 1 行:语法错误:意外单词(预期为“)”)

有解决上述问题的建议或专业知识吗?

【问题讨论】:

一个有趣的问题。但我很确定这是 ABI 问题,而不是语言问题。 您使用的是非标准内核吗?主线 arm64 doesn't have a vexpress_defconfig,而您不会使用 arm64 defconfig 来解决这个问题(默认情况下启用必要的位)。 【参考方案1】:

谢谢你moonbutt74。您为我寻求解决该问题的方法提供了有用的线索。

要启用在 AARCH64 内核上运行 ARM32-Linux 程序的支持,应选择内核中的选项:

    运行 make menuconfig ARCH=arm64 转到选项并选择它:

用户空间二进制格式 ---> 对 32 位 EL0 的内核支持

    运行make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-重新编译内核

    使用 ramdisk 和 qemu-system-aarch64 运行重新编译的内核。

    “你好,世界!” (ARM32和AARCH64)中的程序可以成功执行!!

【讨论】:

以上是关于旧的 ARM32 二进制文件可以在 AARCH64 内核上运行吗?的主要内容,如果未能解决你的问题,请参考以下文章

关于ARM架构的一些知识

从 amd64 可执行文件调用 aarch64 共享库,可能使用二进制翻译/QEMU

经验分享华为atlas500系列aarch64交叉编译opencv

在运行 64 位 linux 的 Armv8 (aarch64) 上编译并运行 32 位二进制文​​件

aarch64-linux-gnu-g++ 交叉编译为 arm64 错误

AArch64 - 并行运行 ARM 和 ASIMD 指令