1

obj ファイル内のバイナリ命令のレジスタがどの変数からコンパイルされているかを知る必要があります。
要するに、各命令のレジスタから変数へのマッピング

例: objdump が obj ファイルのスニペットを次のように与えるとします。

MOV R1 5        # move 5 to register R1
SW R2 SP[-20]   # store the value of R2 to address SP-20

R1 が変数、たとえばvar1をソース コードから格納していることをどのように知ることができるでしょうか? R2 はvar2を格納しますか?

残念ながらreadelfのドキュメントを検索しましたが、無駄でした。
(ソースとバイナリの間の行マッピングを提供することはできますが、それ以上は役に立ちません)

次に、gcc とリンカのデバッグ オプションをいくつか探しました。いくつかの有用な情報が見つかりましたが、それでも私の問題は解決しません。
私が見つけた情報は次のとおりです。

  • オプション-fdump-rtl-vartrackはすべての変数を追跡でき、便利なようです。しかし、このオプションを使用してコンパイルすると、予想される *.vartrack ダンプ ファイルが見つかりませんでした。
  • オプション*fdump-rtl-vartrack-uidは、各変数の一意の ID (DECL_UID) を示します。しかし、使用中に次のエラーを受け取りました: cc1: エラー: 認識されないコマンド ライン オプション "-fdump-tree-uid"
  • オプションfdump-rtl-lregはローカル レジスタの割り当てをダンプしますが、reg から変数へのマッピングをどのように教えてくれるのかわかりません。

誰かが経験やアイデアを持っていますか?

皆さん、ありがとうございました!

ハッキング...

4

3 に答える 3

0

GCC の「-fverbose-asm」オプションが少し役立つかもしれません。コンパイラの出力に変数名で注釈を付けます。残念ながら、名前は多くの場合、「D.1234」など、コンパイラによって作成された一時的なものです。何が起こっているのかを理解するのに役立ちます。

簡単なものをコンパイルしてみてください。

gcc -g -O0 -S -fverbose-asm foo.c -o foo.s

GDB のようなデバッガーが、プログラム内の特定の時点で変数が格納されている場所を把握する方法は、(ほとんどのシステムで) コンパイラーによって生成され、オブジェクト ファイルに格納されている DWARF デバッグ情報を使用することです。システムが DWARF を使用している場合、readelfはこの情報の非常に基本的な解釈を行います。これを試して:

readelf --debug-dump=info foo.o

デコードするのは明らかに簡単ではありません。試してみたい場合は、http://dwarfstd.org/ で DWARF 標準を確認してください

于 2011-02-23T13:56:24.197 に答える
0

コンパイラーがアセンブラーとソースコードの混合リストを生成することはよくあることです。コンパイルされたソース コードが表示され、その下に生成されたアセンブラー コードが表示されます。簡単なGoogleが与える

http://www.delorie.com/djgpp/v2faq/faq8_20.html

于 2011-02-02T23:54:13.123 に答える
0

この目的のために、フラグを使用できます。

gcc foo.c -da -dp -fdump-tree-all-raw-lineno

どこ:

-daすべての RTL ダンプを生成します

-dpどのパターンと代替が使用されているかを示すコメントでアセンブラ出力に注釈を付けます。

-fdump-tree-all-raw-linenoステートメントの行番号を表示できるようにします。

これにより、約 167 個のファイルが作成されます。それぞれのファイルは、GIMPLE および RTL パス、最適化などのさまざまな段階を意味します。簡単な説明は次のとおりです。

https://www.cse.iitb.ac.in/~uday/courses/cs715-09/gcc-rtl.pdf

最も有用なダンプは次のとおりです。

foo.c.227t.optimized
foo.c.229r.expand
foo.c.259r.combine
foo.c.307r.finish

そして、さまざまな目的のために他のいくつか。

于 2019-07-04T07:28:52.257 に答える