簡體   English   中英

glibc 源代碼中的系統調用在哪里

[英]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自動生成的。 這就是為什么您在源代碼樹中找不到它的原因。

這是一個通用存根,如果不存在另一個定義,則使用該存根; weak_alias是一個cpp宏,它告訴__chdir在請求chdir時應該使用 __chdir,但前提是沒有找到其他定義。 (有關詳細信息,請參閱符號。)

chdir實際上是一個系統調用; gibc源代碼樹中將存在每個操作系統的系統調用綁定,這將使用調用 kernel 的真實定義覆蓋存根定義。 這允許glibc提供跨系統的穩定接口,這些系統可能沒有glibc知道的所有系統調用。

請注意,實際的系統調用沒有在源代碼樹中的任何地方定義——它們是在構建時從syscalls.list生成的(鏈接的是 sysdeps/unix 中的一個,還有更多的向下),一系列宏sysdep.h (鏈接 linux/i386)和一個實際生成源文件的腳本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM