Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C x86中stat结构的布局_C_Linux_Linux Kernel_X86 - Fatal编程技术网

C x86中stat结构的布局

C x86中stat结构的布局,c,linux,linux-kernel,x86,C,Linux,Linux Kernel,X86,我正在进行一个逆向工程练习,突然遇到一个关于查看linux的struct stat的问题。当我出于某种原因编译代码时,字段没有按照我的预期对齐。st_dev和st_ino之间似乎有两个0字的差距,我不明白为什么这只是用编译的 gcc-m32结构c 结构c #include <sys/types.h> #include <sys/stat.h> #include <time.h> #include <stdio.h> #include <std

我正在进行一个逆向工程练习,突然遇到一个关于查看linux的struct stat的问题。当我出于某种原因编译代码时,字段没有按照我的预期对齐。st_dev和st_ino之间似乎有两个0字的差距,我不明白为什么这只是用编译的

gcc-m32结构c

结构c

#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) 
{
    struct stat sb;

    sb.st_dev=0xbeef;
    sb.st_ino=0xdead;
    sb.st_mode=0xfeed;
    sb.st_nlink=0xffff;
    sb.st_uid=0x888f;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
结构统计某人;
sb.st_dev=0xbeef;
sb.st_ino=0xdead;
sb.st_模式=0xfeed;
sb.st_nlink=0xffff;
sb.st_uid=0x888f;
}
相关组件

08048374 <main>:
 8048374:   8d 4c 24 04             lea    0x4(%esp),%ecx
 8048378:   83 e4 f0                and    $0xfffffff0,%esp
 804837b:   ff 71 fc                pushl  0xfffffffc(%ecx)
 804837e:   55                      push   %ebp
 804837f:   89 e5                   mov    %esp,%ebp
 8048381:   51                      push   %ecx
 8048382:   83 ec 60                sub    $0x60,%esp
 8048385:   c7 45 a4 ef be 00 00    movl   $0xbeef,0xffffffa4(%ebp)
 804838c:   c7 45 a8 00 00 00 00    movl   $0x0,0xffffffa8(%ebp)
 8048393:   c7 45 b0 ed be 00 00    movl   $0xdead,0xffffffb0(%ebp)
 804839a:   c7 45 b4 ed fe 00 00    movl   $0xfeed,0xffffffb4(%ebp)
 80483a1:   c7 45 b8 ff ff 00 00    movl   $0xffff,0xffffffb8(%ebp)
 80483a8:   c7 45 bc 8f 88 00 00    movl   $0x888f,0xffffffbc(%ebp)
 80483af:   83 c4 60                add    $0x60,%esp
08048374:
8048374:8d 4c 24 04 lea 0x4(%esp),%ecx
8048378:83 e4 f0和$0xfffffff0,%esp
804837b:ff 71 fc PUSH 0xfffffffc(%ecx)
804837e:55推力%ebp
804837f:89 e5 mov%esp,%ebp
8048381:51推力%ecx
8048382:83 ec 60子$0x60,%esp
8048385:c7 45 a4 ef为00 movl$0xbeef,0xffffffa4(%ebp)
804838c:C745A800MOVL$0x0,0xFFFFFF8(%ebp)
8048393:c7 45 b0 ed为00 movl$0xdead,0xffffffb0(%ebp)
804839a:c7 45 b4 ed fe 00移动$0xfeed,0xffffffb4(%ebp)
80483a1:c7 45 b8 ff 00移动$0xffff,0xffffffb8(%ebp)
80483a8:c7 45 bc 8f 8800 movl$0x888f,0xffffffbc(%ebp)
80483af:83 c4 60添加$0x60,%esp
我期望0xdead在0xFFFFFF8(%ebp)处,但不明白为什么不是这样

作为参考,我查看了这个二进制文件,以及它打印的字段在20.7.1练习#1中表示的内容

tar

真正的
stat
结构在
/usr/include/bits/stat.h
中定义(包括在
中)。您将了解那里的偏移量。

实际的
stat
结构在
/usr/include/bits/stat.h
中定义(包含在
中)。您将了解那里的偏移量。

实际的
stat
结构在
/usr/include/bits/stat.h
中定义(包含在
中)。您将了解那里的偏移量。

实际的
stat
结构在
/usr/include/bits/stat.h
中定义(包含在
中)。您将理解那里的偏移量。

使用
gcc-m32-O1-fverbose asm-S struct.c
编译,并使用类型
st_dev
比您假设的更宽。@Jongware,是的,显然它是一个四字。使用
gcc-m32-O1-fverbose asm-S struct.c
编译,并使用类型
st_dev
比您假设的要宽。@Jongware,是的,显然它是一个四字。使用
gcc-m32-O1-fverbose asm-S struct.c
编译,并使用类型
st_dev
比您假设的要宽。@Jongware,是的,显然它是一个四字。使用
gcc-m32-O1-fverbose asm-S struct.c
编译,并使用类型
st_dev
比您假设的要宽。@Jongware,是的,显然它是一个四字。st_dev是一个四字,后面加上paddin,如/usr/include/bits/stat.h似乎是原因。st_dev是一个四字,后面加上paddin,如/usr/include/bits/stat.h似乎是原因。st_dev是一个四字,后面加上paddin,如/usr/include/bits/stat.h似乎是原因reasonst_dev是一个四字,后面加了填充符,如/usr/include/bits/stat.h,这似乎是原因