ホームページ  >  記事  >  バックエンド開発  >  LLVM を使用して C コードのコール グラフを生成するにはどうすればよいですか?

LLVM を使用して C コードのコール グラフを生成するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-16 10:59:03854ブラウズ

How to Generate a Call Graph for C   Code Using LLVM?

C コードのコール グラフの生成

特に手動での識別が現実的でない場合に、特定の関数の潜在的な実行パスを明らかにするには、次のようにします。コール グラフの生成に役立ちます。

を使用したコール グラフの作成LLVM:

LLVM (低レベル仮想マシン) を使用してコール グラフを構築するには、次の手順に従います。

  1. -emit を使用して C コードをコンパイルします。 LLVM を生成する -llvm オプションアセンブリ:

    clang++ -S -emit-llvm main.cpp -o -
  2. -analyze フラグを指定した opt ツールを使用してアセンブリを分析します:

    opt -analyze main.ll
  3. を表す DOT ファイルを生成します電話グラフ:

    opt -analyze -dot-callgraph main.ll
  4. Graphviz を使用して DOT ファイルを画像形式に変換します:

    dot -Tpng -o callgraph.png callgraph.dot

このプロセスにより、視覚的な表現が生成されますコールグラフの、ターゲットに至るすべてのパスを表示function.

例:

次の C コードを考えてみましょう:

static void D() { }
static void Y() { D(); }
static void X() { Y(); }
static void C() { D(); X(); }
static void B() { C(); }
static void S() { D(); }
static void P() { S(); }
static void O() { P(); }
static void N() { O(); }
static void M() { N(); }
static void G() { M(); }
static void A() { B(); G(); }

int main() {
  A();
}

上記の手順を使用すると、次のようなコール グラフを生成できます。 D() を呼び出すことができるすべての可能なパスを明らかにします。

追加考慮事項:

  • 多数の呼び出しパスを持つ複雑なコードベースの場合、人間が判読できる関数名を取得するために、c filt などのツールを使用して DOT ファイルを後処理する必要がある場合があります。
  • デフォルトでは、opt は外部関数の存在を前提とします。これはフィルターで除外したり、名前を変更したりできます。明確さ。
  • 呼び出し階層を正確に取得するために、ターゲット関数がインライン化されていないことを確認してください。

以上がLLVM を使用して C コードのコール グラフを生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。