3

g++ を使用してコンパイルした elf ファイルの 16 進ダンプを、設計したプロセッサ シミュレーションに手動でロードしようとしています。標準の elf ファイルには 30 のセクションがあり、適切なメモリ位置のオフセットを考慮して 30 のセグメントすべてをロードしています。.text次に、セクションの先頭 (00400130)でプログラム カウンターを開始しますが、プログラムが正しく実行されていないようです。SPIM をゴールド スタンダードとして使用して、プロセッサの設計を比較的徹底的に検証しました。奇妙なことに、アセンブリ ファイルを SPIM にロードし、ソフトウェアによって生成された逆アセンブルさ.text.dataたセクションをプロセッサのメモリにロードすると、プログラムが動作します。これは、私がやりたいこととは異なります。

  • C++ プログラムを書く
  • mipseb-linux-g++ (クロス コンパイラ) を使用してコンパイルします。
  • すべてのセクションを独自のファイルに16進数でダンプします
  • ファイルを読み取り、コンテンツをプロセッサの「メモリ」にロードする
  • プログラムを実行する

ELF ファイルのどこにプログラム カウンターを最初に配置する必要がありますか? .text私は今の初めにそれを持っています。また、プログラムが正しく動作するためには、 .textandを含めるだけでよいのでしょうか? .dataここで何が間違っていますか?

4

3 に答える 3

5

.textELF ヘッダーには、領域内の最初のアドレスと必ずしも同じではないエントリ アドレスを含める必要があります。ファイルのエントリ ポイントが何であるかを確認するために使用objdump -fします。これは「開始アドレス」と呼ばれます。

フォーマットはここで説明されています- ELF イメージをメモリにロードするには、program headersではなくを使用する必要がsection headersあり (30 個のプログラム ヘッダーがあるとは思えません)、エントリ ポイントはe_entryELF ヘッダーのフィールドによって記述されます。

于 2010-06-23T13:59:35.120 に答える
1

ELF ヘッダーの e_entry フィールドを使用して、プログラム カウンターを設定する場所を決定します。

于 2010-06-23T14:01:29.677 に答える
1

調べてくださいElf32_Ehdr.e_entry(またはElf64_Ehdr.e_entry64ビットプラットフォームを使用している場合)。少なくとも、.bss空のセクションを含める必要がありますが、ディスク ELF イメージには「メモリ内」サイズがあります。

ウィキペディアは、必要なすべてのドキュメントを提供します。

編集:

objdump -h /usr/bin/vimこれが私の現在のボックスからのものです:

Sections:
Idx Name         Size      VMA               LMA               File off  Algn
...
22 .bss          00009628  00000000006df760  00000000006df760  001df760  2**5
                 ALLOC
23 .comment      00000bc8  0000000000000000  0000000000000000  001df760  2**0
                 CONTENTS, READONLY

File offは と の両方.bssで同じであることに注意してください.comment。つまり.bss、ディスク ファイルでは が空ですが0x9628、メモリではバイト数である必要があります。

于 2010-06-23T14:02:29.537 に答える