14

関数ポインターを含む Linux カーネルのコール グラフの生成を検討しています (詳細については、以前の質問Linux カーネルの静的コール グラフの生成 を参照してください)。LLVM はこの目的に適しているはずだと言われましたが、llvm.org で関連情報を見つけることができませんでした。

関連ドキュメントへのポインタを含め、任意のヘルプをいただければ幸いです。

4

1 に答える 1

15

まず、カーネルを (ネイティブ オブジェクト ファイルではなく) LLVM IR にコンパイルする必要があります。次に、 を使用してllvm-ld、すべての IR オブジェクト ファイルを 1 つの大きなモジュールに結合します。Makefile を大幅に変更する必要があるため、非常に難しい作業になる可能性がありますが、実行可能であると私は信じています。

これで、分析を行うことができます。optツールと-dot-callgraphパスを使用して、単純なコール グラフを生成できます。関数ポインターを処理する可能性は低いため、変更することをお勧めします。

関数ポインターを運ぶ可能性のあるすべてのデータ フロー パスを追跡することは非常に困難であり、一般的には不可能です (整数キャストへのポインターがある場合、ポインターが複雑なデータ構造に格納されている場合など)。特定のケースの大部分では、グローバルな抽象解釈を実装して、ポインターの可能なすべてのデータ フロー パスを近似することができます。もちろん、それは正確ではありませんが、少なくとも控えめな概算が得られます。

于 2012-03-30T09:29:17.977 に答える