0

私が知っているように、ビンとエルフの基本的な違いは

Binファイルにはビットまたはバイトのデータのみが含まれており、メモリにロードするときにメモリのアドレスを指定する必要があります.

一方、elf の場合は、シンボル ルックアップと再配置可能なテーブルがあるため、プログラム時にアドレスを指定する必要はありません。

添付の画像を参照してください。LPCexpresso を使用して、elf ファイルをデバイスにプログラムしています。ベースアドレスを指定しない場合、デフォルトで 0x00000000 が使用されます。今、私は最初にプログラムbootloader.elfし、次にmain.elf. どちらの場合も、ベース アドレスを指定していません。

ここで私の質問は、アドレスを指定していない場合、elfファイルが正しい場所をプログラムする方法を決定する方法と、1 つのイメージをプログラムした後、別のイメージをプログラムする場合、最初のイメージを上書きしませんか? (どちらの場合もアドレスを指定しておらず、デフォルトで 0x00000000 であるため)

4

1 に答える 1

3

通常、この情報はリンカー スクリプトによって作成された ELF ファイル内にあります。

GNU binutils の一部として、ELF セクションとヘッダーに関する情報を表示する「readelf」というツールがあります。残念ながら、これらのツールは構成ツールに応じて接頭辞を使用しており、おそらく「arm-none-readelf」と呼ばれます。お持ちでない場合は、http: //www.yagarto.org/ をご覧ください。

したがって、「arm-none-readelf main.elf -a」と入力すると、次のように表示されます。

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           YOUR ARCHITECTURE
  Version:                           0x1
  Entry point address:               YOUR ENTRY ADDRESS
  Start of program headers:          52 (bytes into file)
  Start of section headers:          YOUR SIZE
  Flags:                             0x300
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         36
  Size of section headers:           40 (bytes)
  Number of section headers:         55
  Section header string table index: 52

(これは単なるサンプル データであることに注意してください)。

通常、すべてのコンパイラには、ELF のロード アドレスを指定できるリンカのオプションがあります (.ld ファイルと呼ばれます)。

それが役に立てば幸い。

于 2016-05-20T09:31:33.747 に答える