私は、関数ポインタを含むlinuxカーネル用のコールグラフを生成しています(詳細は前の質問Static call graph generation for the Linux kernelを参照してください)。私はLLVMは、この目的のために適したものでなければならないと言われてきた、しかし私はllvm.orgLLVMを使用してコールグラフを生成する方法は?
関連文書へのポインタを含むすべてのヘルプ、上の関連する情報を見つけることができませんでした、高く評価されるだろう。
私は、関数ポインタを含むlinuxカーネル用のコールグラフを生成しています(詳細は前の質問Static call graph generation for the Linux kernelを参照してください)。私はLLVMは、この目的のために適したものでなければならないと言われてきた、しかし私はllvm.orgLLVMを使用してコールグラフを生成する方法は?
関連文書へのポインタを含むすべてのヘルプ、上の関連する情報を見つけることができませんでした、高く評価されるだろう。
まず、あなたが(代わりにネイティブオブジェクトファイルの)LLVM IRにあなたのカーネルをコンパイルする必要があります。その後、llvm-ld
を使用して、すべてのIRオブジェクトファイルを1つの大きなモジュールに結合します。それはかなり難しいことかもしれません、あなたはmakefileを大きく変更する必要がありますが、私はそれが実行可能であると信じています。
これで分析を行うことができます。 ツールを使用して-dot-callgraph
のパスを使用して簡単なコールグラフを生成できます。関数ポインタを扱うことはまずありませんので、それを変更したいかもしれません。
あなたの関数ポインタを運ぶ可能性のあるすべてのデータフローパスを追跡することは非常に困難です。一般的には不可能です(整数型キャストへのポインタがあれば、等。)。特定のケースの大部分については、ポインターのすべての可能なデータフローパスを概算するために、グローバル抽象解釈を実装しようとすることができます。もちろん、それは正確ではありませんが、少なくとも控えめな近似は得られます。
あなたは本当に800万行のコードに対してドットコールグラフを作成したくありません。それはドットがそれを描くことができれば、それはできないテニスコートをカバーするだろう。これ以外にも、これは、OPによる他の質問ノートへの答えの素晴らしいエコーです: - 関数ポインタがどんなに楽しいかを特に重視しています。 –
@IraBaxter、確かに、あなたは「hello、world!」よりも大きなものについてはドットコールグラフを表示したくないです。しかし、あなたはそれ以上の分析のためにその.dotファイルを使いたいかもしれません。私は通常、.dotファイルを解析し、データベースに格納します。 –
「opt」ツールを指摘してくれてありがとう。 はい、Ira、私はコールグラフのグラフィカルな表現を生成していません。それを任意の解析可能なフォーマットにすることは、ドットフォーマットが適格であるOKです。 関数ポインタに関しては、LLVMが関数ポインタのポイントツー分析を行うことができるはずだと言われています。私は自分自身を明確に実装することを検討していません。 – addalbx