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

Val*_*ron 21 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> 
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 16

你发现的是它没有实现的系统的存根函数.您需要在sysdeps树下查看实际实现.以下可能是有意义的:

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


caf*_*caf 8

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


gee*_*aur 7

这是一个通用存根,如果不存在另一个定义则使用它; weak_alias是一个cpp宏,它告诉链接器__chdirchdir请求时应该使用,但是只有在没有找到其他定义的情况下才会使用.(有关详细信息,请参阅 符号.)

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


Ran*_*832 5

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