簡體   English   中英

如何導航 glibc 源代碼?

[英]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/glibchttps://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+fctrl+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相同的目錄中。 或者在名為stdlibsetjmp目錄中。

在 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.

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