Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
9个月前关闭。
Improve this question
环境:Ubuntu 18.04,Linux Kernel 5.3
我正在使用
我不知道为什么会显式使用
此外,
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
9个月前关闭。
Improve this question
环境: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
等。在其逻辑上公共(public)接口(interface)应该包含off_t
或通过定义_FILE_OFFSET_BITS
更改的任何其他类型的库中,您不能在接口(interface) header 中使用该定义或任何这些类型,因为那样您自己的ABI将取决于该宏由库用户(而不是您)控制。相反,您必须定义_LARGEFILE64_SOURCE
并在接口(interface)头中使用显式大小的类型(off64_t
等)和函数(stat64
等)。原则上,未公开给外部宏定义的.c和.h文件仍可以使用_FILE_OFFSET_BITS
和普通函数,但实际上,实现样式规则更容易,因为所有库的代码都必须仅使用显式大小的类型和功能。
关于c - 为什么一个人会显式调用stat64? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61448470/
10-09 13:18