繁体   English   中英

glibc 源代码中的系统调用在哪里

[英]Where are syscalls located in glibc source

因此,我正在查看 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> 

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

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

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

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

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

请注意,实际的系统调用没有在源代码树中的任何地方定义——它们是在构建时从syscalls.list生成的(链接的是 sysdeps/unix 中的一个,还有更多的向下),一系列宏sysdep.h (链接 linux/i386)和一个实际生成源文件的脚本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM