所以我正在浏览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)和一个实际生成源文件的脚本 。