2020款MacBook Pro运行ARM64脚本遇exec format error问题求助
解决macOS ARM64上汇编程序的
exec format error问题 问题根源
你用aarch64-elf-as和aarch64-elf-ld编译生成的是ELF格式的ARM64可执行文件,而macOS(包括Sonoma 14.0)使用Mach-O格式作为可执行文件标准,两者格式不兼容,因此触发zsh: exec format error。另外你编写的汇编代码采用的是Linux/System V的系统调用号和入口点规则,也不符合macOS的运行规范。
解决方案
1. 使用macOS原生工具链编译
macOS自带的Clang/LLVM工具链可直接生成兼容的Mach-O格式可执行文件,步骤如下:
第一步:修改汇编代码适配macOS ARM64
替换原代码为以下内容(调整入口点和系统调用规则):
.global _main .section .data hello_message: .asciz "Hello, World!\n" .section .text _main: // 系统调用:write(1, hello_message, 13) mov x0, #1 // stdout文件描述符 ldr x1, =hello_message // 字符串地址 mov x2, #13 // 字符串长度(含换行符) mov x16, #4 // macOS ARM64系统调用号:write(实际对应0x2000004) svc #0x80 // 触发系统调用 // 系统调用:exit(0) mov x0, #0 // 退出码0 mov x16, #1 // macOS ARM64系统调用号:exit(实际对应0x2000001) svc #0x80
第二步:编译链接
执行以下命令生成可执行文件:
clang -arch arm64 hello.s -o hello
第三步:运行程序
./hello
此时会正常输出Hello, World!。
2. 手动用汇编器和链接器构建(进阶)
如果想拆分汇编和链接步骤,使用macOS自带的as和ld工具:
# 汇编生成目标文件 as -arch arm64 hello.s -o hello.o # 链接生成可执行文件,指定入口点并链接系统库 ld -arch arm64 -e _main -o hello hello.o -lSystem
验证格式
运行file hello,正确结果应为:
hello: Mach-O 64-bit executable arm64
内容的提问来源于stack exchange,提问作者stang-Spitfire1975
相关产品推荐
相关产品推荐

