旧的 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 内核上运行吗?的主要内容,如果未能解决你的问题,请参考以下文章
从 amd64 可执行文件调用 aarch64 共享库,可能使用二进制翻译/QEMU
经验分享华为atlas500系列aarch64交叉编译opencv
在运行 64 位 linux 的 Armv8 (aarch64) 上编译并运行 32 位二进制文件