ELFファイル(4):プログラムヘッダについて
ELFヘッダの次にはプログラムヘッダを調べます。資料では、5 PROGRAM LOADING AND DYNAMIC LINKINGに記載があります。
プログラムヘッダはセグメント(SEGMENT)を管理しています。
typedef struct {
Elf_32_Word p_type;
Elf_32_Off p_offset;
Elf_32_Addr p_vaddr;
Elf_32_Addr p_paddr;
Elf_32_Word p_filesz;
Elf_32_Word p_memsz;
Elf_32_Word p_flags;
Elf_32_Word p_align;
} Elf_32_Phdr;
1. p_type このセグメント領域のタイプと示します。
PT_NULL 0
PT_LOAD 1
PT_DYNAMIC 2
PT_INTERP 3
PT_NOTE 4
PT_SHLIB 5
PT_PHDR 6
PT_LOPROC 0x70000000
PT_HIPROC 0x7fffffff
2. p_offset このセグメント領域のファイルの位置(先頭からのオフセット)
3. p_vaddr このセグメントが配置される仮想アドレス
4. p_paddr このセグメントが配置される実アドレス
5. p_filesz このセグメントのファイルイメージのサイズ
6. p_memsz; このセグメントのメモリイメージのサイズ
7. p_flags このセグメントのフラグ(以下のビットでRead/Write/Executeが指定されます)
0x1: Execute
0x2: Write
0x4: Read
8. p_align このセグメントのアライメント
そこで、TANG NANO 9Kのサンプルfw-flash.elfファイルをobjdumpで見てみると・・・以下の情報が出ていました。
2つ定義されています。
Program Header:
LOAD off 0x00001000 vaddr 0x00000000 paddr 0x00000000 align 2**12
filesz 0x00002f10 memsz 0x00002f10 flags r-x
LOAD off 0x00004000 vaddr 0x40000000 paddr 0x00002f10 align 2**12
filesz 0x00000004 memsz 0x00000410 flags rw-
これを読み取ると
program header
type 0x1
offset 0x1000
virtual address 0x0
physical address 0x0
# bytes in file 0x2f10
# bytes in mem 0x2f10
flags 0x5
alignment 0x1000
と
program header
type 0x1
offset 0x4000
virtual address 0x40000000
physical address 0x2f10
# bytes in file 0x4
# bytes in mem 0x410
flags 0x6
alignment 0x1000
この2つめのプログラムヘッダの情報がぱっと見良くわからないです。
仮想アドレス:0x40000000
実アドレス:0x2f10
ファイルサイズ:0x4
メモリサイズ:0x410
これは、もとのプログラムの構造を見ると理解できます。
FLASH 0x0000000000000000 0x0000000000800000 xr
RAM 0x0000000040000000 0x0000000000002000 xrw
まずフラッシュは0x0から8MBで、RAMは0x40000000から8Kです。
さきほどの2つめのプログラムヘッダはRAMのデータの事を指しています。
RAMとしての領域は0x40000000から0x410の領域を使用します。
この中は,0x4バイトのデータと0x400はスタックです。アライメントのためすこし大きくなりましたが0x410をRAM領域として使用すると言う事です。
それに対して実アドレスは?というと、変数の初期値データの配置場所となります。
0x210のファイルサイズ0x4バイトの初期化データというセットになります。