为什么一个人会显式调用stat64?

问题描述 投票:1回答:1

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位差异人员。

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

c linux linux-kernel gdb
1个回答
0
投票

[最可能的解释是程序在包含任何系统头文件之前做了#define _FILE_OFFSET_BITS 64。这将导致对普通stat的调用重新映射为stat64openopen64等。如今,所有应用程序都应执行此操作。

但是,有理由直接使用stat64等。在逻辑上公共接口应该包含off_t或通过定义_FILE_OFFSET_BITS更改的任何其他类型的库中,您不能在接口头中使用该定义或任何这些类型,因为这样自己的ABI将取决于该宏的设置,该宏是由库用户而不是您控制的。相反,您必须定义_LARGEFILE64_SOURCE,并在接口头文件中使用显式大小的类型(off64_t等)和函数(stat64等)。原则上,未公开给外部宏定义的.c和.h文件仍可以使用_FILE_OFFSET_BITS和普通函数,但实际上,实施样式规则更容易,因为样式规则必须是库代码的[[all仅使用显式大小的类型和函数。

© www.soinside.com 2019 - 2024. All rights reserved.