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
相关产品推荐
相关产品推荐

