为什么要显式调用 stat64?
Why would one call stat64 explicitly?
环境: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 ?? ()
第 #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
系统调用。
最可能的解释是程序在包含任何系统 headers 之前执行了 #define _FILE_OFFSET_BITS 64
。这导致对普通 stat
的调用被重新映射到 stat64
、open
到 open64
等。现在所有应用程序都应该这样做。
不过直接用stat64
etc也是有道理的。在一个 public 接口逻辑上应该涉及 off_t
或通过定义 _FILE_OFFSET_BITS
更改的任何其他类型的库中,你 不能 使用在您的界面中定义或任何这些类型 headers 因为那时您自己的 ABI 将取决于该宏的设置,该设置由库用户控制,而不是您。相反,您必须在接口 headers 中定义 _LARGEFILE64_SOURCE
并使用明确大小的类型(off64_t
等)和函数(stat64
等)。原则上,未暴露给外部宏定义的 .c 和 .h 文件仍然可以使用 _FILE_OFFSET_BITS
和普通函数,但实际上更容易执行 all[= 的样式规则28=] 的库代码必须仅使用明确大小的类型和函数。
环境: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 ?? ()
第 #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
系统调用。
最可能的解释是程序在包含任何系统 headers 之前执行了 #define _FILE_OFFSET_BITS 64
。这导致对普通 stat
的调用被重新映射到 stat64
、open
到 open64
等。现在所有应用程序都应该这样做。
不过直接用stat64
etc也是有道理的。在一个 public 接口逻辑上应该涉及 off_t
或通过定义 _FILE_OFFSET_BITS
更改的任何其他类型的库中,你 不能 使用在您的界面中定义或任何这些类型 headers 因为那时您自己的 ABI 将取决于该宏的设置,该设置由库用户控制,而不是您。相反,您必须在接口 headers 中定义 _LARGEFILE64_SOURCE
并使用明确大小的类型(off64_t
等)和函数(stat64
等)。原则上,未暴露给外部宏定义的 .c 和 .h 文件仍然可以使用 _FILE_OFFSET_BITS
和普通函数,但实际上更容易执行 all[= 的样式规则28=] 的库代码必须仅使用明确大小的类型和函数。