[英]How to navigate glibc source?
我正在嘗試學習 glibc 源代碼,我發現導航非常強大。 我不是指代碼本身,而是簡單地找到它:它似乎是一個宏和包裝器的迷宮,因此僅找到我想要的實際代碼非常困難。
不僅是系統相關的東西,比如setjmp
,甚至是可移植的函數,比如fprintf
:在每種情況下,我都很難在 C 中找到真正的定義。很容易找到開始,但它通常是一個空殼包裝定義和宏。
這感覺就像現代版的 goto 語句,意大利面問題又來了。
如何導航 glibc 並找到 lib 函數的實際實現?
例如,嘗試在 glibc 中hidden_def
的定義。 這是一個帶你到hidden_def1
的宏,這是一個帶你到hidden_def2
的宏,這是一個帶你到hidden_asm
的宏,這是一個帶你到hidden_asm1
的宏,此時......
此外,這些宏中的每一個都定義在幾個不同的文件中,其他#define
控制實際調用哪個定義。
這並不罕見:它似乎貫穿整個源代碼。 怎么有人跟風? GNU 開發人員如何遵循它?
如何導航 glibc 並找到 lib 函數的實際實現?
在https://code.woboq.org/userspace/glibc或https://github.com/bminor/glibc的搜索欄中鍵入函數。 手動導航結果,直到找到定義。
如果要在本地索引項目,請使用 cscope、ctags、GLOBAL 標簽或 clangd 來索引項目,然后使用該工具特定的界面來搜索定義。
例如,嘗試在 glibc 中查找 hidden_def 的定義
在 google 中hidden_def glibc
。 我的第一個點擊是 woboq.org https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#550 。
我用火狐。 我輸入ctrl+f
並輸入hidden_def
。 輸入 Enter 直到我在https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#550找到# define hidden_def
。
然后選擇__hidden_ver1
並鍵入ctrl+c
ctrl+f
和ctrl+v
並搜索它。 在網絡瀏覽器中。 我輸入 enter 直到找到https://code.woboq.org/userspace/glibc/include/libc-symbols.h.html#540 。 __hidden_ver2
就在第 542 行的下方。
大多數情況下,您只需要一個瀏覽器、google、coboq.org 和 github.org。
這是一個帶你到 hidden_def1 的宏
沒有你提到的這樣的宏,至少在 woboq.org 托管的版本中是這樣。
怎么有人跟風?
雖然IDE是一個強大的幫助,但每個項目都是獨一無二的,需要不同的設置,這需要時間來弄清楚。 主要瀏覽源代碼是grep
(或更快的替代品,如ag
,對於像 glibc 這樣的大項目非常有用)並瀏覽結果列表。
不僅是系統相關的東西,比如 setjmp
開發人員是(應該是:) 理智的人 - 在大多數情況下,名為setjmp
的函數將位於名為setjmp.c
的文件中。 或setjmp.S
。 或者在與setjmp.h
相同的目錄中。 或者在名為stdlib
或setjmp
目錄中。
在 github 搜索欄中輸入setjmp
。 https://github.com/bminor/glibc/search?q=setjmp你看到每個架構powerpc
s390
等都有多個定義。但是文件都被命名為setjmp
。 回去。 在https://github.com/bminor/glibc上輸入“轉到文件”。 搜索名為x86/setjmp
的文件。 有 3 種實現,最標准的一種似乎是https://github.com/bminor/glibc/blob/master/sysdeps/x86_64/setjmp.S 。
甚至像 fprintf 這樣的便攜功能
如上所述,搜索名為 fprintf 的文件。 你很快就能找到https://github.com/bminor/glibc/blob/master/stdio-common/fprintf.c 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.