所以我正在浏览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/linuxsysdeps/posixsysdeps/i386(或者x86_64你的cpu arch是什么)请注意,实际的系统调用没有在源代码树的任何地方定义- 它们是在构建时从syscalls.list生成的(链接是sysdeps/unix中的那个,还有其他的进一步向下),一系列的宏sysdep.h(链接linux/i386),以及实际生成源文件的脚本.