2011-06-29 31 views
20

所以我正在瀏覽linux glibc源文件,我沒有看到它實際上在什麼地方執行任何操作。以下內容來自io/chdir.c,但它代表了許多源文件。這裏發生了什麼?顯然我錯過了一些東西。什麼是祕密,它在哪裏進行系統調用或實際做什麼?系統調用位於glibc源文件中的位置

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> 
+0

Ouch。這個洋蔥比我預料的多得多。謝謝大家。敬請關注。未來幾周可能會出現更多的鬧劇。 – ValenceElectron

回答

14

你發現的是一個存在於未實現的系統的存根函數。您需要查看sysdeps樹下的實際實現。以下可能會感興趣:

  • sysdeps/unix/sysv/linux
  • sysdeps/posix
  • sysdeps/i386(或x86_64或任何你的cpu弓)
+0

感謝您接受我的回答,但請務必查看其他人,特別是如果您對glibc如何構建系統調用包裝感興趣。我的回答沒有針對你的具體問題(關於'chdir'),但如果你想知道在哪裏/如何實現更復雜的(不只是系統調用包裝)系統特定的功能,可能會更有用。 –

7

就是這樣被使用,如果另一種定義沒有按」通用存根不存在; weak_alias是一個cpp宏,它告訴鏈接器當請求chdir時應該使用__chdir,但只有在找不到其他定義時才使用。 (有關更多詳細信息,請參見weaksymbols)。

chdir實際上是一個系統調用;在gibc源代碼樹中將會有per-OS系統調用綁定,它將使用調用內核的實際代碼覆蓋存根定義。這允許glibc在可能不具有所有系統調用的系統之間呈現穩定的接口,其中glibc知道。

8

chdir()的實際系統調用代碼在glibc支持的大多數系統上由腳本make-syscalls.sh自動生成。這就是爲什麼你無法在源代碼樹中找到它。

5

注意實際的系統調用沒有在源代碼樹中定義任何地方 - 他們在編譯的時候產生的,從syscalls.list(鏈接是一個在sysdeps/UNIX,還有額外的人進一步下降),一sysdep.h(鏈接的linux/i386)和a script中的一系列宏,它們實際上會生成源文件。

+0

沒有來源,在一個現場系統,我怎麼能看到os api調用?是否可以對應用程序進行壓縮,但只能將代碼執行到glibc中? – Massimo

相關問題