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

