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

sys_open系统调用读取文件问题:路径\0写法错误致ENOENT错误

解决sys_open系统调用中文件名找不到的问题

你遇到的问题根源在于文件名的空终止符定义错误,导致系统调用尝试打开一个包含\\0字符的错误路径。

问题原因

在NASM/YASM这类汇编器中,db '/path/to/test\0'里的\0会被解析成两个独立的ASCII字符:反斜杠(0x5C)和数字0(0x30),而不是我们需要的空终止符(0x00,C风格字符串的结束标志)。这就导致sys_open尝试打开的路径是/path/to/test\0(实际是/path/to/test加上反斜杠和0),自然找不到对应的文件,返回ENOENT错误。

解决方法

你需要用正确的方式给文件名添加空终止符,有两种通用写法:

  • 直接用逗号分隔字符串和空字节:db '/path/to/test', 0
  • 显式指定空字节的十六进制值:db '/path/to/test', 0x00

修正后的汇编代码

SYS_exit equ 0x3C
SYS_open equ 0x02
O_RDONLY equ 0x00
O_WRONLY equ 0x01
O_RDWR equ 0x02
section .text
global _start
_start:
 mov eax, SYS_open
 mov rdi, file_name
 mov rsi, O_RDONLY
 mov rdx, 0x00
 syscall
 mov eax, SYS_exit
 mov rdi, 0x00
 syscall
section .data
file_name: db '/path/to/test', 0  ; 这里是修正后的文件名定义

验证效果

修改后重新编译运行,用strace查看会发现open调用变成:

open("/path/to/test", O_RDONLY) = 3  ; 假设文件存在,返回合法的文件描述符

如果目标文件确实存在,系统调用就能成功获取文件描述符了。

内容的提问来源于stack exchange,提问作者St.Antario

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:35:50