2015-11-26 66 views
2

我試圖導航並理解whoami(和其他coreutils)一直到最底層的源代碼,就像練習一樣。如何將coreutils跟蹤到系統調用?

我至今潛水:

  1. 哪裏是實際的二進制?

    which whoami
    /usr/bin/whoami

  2. 它在哪裏維護?

    http://www.gnu.org/software/coreutils/coreutils.html

  3. 如何獲得源?

git clone git://git.sv.gnu.org/coreutils

  • 在哪裏存儲庫中whoami源代碼?
  • # find . | grep whoami

    ./man/whoami.x 
    ./man/whoami.1 
    ./src/whoami.c 
    ./src/whoami 
    ./src/whoami.o 
    ./src/.deps/src_libsinglebin_whoami_a-whoami.Po 
    ./src/.deps/whoami.Po 
    

    相關行(84):

    uid = geteuid(); 
    

    這大約是在我的兔子孔停止。在gnulib/lib/euidaccess.c中提到geteuid(),但未明確定義AFAICT。它在/usr/local/unistd.h中也被引用爲extern,但是沒有涉及抓取我可以看到的uid的繁重工作。

    我在這裏通過grep geteuid在已知的系統頭文件中包含,因爲我在回溯其定義時遇到了問題。

    問題:如何進一步深入探索geteuid()的源代碼?什麼是快速探索這個代碼庫而不用四處搜索的最有效方式?

    我在Ubuntu服務器15.04上使用Vim和一些ctags(這對導航現有系統頭文件沒有太大幫助)。我是一個可怕的開發者,這是我的學習方法,儘管我無法解決這個障礙。

    +1

    'geteuid()'在'libc'中,Unix標準庫。 – Barmar

    回答

    0

    通常您應該閱讀geteuid的文檔。您可以從開放組讀取GNU documentation,specification或查閱手冊頁。

    如果不幫助你可以安裝在C語言庫的調試符號(這就是所謂的libc6-dbg或類似的東西),下載並libc6的源代碼),那麼你所指出的路徑源文件時,你一步進入圖書館。

    在這種情況下,我認爲這不會讓你更進一步,geteuid可能發生的是它只是發出實際的系統調用,然後進入內核空間。您不能像調試普通程序一樣調試該(內核)代碼。

    因此,在您的情況下,您應該仔細閱讀文檔並仔細閱讀,並試圖找出爲什麼geteuid不會返回您所期望的。可能這會導致你改變你對geteuid應該返回的期望以匹配實際返回的內容。

    +0

    我想我試圖從一個更「硬的方法」,法醫的方法來解決這個問題,看看geteuid的內部被定義爲一個C函數,它觸發系統調用。我一直無法找到代碼的位置。它似乎沒有像在原始評論中提到的那樣在unistd.h或sys/types.h中定義。我會研究安裝調試符號,看看有多遠,讓我。 – mag00