因此,我查看了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> 发布于 2011-06-29 12:06:28
在glibc支持的大多数系统上,chdir()的实际系统调用代码都是由script make-syscalls.sh自动生成的。这就是你在源码树中找不到它的原因。
发布于 2011-06-29 12:01:05
这是一个通用存根,在不存在另一个定义时使用;weak_alias是一个cpp宏,它告诉链接器当请求__chdir时应该使用chdir,但仅当没有找到其他定义时才使用。(有关详细信息,请参阅weak symbols。)
chdir实际上是一个系统调用;在gibc源代码树中将有每个操作系统的系统调用绑定,这将用调用内核的真实存根定义覆盖存根定义。这使得glibc可以跨系统呈现一个稳定的接口,而这些系统可能没有glibc所知道的所有系统调用。
发布于 2011-06-29 12:11:29
注意,实际的系统调用并不是在源代码树中的任何地方定义的--它们是在构建时从syscalls.list (linked是sysdeps/unix中的那个,下面还有一些)、sysdep.h (linux linux/i386)中的一系列宏以及实际生成源文件的a script中生成的。
https://stackoverflow.com/questions/6515583
复制相似问题