C ツールチェーンのリンク段階を理解しようとしています。サンプル プログラムを作成し、結果のオブジェクト ファイルを分析しました。これは、関連するプロセスをよりよく理解するのに役立ちましたが、不明な点がいくつかあります.
ここにある:
パート 1: 初期化された変数の処理。
これらの再配置テーブルのエントリは正しいですか...
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000002b dir32 .data
00000035 dir32 .data
0000003f dir32 .data
2b
... 基本的に、 offset35
および3f
fromに格納されているアドレス.text
は絶対アドレスではなく、.data
?に対する相対アドレス (= オフセット) であることをリンカーに伝えています。これにより、リンカーが
- 再配置不可能なオブジェクト ファイルを作成するために、これらの相対アドレスを絶対アドレスに変換します。
- オブジェクトファイルが他のオブジェクトファイルとリンクされた場合に備えて、それに応じて調整してください。
パート 2: 初期化されていない変数の処理。
初期化されていない変数が初期化された変数とは異なる方法で処理される理由がわかりません。レジスタ アドレスがオペコードに格納されているのはなぜですか。
- 初期化されていないすべての変数 (0x0、0x0、および 0x0) に対して等しく、
- 初期化されたすべての変数 (0x0、0x4、および 0x8) で異なる?
また、再配置テーブル エントリの値フィールドもまったくわかりません。.bss
セクションがそこで参照されることを期待していたでしょう。
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000d dir32 _var1_zeroed-0x00000004
00000017 dir32 _var2_zeroed-0x00000004
00000021 dir32 _var3_zeroed-0x00000004