C 为什么要显式调用stat64?
Env:ubuntu18.04,Linux内核5.3 我正在用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
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
。这会导致对plainstat
的调用被重新映射到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
。