为什么 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
.
我一直在尝试使用 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
.