首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >syscalls位于glibc source中的什么位置

syscalls位于glibc source中的什么位置
EN

Stack Overflow用户
提问于 2011-06-29 11:54:37
回答 2查看 4.9K关注 0票数 25

因此,我查看了linux glibc源代码,但我看不出它实际上在哪里做任何事情。下面是来自io/chdir.c的代码,但它代表了许多源文件。这里发生了什么事?显然,我遗漏了一些东西。它的秘密是什么,它在哪里进行系统调用或实际做一些事情?

stub_warning是一些遗留的疯狂的东西。__set_errno似乎是一个设置errno的简单宏。虽然我找到了一百万个weak_alias的用法,但我没有看到任何地方对它进行定义。

有没有一个有用的指南来帮助我们理解glibc是如何工作的呢?

代码语言:javascript
复制
#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> 
EN

回答 2

Stack Overflow用户

发布于 2011-06-29 12:06:28

glibc支持的大多数系统上,chdir()的实际系统调用代码都是由script make-syscalls.sh自动生成的。这就是你在源码树中找不到它的原因。

票数 11
EN

Stack Overflow用户

发布于 2011-06-29 12:01:05

这是一个通用存根,在不存在另一个定义时使用;weak_alias是一个cpp宏,它告诉链接器当请求__chdir时应该使用chdir,但仅当没有找到其他定义时才使用。(有关详细信息,请参阅weak symbols。)

chdir实际上是一个系统调用;在gibc源代码树中将有每个操作系统的系统调用绑定,这将用调用内核的真实存根定义覆盖存根定义。这使得glibc可以跨系统呈现一个稳定的接口,而这些系统可能没有glibc所知道的所有系统调用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6515583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档