А как прописать флаги в open()?
Ну, собственно, имеется код GNU assembler aarch64:
.data
filename:
.ascii "file.asm"
.text
globl _start
_start:
; int open(const char* path, int flags)
ldr x0, =filename ; filename
mov x1, ??? ; FLAG
mov w8, #180 ; open() syscall
svc #0
И вот проблема. Я не могу написать так:
mov x1, O_CREAT
mov x1, #O_CREAT
Мне бы число этого аргумента: по идее, именно его надо туда писать. Да только где взять числа к флагам int flags??? man 2 open тоже молчит.
Ответы (1 шт):
Автор решения: RandomDice 779
→ Ссылка
В итоге я сделал вот что (опишу командами):
~ $ nano write.cpp
#include <fstream>
using namespace std;
int main() {
ofstream filesys;
filesys.open("file.asm", ios::app);
filesys.close();
return 0;
}
~ $ g++ write.cpp
~ $ sudo strace ./a.out | grep open
# сокращу вывод
openat(AT_FDCWD, "file.asm", O_CREAT|O_WRONLY|O_APPEND, 0666);
Что же, используется-таки openat(). Ищу столь бесящий AT_FDCWD: первый же запрос в гугл дал ответ). А дальше через fcntl.h нашёл ответ:
.data
file:
.ascii "file.asm"
.text
.globl _start
_start:
mov x0, -100 ; AT_FDCWD
ldr x1, =file ; const char* filename
mov x2, 0100 ; O_CREAT
mov x3, 0700 ; int mode
mov w8, #56 ; openat()
svc #0
mov x0, #0 ; return 0
mov w8, #93
svc #0