[英]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
自动生成的。 这就是为什么您在源代码树中找不到它的原因。
请注意,实际的系统调用没有在源代码树中的任何地方定义——它们是在构建时从syscalls.list生成的(链接的是 sysdeps/unix 中的一个,还有更多的向下),一系列宏sysdep.h (链接 linux/i386)和一个实际生成源文件的脚本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.