许多 linux/x86-64 系统调用接受结构体指针作为参数。
例如第二个参数stat(2)
is 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 架构是否定义了它?或者这只是内核碰巧使用哪个编译器进行编译的问题?
(给定结构体的某个成员,我需要计算该成员相对于结构体地址的起始偏移量)
结构的布局不是在 C 标准中定义的,而是在 ABI 定义中定义的,在您的例子中是 System V AMD64 ABI。也就是说,一般来说,布局是依赖于操作系统的,并且所有针对该操作系统的编译器都必须符合 ABI(尽管如果您知道自己在做什么,大多数编译器都可以选择生成不同的布局)。 ABI 还定义了如何将参数传递给函数、如何返回值、在调用过程中必须保留哪些寄存器等等。
您需要的 ABI 定义应该可以在http://www.x86-64.org/ http://www.x86-64.org/(貌似已经下来了)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)