簡體   English   中英

如何從/ usr / include中的Linux標頭獲取函數名稱

[英]How to get functions names from Linux headers located in /usr/include

我們在/usr/include擁有大部分的Gnu C庫頭
我正在尋找一種打開和讀取包含文件並解析它以打印位於其中的所有聲明的函數的方法。
並且任何人都可以解釋或提供有關此標頭格式的鏈接。
之所以這樣做,是因為我試圖做一個C Auto完成插件,如果我包含file.h,該插件將為我提供所有位於file.h中的功能。

最終,每個人​​在自己的職業生涯中至少需要一次這樣的工具。 可以掃描C源代碼並打印出函數/變量名列表或各個模塊之間的函數調用的交叉引用的東西。

為了充分滿足您的要求,您將必須編寫基本上是C編譯器前端的內容。 正則表達式魔術不會給您想要的東西。 抓住一個yacc C語言語法的能力版本和womp了使用的解析器lexyacc (或flexbison ,或您所選擇的工具)。 但是,當您匹配函數聲明時,無需生成機器指令,而只需將其打印出來(或將其保存到數據庫等)。

通過現有的C預處理器(例如gcc -E )運行感興趣的標頭,以刪除注釋並進行任何宏擴展,然后將結果文件輸入解析器。

編輯

現在,我實際上已經閱讀了gcc手冊頁,這里有一個-aux-info選項,它將編寫翻譯單元中聲明/定義的所有函數的原型聲明,包括在包含的頭文件中聲明的函數。 更好的是,輸出的格式和規則性都很好,並且應該易於解析。

因此,我們吸取了教訓: 檢查您的編譯器文檔,而忽略仍然像80年代老式工具這樣思考的老屁。

Doxygen可以做到這一點。 通常,它在C源代碼上運行,而C源代碼已經為其添加了注釋,但是它也可以從代碼中生成文檔而沒有任何標記,並且您可以使用自己選擇的工具來解析其XML輸出(或其他格式)。 與編寫C解析器相比,更容易獲取XML解析器並將其集成到您的應用程序中。

順便說一句,對於您的C自動完成插件來說,建議恰好在實現中的頭文件中但未由(a)C標准中的任何一項指定的事情可能並不明智。 )POSIX標准,(c)GNU擴展文檔。 我個人將標准標頭視為自動完成的特殊情況。 它們具有定義明確的接口,其中列出了您應該在其中擁有的所有功能,但是它們也可能包含私有實現垃圾。

不過,該私人垃圾將具有保留名稱,因此您可以繼續進行,但要排除保留名稱。

Glibc的標頭非常復雜,具有很多間接性,因此我想對於像您要執行的操作而言,它們是最壞的情況。

就是說, cscope為我提供了使用string.h進行簡單測試的合理輸出:

$ cscope -bcq /usr/include/string.h
$ cscope -d -L1strcat
/usr/include/string.h strcat 92 extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
/usr/include/bits/string.h strcat 963 #define strcat(dest, src) \
/usr/include/bits/string3.h strcat 164 #define strcat(dest, src) \

第一個cscope調用用於生成cscope數據庫,第二個是命令行cscope搜索全局標識符(是的,1是不直觀的)。

如果您想要特定的標准庫模塊,請使用它們。 例如:

http://www.cplusplus.com/reference/clibrary/cstring/

那是谷歌搜索“ string.h”的第一個結果。 它具有cstring中提供的所有功能的詳細信息。

如果要跟蹤/ usr / include的所有子目錄中所有標頭中的所有函數,我可以為您提供一個簡短的bash腳本來執行此操作,但是我並不明白這一點。

干杯!

編輯:或如Zack上面所述,有標准庫手冊 好的鏈接,扎克!

手冊頁的第0p節包含POSIX標頭的手冊頁,以及每個手冊頁中定義的(或應該定義的)。

編寫一個LEXer和YACCer,以檢查開發人員的源並將其與開發人員$ INCLUDE_PATH中的源代碼進行匹配。

包含路徑中的文件具有與普通頭文件相同的格式。 關鍵字是相同的; 但是您可能會遇到“ extern”之類的詞,這對於初學者來說可能並不平凡。 建議您全面了解關鍵字,並在頭文件的不同位置了解其功能。

ps:對於更復雜的解決方案,您將不得不考慮條件宏。

干杯。

如何使用實際的編譯器進行解析? 我認為這是一個非常有希望的發展:

http://codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/

哦,另一種可能性是查看目標文件中的調試信息。

暫無
暫無

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

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