1

昨日突然疑問がありました。私は長い間Cでプログラミングしてきました。私の質問はこれです:

変数があると仮定します

static uint32_t count = 0;

この変数はデータセグメントに格納する必要があります。この例では、データセグメントが0x08000000プロセスの4GB仮想メモリ空​​間のオフセットで開始すると仮定します。

オフセットの後のどこかに0x08000000、値0の変数'count'用に予約された4バイトがあることを知っています。

私の質問は、メモリ内のこの4バイトの値が、名前「count」とタイプ「uint32_t」にどのように関連付けられているかです(または、たとえば、長さが4バイトで、長さが6バイトではないという事実)。

以下の回答から、マッピング情報はに保存されているようです。"symbol table"

メモリ内の最終的な実行可能ファイルの一部である必要があることを示唆しているようです。その場合、シンボルテーブルはどこに保存されますか?それはコード/テキストセグメントにありますか?

4

3 に答える 3

3

生成されたマシンコードに関する限り、「count」という名前は存在しません。データをロードおよび保存するアドレスを知っているだけです。同様に、この変数を操作するために生成されたマシンコードは、正しいサイズと符号付きで動作するように生成されたため、型情報は保持されません。したがって、4バイトのロードと格納を行い、それを使用して符号なし32ビット演算を実行します。データ。

デバッグおよび動的リンクの目的で、その情報は他の場所で利用できる場合があります。シンボルのあるバイナリには、グローバル変数が配置されているアドレスまたはオフセット、およびそれらのタイプを一覧表示するテーブルがあります。

于 2013-02-07T18:46:16.590 に答える
2

名前との関連付け: 実行可能ファイルには、名前と対応するアドレスに関するダイナミック リンカー情報 (基本的にはマップ) を提供するシンボル テーブルがあるか、または実行可能ファイルが削除された場合、名前がまったくなく、生のアドレスのみが参照されます。 .

型との関連付け: 単純に、コンパイラは、そのアドレスを 4 バイトの符号なし整数の先頭として扱うコードを生成します (たとえば、DWORDs を操作する命令など)。

于 2013-02-07T17:57:34.973 に答える
1

コンパイラは、コードを解析するときに、プログラム内で認識される型と変数に関する情報を含むデータ構造を保持します。したがって、パーサーが見たとき:

static uint32_t count = 0;

静的ストレージ期間がゼロに初期化されcountたタイプの変数があることを記録します。uint32_tパーサーがcount再び識別子に遭遇すると、それが前述の変数を参照していることを認識します。このすべての情報は、オブジェクト コードの生成時に使用されるため、コンパイラ バックエンドは、オブジェクト コードにスペースを割り当て、符号なし整数として扱うことを認識しています。この情報は、デバッグに使用するためにオブジェクト ファイルに配置される場合があります。または、静的変数でなかった場合は、ダイナミック リンカーが使用するセクションに配置される場合があります。

ローダーはこの情報を必要としないため、オブジェクト ファイルにまだ存在する場合はロードする必要はありません。リンカーと動的リンカーは、エクスポートされたシンボルの情報を必要とする場合があるため、適切なセクションから読み込みます。

于 2013-02-07T18:51:22.453 に答える