2016-09-11 33 views
0

爲了得到struct stat描述文件,可以調用* stat系列函數來填充由帶有結構值的指針所指向的內存。如何確定從程序集的stat結構調用中的字段偏移量?

Ç我們可以稱之爲POSIX.1-2008 offsetof宏,但它是一個宏觀的,組裝不可用。

如何從程序集中確定struct的大小以及如何確定字段的偏移量,以便可以提取必要的字段,如st_size,st_mode等等?

回答

1

平臺的ABI決定了C結構填充的規則。例如,x86-64 Linux使用the x86-64 System V ABI。困難的方法:閱讀ABI並自行解決。鏈接標記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 

(從Godbolt compiler explorer

+0

能否請您詳細闡述更多的「讓編譯器計算......」在哪裏可以找到ABI對AMD64平臺? –

+0

@BulatM。 amd64有兩個ABI。 Windows和另一個(amd64 SysV ABI)使用的是大多數其他操作系統。你想要哪一個? – fuz

+1

@BulatM .: ABI鏈接[x86 tag wiki](http://stackoverflow.com/tags/x86/info)。 –

相關問題