プログラムヘッダの次にはセクションヘッダを調べます。資料では、4 OBJECT FILESに記載があります。
セクションヘッダでは、セクションを管理しています。プログラムで使用したセクションがここに登場してきます。
typedef struct {
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
} Elf32_Shdr;
1. sh_name セクションの名前を指定するINDEX
2. sh_type セクションのタイプを指定
SHT_NULL 0 このセクションはinactive
SHT_PROGBITS 1 プログラムにより定義した情報
SHT_SYMTAB 2 シンボルテーブル
SHT_STRTAB 3 文字列テーブル
SHT_RELA 4 再配置エントリ
SHT_HASH 5 ハッシュテーブル
SHT_DYNAMIC 6 動的なリンク情報
SHT_NOTE 7
SHT_NOBITS 8 配置バイトなし
SHT_REL 9 再配置エントリ
SHT_SHLIB 10 (予約)
SHT_DYNSYM 11 ンボルテーブル
SHT_LOPROC 0x70000000
SHT_HIPROC 0x7fffffff
SHT_LOUSER 0x80000000
SHT_HIUSER 0xffffffff
3.sh_flags セクションのフラグ
SHF_WRITE 0x1
SHF_ALLOC 0x2
SHF_EXECINSTR 0x4
SHF_MASKPROC 0xF0000000
4. sh_addr 配置アドレス
5. sh_offset このセクションデータの本ファイルでの置き場所のオフセット
6. sh_size セクションのサイズ(Byte)
7. sh_link セクションヘッダテーブルのインデックスを保持
たとえば、シンボルテーブルのセクションが、文字列をもつセクションを指定。
8. sh_info 追加の情報を記録
9. sh_addralign アライメント情報
10. sh_entsize 固定サイズのテーブルエントリがある場合、エントリサイズ。
GCCで生成した場合の情報が以下になります。
SECTIONS:
Name Type Addr Offset Size Aln Lnk Inf ESz Flags
---- ---- ---- ------ ---- --- --- --- --- -----
1: .vector pbits 0x4004 0x0 0x1 W
2: .text pbits 0x0 0x1000 0x2f10 0x10 0x6 AX
3: .ctors pbits 0x4004 0x0 0x1 W
4: .data pbits 0x4000'0000 0x4000 0x4 0x4 0x3 WA
5: .bss nobits 0x4000'0004 0x4004 0x4 0x4 0x3 WA
6: .heap pbits 0x4004 0x0 0x1 W
7: .stack nobits 0x4000'0008 0x4004 0x408 0x3 WA
8: .debug_info pbits 0x4004 0x21e9
9: .debug_abbrev pbits 0x61ed 0x3da
10: .debug_loc pbits 0x65c7 0x4c1e
11: .debug_aranges pbits 0xb1e8 0xb8 0x8
12: .debug_ranges pbits 0xb2a0 0x1d00
13: .debug_line pbits 0xcfa0 0x8a8e
14: .debug_str pbits 0x1'5a2e 0x2e6 1 0x30 MS
15: .comment pbits 0x1'5d14 0x33 1 0x30 MS
16: .debug_frame pbits 0x1'5d48 0x174 0x4
17: .symtab symtab 0x1'5ebc 0x350 0x4 18 30 16
18: .strtab strtab 0x1'620c 0x197
19: .shstrtab strtab 0x1'63a3 0xb7
EWRISC-Vで生成した場合の情報が以下になります。
SECTIONS:
Name Type Addr Offset Size Aln Lnk Inf ESz Flags
---- ---- ---- ------ ---- --- --- --- --- -----
1: .shstrtab strtab 0x1f3c 0xcf 0x4
2: .strtab strtab 0x200c 0x62f 0x4
3: .symtab symtab 0x263c 0x530 0x4 2 51 16
4: A0 pbits 0x0 0x34 0x40 0x4 1 0x6 AX
5: P1 pbits 0x40 0x74 0xe4 0x4 1 0x6 AX
6: P2 rw nobits 0x2000'0000 0x158 0x1c 0x4 1 0x7 WAX
7: P2 ui nobits 0x2000'0020 0x158 0x400 0x8 1 0x7 WAX
8: .debug_abbrev pbits 0x158 0x92 1
9: .debug_aranges pbits 0x1ec 0x38 1
10: .debug_frame pbits 0x224 0x1fd 1
11: .debug_info pbits 0x424 0x21f 1
12: .debug_line pbits 0x644 0xfc 1
13: .debug_loc pbits 0x740 0x34 1
14: .debug_macinfo pbits 0x774 0x5 1
15: .debug_pubnames pbits 0x77c 0x4d 1
16: .iar.debug_line pbits 0x7cc 0xab 1
17: .comment pbits 0x878 0x1668 1
18: .iar.rtmodel pbits 0x1ee0 0x32 1
19: .ARM.attributes loproc+3 0x1f14 0x28 1
スタートアップコードやベクタの作り方が違うので、セクション名が異なるとは思っていましたが、
予想より差分が有るものですね。