【问题标题】:Where is the definition of the POSIX function "stat" on Linux?Linux 上 POSIX 函数“stat”的定义在哪里?
【发布时间】:2012-06-13 03:35:36
【问题描述】:

在 Windows 上,stat 和 Windows 提供的几乎所有其他 C/POSIX 函数都在 msvcrt.dll 中定义,这是 C 运行时库。

在 Linux 上,我知道很多 POSIX C 函数都是系统调用。我也知道在链接程序时,不能有未定义的引用。我在/lib/usr/lib 中搜索了所有so 文件中的符号stat 或“损坏/前缀”形式,但没有找到任何东西。这是我使用的命令:

objdump -T /lib/*.so* /usr/lib/*.so* | grep "stat"

它没有找到我正在寻找的stat

所以我的问题变成了:它在哪里,以及定义的任何其他“系统调用”?

【问题讨论】:

  • @krynr 我认为他想要的是调用内核的存根代码。我的猜测是.o 文件逃脱了.so 搜索,但我手边没有Linux。
  • @krynr 非常没有帮助。链接器需要链接一些包含定义或转发定义的库或可执行文件(在导入库的情况下)。
  • @rubenvb:你的意思是声明,那是不同的东西。一分钟。
  • @krynr 不,(非定义)声明是您在头文件中找到的。编译器不知道如何将它连接到内核。
  • @Potatoswatter:请看下面我的回答。

标签: c linux posix system-calls


【解决方案1】:

在我的 Linux 机器上,我可以在 /usr/lib/libc.a 中找到 stat(弱)符号和 __stat(非弱)

【讨论】:

  • 好吧,现在我觉得自己很笨。该列表比我想象的要长得多:/。所以我想没有办法在 Linux 上“转储”libc,就像在 Windows 上可以忽略 msvcrt.dll 一样?
  • 当然你可以从libc.a 中转储stat 代码,但正如@krynr 提到的,所有stat 真实代码都在内核中。在 libc 中,您基本上只会找到系统调用调用。
  • 更多谷歌搜索指向我使用syscall。这会是低级 Windows API 函数调用的正确模拟吗?
【解决方案2】:

首先stat是模棱两可的;有一个stat 系统调用,还有一个函数stat 可以从调用系统调用的用户空间调用。最后一个函数(至少在我的系统上)在/usr/include/sys/stat.h 中定义(没错,它在头文件中)。它实际上有几个定义(所有一个调用不同函数的衬里,例如__fxstat),根据编译器和系统以及诸如此类的东西选择其中一个。

无论如何,stat(和其他系统调用)只是调用内核的包装器(通常需要大量的编排)。这就是为什么我最初对你的意思感到困惑。我希望,尽管我的第一条评论没有帮助,但我可以提供帮助。

【讨论】:

  • 这个问题的由来是在Windows上我可以完全绕过stat这样的东西,因此libc/msvcrt直接调用kernel32。我想知道这样的事情是否可以在 Linux 上“轻松”/安全地实现。
  • @rubenvb:您可以使用syscall__SYSCALL。但这将取决于平台。
  • 我确实标记了这个问题 Linux,不是吗?还是您的意思是依赖于架构?
  • @rubenvb:可能是:处理器,Linux 版本,32 位或 64 位。平台依赖意味着您使用只有一个平台提供的功能,而平台意味着您编写的所有内容。
【解决方案3】:

您甚至可以在不使用libc 的情况下创建linux kernel system calls(但这可能是一种不好的做法)。 Linux Assembly Howto 解释了(在其第 5 章和第 6 章中)如何做到这一点(至少在 x86 Linux 32 位上)。

但我认为这是个坏主意。通过libc 是一种很好的做法,甚至可能更快(例如VDSO),并且更便携。

【讨论】:

  • 我知道这似乎不是问题的真正答案,但它是导致这个问题:) 的问题的答案。谢谢。
【解决方案4】:

您可以使用syscall(2) 调用它

#include <sys/syscall.h>
...
syscall(SYS_stat, path, buf);

另请参阅 Linux 系统调用参考:http://syscalls.kernelgrok.com/

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2023-01-19
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2019-08-06
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多