ARM汇编程序执行报错:cannot execute: required file not found求助
解决树莓派400 64位系统上ARM汇编程序无法执行的问题
问题根源
你使用的arm-linux-gnueabi-*工具链是针对32位ARM(armhf/armel)架构的交叉编译工具,生成的是32位ELF可执行文件。而树莓派400搭载的是64位ARM(AArch64)系统,默认未预装32位程序运行所需的兼容库,因此直接运行32位程序会出现文件找不到的错误。
可以用以下命令验证生成的程序架构:
file hello
如果输出包含ELF 32-bit LSB executable, ARM,则确认是32位程序。
解决方案
有两种可行的解决方式,根据你的需求选择:
方式一:安装32位兼容库,运行32位程序
如果想继续使用教程中的32位汇编代码,只需安装树莓派64位系统的32位兼容库:
- 添加32位架构支持:
sudo dpkg --add-architecture armhf - 更新软件源并安装32位C库:
sudo apt update && sudo apt install libc6:armhf
安装完成后,重新运行./hello即可执行32位程序。
方式二:改用64位ARM(AArch64)工具链与汇编代码
树莓派400原生支持64位程序,推荐使用64位工具链和对应汇编指令:
- 安装64位ARM交叉编译工具链(本地编译也可直接用系统默认的
gcc/as):sudo apt install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu - 修改汇编代码为AArch64架构版本(指令和系统调用号与32位不同):
.global _start .section .text _start: mov x0, #42 // 退出状态码(对应32位的r0) mov x8, #93 // AArch64架构下exit系统调用号为93(32位为1) svc #0 // 触发系统调用(对应32位的swi) - 编译生成64位可执行文件:
# 使用交叉工具链 aarch64-linux-gnu-as hello.s -o hello.o aarch64-linux-gnu-gcc hello.o -o hello -nostdlib # 或本地原生编译(树莓派400自带64位工具链) as hello.s -o hello.o gcc hello.o -o hello -nostdlib - 运行程序:
./hello
执行后可以用echo $?查看退出状态码,会输出42,验证程序正常运行。
内容的提问来源于stack exchange,提问作者MaaaaathiiiiiiiiiiEU
相关产品推荐
相关产品推荐

