А как прописать флаги в 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
→ Ссылка