C 为什么要显式调用stat64?

C 为什么要显式调用stat64?,c,linux,linux-kernel,gdb,C,Linux,Linux Kernel,Gdb,Env:ubuntu18.04,Linux内核5.3 我正在用gdb调试一些二进制文件。以下是我在捕获stat系统调用时发现的内容: (gdb) bt #0 0x00007f2d8ecae775 in __GI___xstat (vers=vers@entry=1, name=name@entry=0x7f2d882d7d60 "/etc/app/cfg", buf=buf@entry=0x7f2d8f3a14f0) at ../sysdeps/unix/sysv/linux/wordsize

Env:ubuntu18.04,Linux内核5.3

我正在用
gdb
调试一些二进制文件。以下是我在捕获
stat
系统调用时发现的内容:

(gdb) bt
#0  0x00007f2d8ecae775 in __GI___xstat (vers=vers@entry=1, name=name@entry=0x7f2d882d7d60 "/etc/app/cfg", buf=buf@entry=0x7f2d8f3a14f0) at ../sysdeps/unix/sysv/linux/wordsize-64/xstat.c:35
#1  0x00007f2d592294e4 in stat64 (__statbuf=0x7f2d8f3a14f0, __path=0x7f2d882d7d60 "/etc/app/cfg") at /usr/include/x86_64-linux-gnu/sys/stat.h:500
#2  0x00007f2d6fac1990 in ?? ()
#3  0x00007f2d8f3a15c8 in ?? ()
#4  0x00007f2d8f3a1620 in ?? ()
#5  0x00007f2d6fabbcb3 in ?? ()
#6  0x00000007170a2ae8 in ?? ()
#7  0x00007f2d8f3a15d0 in ?? ()
#8  0x0000000000000000 in ?? ()
stat64(uuuu statbuf=0x7f2d8f3a14f0,uuu path=0x7f2d882d7d60)/etc/app/cfg)中/usr/include/x86_64-linux-gnu/sys/stat.h:500)的行
#1 0x00007f2d592294e4让我感到困惑

我不知道为什么要显式地使用
stat64
。首先,它需要定义
\GNU\u SOURCE
。其次据我所知,glibc的
stat
已经处理了所有特定于内核的
32
/
64
-位差工作人员


此外,
stat
stat64
在我的内核上使用相同的
stat
系统调用。

最可能的解释是程序在包含任何系统头之前定义了一个
\u文件偏移量\u位64
。这会导致对plain
stat
的调用被重新映射到
stat64
open
open64
等。现在所有应用程序都应该这样做


但是,有理由直接使用
stat64
etc。在公共接口逻辑上应包含
off\u t
或通过定义
\u FILE\u OFFSET\u BITS
更改的任何其他类型的库中,您不能在接口头中使用该定义或其中任何类型,因为这样您自己的ABI将取决于该宏的设置,这是由库用户控制的,而不是您。相反,您必须定义
\u LARGEFILE64\u SOURCE
,并在接口头中使用显式大小的类型(
off64\t
等)和函数(
stat64
等)。原则上,不暴露于外部宏定义的.c和.h文件仍然可以使用
\u FILE\u OFFSET\u BITS
和普通函数,但在实践中,更容易实施一个样式规则,即库的所有代码必须只使用显式大小的类型和函数。

在我的Ubuntu 19.10上,文件
/usr/include/x86\u 64-linux-gnu/sys/stat.h
包含一行
#define stat stat64
。我没有分析在什么条件下(#ifdef)会使用它。可能源代码实际上包含
stat
,而不是直接使用
stat64