2

コードのすべての行のアドレスを確認したい。私は知りたいです:

  • 変数が作成されるとき、どのアドレスに?
  • 関数が作成されるとき、どのアドレスに?
  • 関数が戻るときのアドレスは?

私はここで何をしようとしていますか?dumpbin を使用して情報を取得します。

私は何を期待していますか?

fun main add:0x0000
var int i add:0x2496
var int j add:0x249A

適切な説明とともに適切なヘルプをいただければ幸いです。

4

2 に答える 2

5

あなたの質問は非常に漠然としています。これに影響を与える可能性のあるコンパイラ、プロセッサ、またはオペレーティング システムについて言及していません。

また、本質的にグローバルなもの (static変数や関数など) のみが絶対アドレスを持つことが期待できることに注意してください。

通常、自動変数 (「通常の」変数) はスタック上に作成されるため、変数がスコープ内に入る前に知ることができる絶対アドレスはありません。

コードの行には確かにアドレスがありません。特に、すべてが連続している必要はありません。たとえば、典型的な Cforループ ヘッダーは、ソース レベルの 1 行のコードです。

for(int i = 0; i < n; ++i)

ただし、展開されたアセンブリを生成できます。その一部はループの本体の後にあり、一部はループの前にあります。

また、ソースコードの特定の行が特定の量のマシンコードを生成するという保証はありません.コンパイラによる最適化のために一部が消える可能性があります.もちろん、データ宣言の場合、保証はさらに少なくなります.

于 2013-05-21T10:12:42.100 に答える
2

要求する情報は、コンパイラによって生成されるオブジェクト コードの通常の部分ではなく、通常、オブジェクト コードまたは通常のシンボル テーブルの検査によって完全に取得することはできません。オブジェクトコードの目的は単にプログラムを実行できるようにすることであるため、この情報のほとんどはオブジェクトコードに保持されません。オブジェクト コードの起源に関する情報 (それを作成したソース行やソースで使用されている名前など) は、実行には必要ありません。

-g要求した情報の多くは、 GCC への切り替えで行われるように、要求時にコンパイラによって生成されるデバッグ情報で提供されます。このデバッグ情報は、コンパイラに応じてさまざまな形式で作成されます。この情報を自分で調べたり、さまざまなツールを使って調べたりすることは確かに可能ですが、その方法は、使用しているコンパイラやその他のツールによって異なります。役に立つようにするには、デバッグ情報の形式について十分に検討する必要があります。

デバッグ情報の多くは、 などのデバッガーを使用して調べることができますgdb。デバッガーは通常、ソース コードの特定の行に関連付けられている命令を調べたり、オブジェクトに割り当てられたメモリを見つけたりするためのツールを提供します。

ただし、ソース コードから実行中のプログラム内の命令またはデータへのマップは、非常に複雑になる可能性があります。オプティマイザが不要であると判断したため、ソース コードの一部の行が完全に消失している可能性があります。簡単な例として、次のことを考慮してください。

b = a;
c = b;
d = c;

プログラムのどこにもc = b;;の命令はないと思います。コンパイラーは、介在するステップなしでa直接移行するだけdであり、状況によってはそのように最適化することさえあると思います。

さらに、変数の 1 つなどのオブジェクトを処理しているときに、コンパイラーは、オブジェクトがレジスター内にあり、メモリー内にまったくない場合もあれば、オブジェクトがメモリー内にある場合もあるコードを生成する場合があります。オブジェクトの一部がメモリ内にあり、一部がレジスタ内にある場合もあります。(たとえば、オブジェクトが 8 バイトで構成されていて、コンパイラーが何らかの作業を行うために必要なレジスター空間を使い果たした場合、オブジェクトの 4 バイトをスタックに保管し、新しく使用可能になったレジスターを一時的に使用して、スタック。)

于 2013-05-21T14:22:25.380 に答える