2014-01-17 73 views
0

我正在讀取內核的源文件並且有一些問題:編譯內核時編譯器使用哪個頭文件路徑?

1)編譯內核時編譯器使用哪個頭文件路徑? 在源文件樹中,我找到了一個名爲'include'的目錄。 但是,在'/ usr/include /'中,我也可以找到一些內核頭文件。 編譯器使用哪一個? 2)某些文件包含這樣的頭文件:'#include', 但我在源樹 和'/ usr/include /'下找不到任何名爲'asm'的目錄,但是,他們有名爲'asm_generic'的目錄。 當我使用命令'make headers_install'時,生成的文件包含'asm' 編譯內核的過程是否首先安裝頭文件? 並強制編譯器來處理它們?

p.s.我想將內核的源文件轉換爲調用者 - 被調用者圖來做一些研究。所以我需要一些靜態分析工具。我確實嘗試了'call-tree',但結果充滿了錯誤,您能否介紹一些更強大的工具?

+0

歡迎來到SO。請一次只提出一個問題,否則您完全破壞本網站的目標是成爲可搜索的知識庫。您可以輕鬆編輯您的問題,將其減少爲一個乾淨的單個問題,然後最終在單獨的線索中詢問其他人。 –

+0

使用源樹中的副本。/usr/include中的文件被提取出來,用於用戶模式程序的導出版本,該程序可以與內核進行鏈接。 asm /目錄是特定於平臺的,而內核源代碼是不可知的,所以構建過程將指向與正在構建的配置相對應的特定目錄。你可能會發現'find'和'grep -r'命令在你的探索中很有趣...... –

+0

Linux內核是「自我內容」,它不依賴於任何庫。這意味着內核源代碼中引用的所有頭文件也是內核的一部分。 –

回答

1

運行make與參數V=1,您將看到傳遞給gcc和其他程序的確切行。這將告訴你到底發生了什麼(從而回答你的兩個問題)。但是,回答(2),沒有make不安裝任何標題,它只是將-I參數的包含路徑設置爲gcc

+1

也有幫助的是[kbuild文檔](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kbuild),特別是[makefiles.txt](https: //git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kbuild/makefiles.txt)。一般來說,有三組。一般的Linux,* include/*,architechure,* arch/arm/include *和machine * arch/arm/mach-davinci *。這些包括依賴於'.config'文件。有些是** API **。 [稀疏工具](https://sparse.wiki.kernel.org/index.php/Main_Page)將是一個很好的開始,它會檢查** API **。 –