0
爲了得到struct stat
描述文件,可以調用* stat系列函數來填充由帶有結構值的指針所指向的內存。如何確定從程序集的stat結構調用中的字段偏移量?
在Ç我們可以稱之爲POSIX.1-2008 offsetof宏,但它是一個宏觀的,組裝不可用。
如何從程序集中確定struct的大小以及如何確定字段的偏移量,以便可以提取必要的字段,如st_size
,st_mode
等等?
爲了得到struct stat
描述文件,可以調用* stat系列函數來填充由帶有結構值的指針所指向的內存。如何確定從程序集的stat結構調用中的字段偏移量?
在Ç我們可以稱之爲POSIX.1-2008 offsetof宏,但它是一個宏觀的,組裝不可用。
如何從程序集中確定struct的大小以及如何確定字段的偏移量,以便可以提取必要的字段,如st_size
,st_mode
等等?
平臺的ABI決定了C結構填充的規則。例如,x86-64 Linux使用the x86-64 System V ABI。困難的方法:閱讀ABI並自行解決。鏈接x86標記wiki。 (實際上並不那麼難,結構中對齊/填充的規則很簡單:每個成員按聲明順序排列,並自然對齊,這可能需要填充)。簡單的方法:讓編譯器通過編寫存儲在結構中的函數來計算偏移量,然後查看asm。
例如
#include <sys/stat.h>
void foo(struct stat *st) {
st->st_size = 1;
st->st_mode = 2; // different numbers so you know which field is which in the output
}
mov QWORD PTR [rdi+48], 1
mov DWORD PTR [rdi+24], 2
ret
能否請您詳細闡述更多的「讓編譯器計算......」在哪裏可以找到ABI對AMD64平臺? –
@BulatM。 amd64有兩個ABI。 Windows和另一個(amd64 SysV ABI)使用的是大多數其他操作系統。你想要哪一個? – fuz
@BulatM .: ABI鏈接[x86 tag wiki](http://stackoverflow.com/tags/x86/info)。 –