Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息,并通过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位差值法。

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

最佳答案

最可能的解释是程序在包含任何系统头文件之前做了#define _FILE_OFFSET_BITS 64。这导致对纯stat的调用重新映射为stat64open映射为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