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

Mac 64位下NASM汇编调用unlink删除文件失败求助

你代码存在的核心问题如下:

  • 栈16字节对齐不符合XNU内核要求:MacOS 64位系统执行系统调用前,必须保证栈指针rsp为16字节对齐。程序刚进入start入口时,栈顶存放的是8字节的argc值,此时rsp仅8字节对齐,直接执行syscall会触发内核的对齐校验失败,导致系统调用未正常执行。
  • 路径大小写错误概率极高:MacOS默认的桌面目录名为首字母大写的Desktop,你代码中写的小写desktop会导致路径无法匹配到真实文件,触发文件不存在错误。
  • 缺少系统调用错误检查逻辑:syscall执行后返回值会存在rax寄存器中,如果值为负数则对应系统错误码(比如-2表示文件不存在、-13表示权限不足),你没有捕获这部分返回值,无法快速定位故障原因。

相关疑问解答

unlink确实可以用于删除普通文件,系统调用本身只需要传入1个const char *pathname参数,你对参数的理解没有问题。


修正后可正常运行的代码示例

global start

section .text
    start:
        ; 调整栈对齐到16字节,补充8字节偏移满足对齐要求
        sub rsp, 8
        ; 删除/Unlink文件部分
        mov rax, 0x2000010 ; unlink系统调用号
        mov rdi, file ; 存放目标文件路径,对应.data段的file定义      
        syscall

        ; 可选:如果unlink出错,将错误码作为退出码返回,方便调试
        cmp rax, 0
        jge exit_success
        neg rax
        mov rdi, rax
       
    exit_success:
        ; 退出程序部分
        mov rax, 0x2000001 ; exit系统调用号
        syscall          

section .data
    ; 注意此处Desktop首字母大写,可根据你的实际路径调整
    file: db "/Users/daniel.yoffe/Desktop/assembly/CoolFile.txt", 0

编译运行命令参考

# 汇编生成目标文件
nasm -f macho64 unlink.asm -o unlink.o
# 链接生成可执行文件
ld -macosx_version_min 10.15 -lSystem unlink.o -o unlink
# 运行
./unlink

内容的提问来源于stack exchange,提问作者Yoffdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:27:01