Почему системный вызов stat возвращает 0 для st_size в NASM - PullRequest
0 голосов
/ 09 мая 2020

Я пытался использовать stat в NASM для получения размеров файлов. Однако st_size возвращает 0. Может ли кто-нибудь объяснить, почему это происходит?

Вот мой код:

global _main
extern _printf

section .bss
    stat resb 144

section .text
    filename:
        db "test.asm", 0   ; The name of this NASM file

    format:
        db "%lld", 10, 0

    _main:
        mov rax, 0x20000bc   ; system call for stat
        mov rdi, filename
        mov rsi, stat
        syscall   ; returns 0

        push rax
        mov rdi, format
        mov rsi, stat
        mov rsi, [rsi + 96]   ; the offset of st_size in __DARWIN_STRUCT_STAT64 as defined in <sys/stat.h> is 96
        call _printf
        pop rax

        ret

Это не дубликат Получить размер файла с помощью системного вызова stat

1 Ответ

1 голос
/ 09 мая 2020

Вы используете неправильный системный вызов. Это тот, который обеспечивает обратную совместимость с 32-битной структурой. Конечно, это означает, что поле st_size не находится со смещением, ожидаемым вашим кодом.

Имя символа функции stat() не равно _stat, по умолчанию, начиная с версии 10.6. Скорее это _stat$INODE64. Если вы посмотрите на сборку для этого в /usr/lib/system/libsystem_kernel.dylib, вы обнаружите, что она использует значение syscall 0x2000152.

...