Env:Ubuntu 18.04,Linux Kernel 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 ?? ()
#1 0x00007f2d592294e4 in stat64 (__statbuf=0x7f2d8f3a14f0, __path=0x7f2d882d7d60 "/etc/app/cfg") at /usr/include/x86_64-linux-gnu/sys/stat.h:500
行让我感到困惑。
我不知道为什么会明确使用stat64
。首先,它需要定义_GNU_SOURCE
。其次,据我所知,glibc的stat
已经处理了所有特定于内核的32
/ 64
位差异人员。
此外,stat
和stat64
都在我的内核上使用相同的stat
系统调用。
[最可能的解释是程序在包含任何系统头文件之前做了#define _FILE_OFFSET_BITS 64
。这将导致对普通stat
的调用重新映射为stat64
,open
到open64
等。如今,所有应用程序都应执行此操作。
但是,有理由直接使用stat64
等。在逻辑上公共接口应该包含off_t
或通过定义_FILE_OFFSET_BITS
更改的任何其他类型的库中,您不能在接口头中使用该定义或任何这些类型,因为这样自己的ABI将取决于该宏的设置,该宏是由库用户而不是您控制的。相反,您必须定义_LARGEFILE64_SOURCE
,并在接口头文件中使用显式大小的类型(off64_t
等)和函数(stat64
等)。原则上,未公开给外部宏定义的.c和.h文件仍可以使用_FILE_OFFSET_BITS
和普通函数,但实际上,实施样式规则更容易,因为样式规则必须是库代码的[[all仅使用显式大小的类型和函数。