2012-03-30 79 views

回答

12

首先,您必須將內核編譯爲LLVM IR(而不是本機對象文件)。然後,使用llvm-ld,將所有IR對象文件合併爲一個大型模塊。這可能是一件相當棘手的事情,你必須大量修改makefile,但我相信這是可行的。

現在你可以做你的分析。使用帶-dot-callgraph合格的opt工具可以生成簡單的調用圖。它不太可能處理函數指針,所以你可能想修改它。如果指針指向整數類型轉換,如果指針存儲在複雜的數據結構中,則可能會發生這種情況,等等。)。對於大多數特定情況,您可以嘗試實現全局抽象解釋來近似指針的所有可能數據流路徑。當然這並不準確,但你至少會得到一個保守的近似值。

+2

您真的不想爲800萬行代碼生成點調用圖。如果網點能夠吸引網球,它會覆蓋網球,但它不能。除此之外,這是OP回答其他問題的重要回聲: - }特別強調函數指針是多麼有趣。 – 2012-03-30 09:41:04

+0

@IraBaxter,當然你不想爲任何大於「你好,世界!」的東西顯示一個點號。但是您可能想要使用該.dot文件進行進一步分析。我通常解析.dot文件並將它們存儲到數據庫中。 – 2012-03-30 09:49:21

+0

感謝您指出'opt'工具。 是的,Ira,我沒有考慮生成調用圖的圖形表示。將它用於任何可分析的格式即可,點格式符合要求。 關於函數指針,我被告知LLVM應該能夠做一些指向函數指針的分析。顯然,我並不是在考慮自己實現這一點。 – addalbx 2012-03-30 09:54:20