系统调用位于glibc源中的哪个位置

时间:2011-06-29 03:54:37

标签: c linux glibc

所以我正在查看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> 

4 个答案:

答案 0 :(得分:15)

您发现的是未实现的系统的存根功能。您需要在sysdeps树下查看实际实现。以下可能是有意义的:

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

答案 1 :(得分:8)

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

答案 2 :(得分:7)

如果不存在另一个定义,则使用通用存根; weak_alias是一个cpp宏,它告诉链接器在请求__chdir时应该使用chdir,但前提是没有找到其他定义。 (有关详细信息,请参阅weak symbols。)

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

答案 3 :(得分:5)

请注意,实际系统调用未在源树中定义 where - 它们是在构建时从syscalls.list生成的(链接是sysdeps / unix中的那个,那里是进一步下来的),sysdep.h(链接的linux / i386)中的一系列宏,以及实际生成源文件的a script