You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS Ventura下nasm与ld编译Hello World报错求助

汇编Hello World的错误解决方法

错误原因拆解

  1. 一开始用nasm -f elf64编译,生成的是Linux专属的ELF格式目标文件,macOS的ld链接器不兼容,直接认不出文件格式,所以报错。
  2. 换成macho64格式后仍有问题:
    • macOS的ld默认找_main当程序入口,你的代码用的是_start,链接器找不到入口符号,所以报_main未定义。
    • 代码里的系统调用号是Linux的(比如rax=1对应write),macOS的syscall规则完全不同,必须加0x2000000前缀。
    • _start的对齐不符合macho64要求,触发对齐警告。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:40:41