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