3

私は現在のプロジェクトでこの問題に遭遇しました。これには、バイナリレベルでのコードについての推論が必要です。

CALL命令のオペランドを見れば、プログラム内のすべての関数の開始位置を特定できると思います。このリストを取得したら、開始アドレスが見つかるまで逆方向に検索するだけで、どの関数がアドレスを囲んでいるかを判別できますか?IEは、命令を囲む関数の開始アドレスであり、命令アドレスよりも小さい最大の関数アドレスですか?

上記の方法が正しくない場合、命令を囲む関数の開始アドレスを見つける別の方法はありますか?

編集:質問の説明を追加しました。

edit2:私の方法はおそらく間違っています。コンパイラは、関数本体をマシンコードの連続した領域に配置することは保証されていません。

4

2 に答える 2

3

問題のスペースをさらに制限する必要があります。「コンパイルされた言語の出力」だけに制限されている場合でも、最近のコンパイラは関数間の境界をぼかすのが得意です。インライン化とは、ある関数を別の関数で囲むことができることを意味します。末尾呼び出しの最適化は、CALL命令なしで2つの関数間で制御を転送します。プロファイルに基づく最適化により、不連続な関数を作成できます。コードフロー分析とnoreturnヒントにより、コードがデータにフォールスルーする可能性があります。CALLジャンプテーブルは、データがターゲットなしでコードにフォールスルーする可能性があることを意味します。唯一の信頼できる方法は、たとえばデバッグ情報を介して、コンパイラに命令から関数へのマッピングを明示的に通知させることです。使用しているプラ​​ットフォームを言わなかったので、より具体的な情報を提供するのは難しいです。

于 2012-05-29T12:58:37.550 に答える
0

いいえ、アセンブリコードはあらゆる種類のファンキーなことを実行できます。1つの呼び出しが、別の関数を完全に飛び越えたり、逆方向にジャンプしたり、別のモジュールにジャンプしたりする場合があります。

于 2012-05-29T02:24:27.383 に答える