为什么 stat 系统调用 return 0 for st_size in NASM

Why does stat system call return 0 for st_size in NASM

我一直在尝试使用 NASM 中的统计信息来获取文件大小。然而,st_size returns 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

这不是 Get file size with stat syscall

的副本

您使用了错误的系统调用。这是为了向后兼容 32 位大小的结构。当然,这意味着 st_size 字段不在您的代码期望的偏移处。

stat() 函数的符号名称不是 _stat,默认情况下,自 10.6 起。相反,它是 _stat$INODE64。如果您查看 /usr/lib/system/libsystem_kernel.dylib 中的程序集,您会发现它使用系统调用值 0x2000152.