系统调用 stat() 转换为 stat64(),没有任何 cpp 选项

pus*_*rnk 3 c linux gcc gnu libc

我运行的是 32 位 SUSE Linux,内核级别为 3.0.76。

我可以看到代码中的 stat() 调用在 strace 输出中转换为 stat64(),而无需指定任何 CPP 选项,例如 _LARGEFILE64_SOURCE 或 _FILE_OFFSET_BITS=64。

#include<stdio.h>
#include<sys/stat.h>

int main ( int argc, char * argv[] )
{
    char * path = "nofile";
    struct stat b;
    if (stat(path, &b) != 0) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我用 gcc 编译了这个文件,没有编译器选项/标志。

运行程序时,相关的 strace 输出为:

    munmap(0xb770a000, 200704)              = 0
    stat64("nofile", 0xbfb17834)            = -1 ENOENT (No such file or directory)
    exit_group(-1)   
Run Code Online (Sandbox Code Playgroud)

谁能告诉我 stat() 是如何转换为 stat64() 的?

提前致谢!

nos*_*nos 5

答案似乎可以在 stat 手册页中找到

随着时间的推移,stat 结构体大小的增加导致了 stat() 的三个连续版本:sys_stat()(插槽 __NR_oldstat)、sys_newstat()(插槽 __NR_stat)和 sys_stat64()(内核 2.4 中的新功能;插槽 __NR_stat64) )。glibc stat() 包装函数向应用程序隐藏这些详细信息,调用内核提供的最新版本的系统调用,并在旧二进制文件需要时重新打包返回的信息。类似的注释适用于 fstat() 和 lstat()。

基本上,glibc 总是调用 stat64。

如果添加 a printf("%zu\n", sizeof b);struct stat则大小可能会有所不同,具体取决于您是否使用 _FILE_OFFSET_BITS=64 ,并且 glibc 会struct stat在内核和代码之间进行转换。