【发布时间】:2019-12-05 20:21:36
【问题描述】:
我正在使用 sys_open 和 sys_write 打开现有文件以写入其中。当我创建一个新文件时, sys_write 可以正常工作,如下所示。但是如果我使用 sys_open,则返回值为负(-13,即“权限被拒绝”)并且写入不起作用(当然)。
这行得通:
section .data
File_Name: db '/opt/Test_Output_Files/Linux_File_Test',0
File_Mode: dq 754q
Write_Buffer: db 'This is what I want to write',0
section .text
; Create file
mov rax,85 ; sys_creat
mov rdi,File_Name
mov rsi,File_Mode ; mode (permissions)
syscall
mov rdi,rax ; return code from sys_creat
mov rax,1 ; sys_write
mov rsi,Write_Buffer
mov rdx,29
syscall
但是当我打开现有文件时,sys_open 命令失败:
mov rax,2 ; sys_open
mov rdi,File_Name
mov rsi,2 ;read-write
mov rdx,[File_Mode]
syscall
因为这是一个权限错误,所以问题很可能是 rsi 中的标志值,因为 rdx 中的模式值与我在 sys_creat (754) 中使用的模式值相同。根据http://man7.org/linux/man-pages/man2/open.2.html 和https://linux.die.net/man/3/open 的Linux 手册页,需要三个选项:
O_RDONLY - Open for reading only.
O_WRONLY - Open for writing only.
O_RDWR - Open for reading and writing. The result is undefined if this flag is applied to a FIFO.
我知道只读是零,所以我假设只写和读写是 1 和 2,但是我没有找到任何我们将在汇编语言中使用的数值列表,不像模式基于 chmod ——它与我用于创建的模式值相同,它有效。
我对此进行了广泛的研究,但是关于 64 位系统调用的信息很少——其中大部分是 32 位的。对于 NASM,我需要为 rsi 中的标志使用数值。手册页说“此外,零个或多个文件创建标志和文件状态标志可以在标志中按位或进行。文件创建标志是 O_CLOEXEC、O_CREAT、O_DIRECTORY、O_EXCL、O_NOCTTY、O_NOFOLLOW、O_TMPFILE 和 O_TRUNC。 "如果我知道它们的值是什么,我可以按位或它们。
感谢您对此的任何帮助。
【问题讨论】:
-
尝试使用 mov rsi, 0754o 直接对你的模式进行编码。
-
谢谢,但不幸的是这也不起作用。
-
“返回值为负” 究竟是什么? IE。您遇到了哪个具体错误?
-
@RTC222 执行系统调用指令后 rax 寄存器中的值是多少?你说的是负数,但实际数字是多少?
-
我更新了上面的问题——返回值为-13,权限被拒绝。这表明问题在于,正如我上面所说,rsi 中的标志值。我还没有找到任何标志的数值来源,因此我可以对它们进行异或以创建正确的值。 Linux 手册页中的值适用于 C 程序,但不适用于汇编。