MacOS Ventura下nasm与ld编译Hello World报错求助
汇编Hello World的错误解决方法
错误原因拆解
- 一开始用
nasm -f elf64编译,生成的是Linux专属的ELF格式目标文件,macOS的ld链接器不兼容,直接认不出文件格式,所以报错。 - 换成
macho64格式后仍有问题:- macOS的
ld默认找_main当程序入口,你的代码用的是_start,链接器找不到入口符号,所以报_main未定义。 - 代码里的系统调用号是Linux的(比如
rax=1对应write),macOS的syscall规则完全不同,必须加0x2000000前缀。 _start的对齐不符合macho64要求,触发对齐警告。
- macOS的
修正后的完整代码
section .data msg db "Hello world", 10 ; 带换行的字符串,总长度13 section .text global _start ; 声明全局入口符号 _start: ; macOS 写操作syscall:rax=0x2000004,参数依次是文件描述符、缓冲区地址、长度 mov rax, 0x2000004 mov rdi, 1 ; 1代表标准输出(stdout) mov rsi, msg mov rdx, 13 syscall ; macOS 退出程序syscall:rax=0x2000001,参数是退出码 mov rax, 0x2000001 mov rdi, 0 ; 0代表正常退出 syscall
正确的编译链接命令
编译生成macho64格式目标文件,链接时显式指定入口为_start:
nasm -f macho64 main.asm ld -e _start -o main main.o
运行验证
执行生成的可执行文件:
./main
会输出:Hello world
额外说明
- macOS的syscall规则:所有系统调用号都要加上
0x2000000前缀,基础调用号和BSD系统一致(比如write是4,exit是1)。 - 如果不想用
_start当入口,也可以把入口改成_main,链接时就不用加-e _start参数,但汇编里还是用syscall退出更直接。
内容的提问来源于stack exchange,提问作者Jeryl
相关产品推荐
相关产品推荐

