系统调用位于glibc源文件中

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

stub_warning是一些遗留的疯狂。 __set_errno似乎是一个设置errno的简单macros。 虽然我发现了weak_alias的百万用法, 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> 

你找到的是一个存在于未实现的系统的存根功能。 您需要查看实际实现的sysdeps树。 以下内容可能有用:

  • sysdeps/unix/sysv/linux
  • sysdeps/posix
  • sysdeps/i386 (或者x86_64或者你的cpu arch是什么)

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

这是一个通用的存根,如果另一个定义不存在, weak_alias是一个cpp宏,它告诉链接器当chdir被请求时应该使用__chdir ,但是只有当没有其他定义被发现的时候。 (有关更多详细信息,请参阅弱 符号 。)

chdir实际上是一个系统调用; 在gibc源代码树中将会有per-OS系统调用绑定,它将用一个调用内核的真实代码覆盖存根定义。 这允许glibc在系统中呈现稳定的接口,这可能不具有glibc知道的所有系统调用。

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