【问题标题】:Where are syscalls located in glibc sourceglibc 源代码中的系统调用在哪里
【发布时间】:2011-09-24 19:51:21
【问题描述】:

所以我浏览了 linux glibc 源代码,但看不到它实际上在哪里做任何事情。以下来自io/chdir.c,但它表示许多源文件。这里发生了什么?显然我错过了一些东西。有什么秘密,它在哪里进行系统调用或实际做某事?

stub_warning 是一些遗留的疯狂。 __set_errno 似乎是一个设置errno 的简单宏。虽然我发现 weak_alias 的用法有一百万次,但我没有看到它在任何地方定义。

是否有帮助您了解 glibc 如何在某处工作的指南?

#include <errno.h>
#include <stddef.h>
#include <unistd.h>

/* Change the current directory to PATH.  */
int
__chdir (path)
     const char *path;
{
  if (path == NULL)
    {
      __set_errno (EINVAL);
      return -1;
    }

  __set_errno (ENOSYS);
  return -1;
}
stub_warning (chdir)

weak_alias (__chdir, chdir)
#include <stub-tag.h> 

【问题讨论】:

  • 哎哟。这个洋葱的层次比我预期的要多得多。谢谢大家。敬请关注。未来几周可能会出现更多欢闹。

标签: c linux glibc


【解决方案1】:

您发现的是未在其上实现的系统的存根函数。您需要查看sysdeps 树下的实际实现。以下内容可能感兴趣:

  • sysdeps/unix/sysv/linux
  • sysdeps/posix
  • sysdeps/i386(或 x86_64 或任何你的 cpu 架构)

【讨论】:

  • 感谢您接受我的回答,但也请务必查看其他人,特别是如果您对 glibc 如何构建系统调用包装器感兴趣。我的回答不太针对您的具体问题(关于chdir),但如果您想知道在哪里/如何实现更复杂(不仅仅是系统调用包装器)的系统特定功能,可能会更有用。
【解决方案2】:

这是一个通用存根,如果不存在另一个定义则使用它; weak_alias 是一个cpp 宏,它告诉链接器在请求chdir 时应该使用__chdir,但前提是没有找到其他定义。 (详情请见weaksymbols。)

chdir实际上是一个系统调用;在gibc 源代码树中将有每个操作系统的系统调用绑定,它将用调用内核的真实定义覆盖存根定义。这允许glibc 提供跨系统的稳定接口,这些系统可能没有glibc 知道的所有系统调用。

【讨论】:

    【解决方案3】:

    chdir() 的实际系统调用代码在大多数受glibc 支持的系统上由脚本make-syscalls.sh 自动生成。这就是为什么您在源代码树中找不到它的原因。

    【讨论】:

      【解决方案4】:

      请注意,实际的系统调用并没有在源代码树中定义任何地方 - 它们是在构建时从 syscalls.list 生成的(链接的是 sysdeps/unix 中的那个,还有其他更远的),sysdep.h(链接 linux/i386)和a script 中的一系列宏,它们实际生成源文件。

      【讨论】:

      • 在没有源的情况下,在实时系统上,我怎样才能看到调用的 os api?是否可以 strace 应用程序,但只能在 glibc 中执行代码?
      猜你喜欢
      • 2012-04-26
      • 2011-09-15
      • 1970-01-01
      • 2017-12-25
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      相关资源
      最近更新 更多