[英]Where are syscalls located in glibc source
因此,我正在查看 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>
您發現的是未在其上實現的系統的存根 function。 您需要查看sysdeps
樹下的實際實現。 以下內容可能令人感興趣:
sysdeps/unix/sysv/linux
sysdeps/posix
sysdeps/i386
(或x86_64
或任何你的 cpu 架構) chdir()
的實際系統調用代碼是在glibc
支持的大多數系統上由腳本make-syscalls.sh
自動生成的。 這就是為什么您在源代碼樹中找不到它的原因。
請注意,實際的系統調用沒有在源代碼樹中的任何地方定義——它們是在構建時從syscalls.list生成的(鏈接的是 sysdeps/unix 中的一個,還有更多的向下),一系列宏sysdep.h (鏈接 linux/i386)和一個實際生成源文件的腳本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.