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バイトの初期化データというセットになります。