2012-02-08 5 views

答えて

3

gccの-fdump-tree-allを使用し、ダンプファイルで "inline"を検索します。

0

Unix/Linuxではnm commandを使用してシンボルのリストをバイナリで取得できます。
関数がインライン化されていない場合、そのシンボル名はバイナリに存在します。

+5

正しくありません。非静的関数は、インライン化されているかどうかにかかわらず出力されます。 – Mat

+0

@Mat、no。 * C++のためのインライン化モデルは、おそらく、もう少し複雑ですが、C(C99とC11)のシンボルは、インライン*定義を持つCのために、すなわち、要求にシンボルの「instantiantion」を持っている翻訳単位で放出されます外部宣言 –

+0

@Als、+1、しかし、あなたはもっと正確かもしれません。シンボル名は、未定義のシンボルとして、またはシンボルを定義するために使用できます。それはシンボルがインスタンス化モデルに多くを依存して定義するかどうかは、私は彼らが別のC++実装では全く異なるかもしれないと思う(Cについての私の知識++ここでは少し錆びている)とC. –

0

'inline'は関数の属性ではなく、関数はインライン化と非インライン化の両方が可能です。関数を呼び出すと、コンパイラはインラインであるかどうかを判断します。複数の呼び出しがある場合、コンパイラは異なる呼び出しに対して異なるオプションを選択できます。少なくとも1つの非インライン呼び出しがある場合、関数はシンボルテーブルに表示されます。エクスポートされている場合はシンボルテーブルにも表示されます。

機能がインライン化されているかどうかをチェックする方法がないため、リバースエンジニアが特定のコールをインライン化しているかどうかのみチェックできます。

+0

私はインラインで "通話"を理解し、私の質問は、すべての呼び出しがインライン化されていないかどうかを調べる方法です。 –

+1

あなたはちょっと質問に答えません。 –

5

-fdump-ipa-inlineをコンパイラオプションに追加します。

Grepファイルyoursourcefile.inlineオブジェクトファイルの隣に作成され、コンパイラがインライン展開とみなすすべての機能を見つけるためのインライン候補を検討しています。

Grepコンパイラが最終的にのすべての機能を見つけるために "Inlined into"のファイルをインラインでにしました。
コンパイラが候補を無効にした理由に興味がある場合は、 "inline_failed:"のgrepです(たとえば、 "コールは起こりにくく、コードサイズが大きくなる"など)。

関連する問題