[英]Layout of structs in Linux/x86-64 syscalls for assembly programmers?
許多linux / x86-64系統調用接受指向結構的指針作為參數。
例如, stat(2)
的第二個參數是struct stat*
...
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
這意味着如果要從純匯編中調用系統調用,則必須知道每種類型有多大的規則,以及成員之間是否存在任何填充以進行對齊,等等。
C標准是否將此開放定義為(編譯器)實現定義,還是可以從標准中確定(假設原始類型大小已知)?
如果它保持打開狀態,內核或x86-64架構是否仍然定義它? 或者只是內核碰巧編譯的編譯器問題?
(這是結構的一些成員我需要計算該成員相對於struct的地址的起始偏移量)
結構的布局未在C標准中定義,但在ABI定義中,在您的情況下是System V AMD64 ABI。 也就是說,通常布局是依賴於操作系統的,並且所有針對該操作系統的編譯器必須符合ABI(盡管如果您知道自己在做什么,大多數編譯器都會選擇生成不同的布局)。 ABI還定義了如何將參數傳遞給函數,如何返回值,哪些寄存器必須在調用之間保留,等等。
您需要的ABI定義應該在http://www.x86-64.org/上提供 (似乎已關閉)
在Linux / x86-64下:
一個字節是8位。 大小和內存地址以1個字節為單位。
原始類型的對齊方式與其大小相同:
原始類型大小(和對齊)是:
bool 1
char 1
short 2
int 4
long 8
long long 8
__int128 16
void* 8
float 4
double 8
long double 16
__float128 16
__m64 8
__m128 16
結構(和聯合)對齊是其任何組件的最大對齊。
每個結構成員都被分配到具有適當對齊的最低可用偏移量。
結構的大小向上舍入到其最接近的對齊倍數。
結構和聯合對象可能需要填充以滿足大小和對齊約束。 任何填充的內容都是未定義的。
小於16個字節的數組具有其元素類型的對齊方式。
16字節或更長的數組具有(a)16中較高的對齊; (b)其元素類型的對齊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.