本節書摘來自華章出版社《深入分析gcc 》一書中的第2章,第2.4節,作者 王亞剛 ,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
為了更好地分析gcc的運作過程,可以使用gcc支援的一些編譯選項,例如,-fdump-tree-all、-fudmp-ipa-all、-fdump-rtl-all等,這樣編譯過程中将産生大量的中間運作結果資訊,幫助使用者了解gcc的處理細節。另外,使用者也可以根據需要在源代碼中增加适當的調試代碼,進而輸出一些運作時的中間資訊。對這些輸出結果進行高效分析,從中提取有價值的資訊是gcc分析過程中非常關鍵的一種途徑。
筆者認為,借助于linux shell指令的強大字元串處理功能,可以極大地提高資訊處理的效率。例如,可以使用grep對輸出中的特定模式進行比對,利用sed對輸出的資訊進行各種強大的編輯處理,包括替換、修改等,利用awk可以對輸出結果進行進一步的處理。建議讀者熟練使用grep、sed、awk等工具,并能熟練編寫一些簡單的處理腳本。
例如,對于如下的源代碼test.c:
通過在gcc中增加調試代碼,可以生成main函數的控制流圖檔案control_f?low.dot。
顯然,該控制流圖是不直覺、不容易了解的,然而通過将control_f?low.dot中描述的邏輯關系轉換成graphviz的圖形腳本,就可以利用graphviz中dot工具生成其圖示結果control_f?low.png,
如圖2-4所示。
<code>dot -tpng -o control_flow.png control_flow.dot</code>
可以看出,使用圖形表示可以非常直覺地展示程式中的控制流程,也為代碼分析提供了最直覺形象的輔助。
再舉一例。在分析gcc的ast生成及gimple生成等過程中,需要了解ast節點的具體内容及其互相關系,此時,也可以通過對gcc生成的ast中間結果進行腳本的處理,并生成其圖示結果,例如圖2-5給出了上述源代碼中sum=a+b語句對應的關鍵ast節點及其互相關系,該結果形象直覺,節點之間的關系清晰,對于分析ast的生成和gimple轉換等都具有非常重要的意義。
圖2-5 sum=a+b對應的ast片段圖示