それではELFフォーマットのELFヘッダを見ていきましょう。
以下のように定義されています。
#define EINIDENT 16
typedef struct{
unsigned char e_ident[EINIDENT];
Elf_32_Half e_type;
Elf_32_Half e_machine;
Elf_32_Word e_version;
Elf_32_Addr e_entry;
Elf_32_Off e_phoff;
Elf_32_Off e_shoff;
Elf_32_Word e_flags;
Elf_32_Half e_ehsize;
Elf_32_Half e_phentsize;
Elf_32_Half e_phnum;
Elf_32_Half e_shentsize;
Elf_32_Half e_shnum;
Elf_32_Half e_shstrndx;
} Elf32_Ehdr ;
1.e_identは、先頭にELFという文字列が入っています。
2.e_typeは、このファイルのタイプを示します。今回私は実行形式を対象にするので、2が入っている事となります。
0 No file type
1 Relocatable file
2 Executable file
3 Shared object file
4 Core file
0xff00 Processor-specific
0xffff Processor-specific
3.e_machine 実行形式を動かすアーキテクチャを示します。
この定義がどこにあるのかがわかっていないのですが、WikipediaのELFのフォーマットに結構掲載されていました。
0x03 x86
0x28 arm
0x3E x86-64
0xF3 RISC-V
4.e_version オブジェクトのファイルバージョンをしめします。
いまのところELFフォーマット拡張されていないので、通常は1となるようです。
5. e_entry はこのプログラムのスタートアドレスを示します。
無い場合はゼロとなるので、スタートアドレスがゼロというのは扱いにくいのかもしれませんね。
6. e_phoffはプログラムヘッダテーブルをアクセスするためのオフセット値を提供
プログラムヘッダにアクセスるためには必須です。
7. e_shoffはセクションヘッダテーブルをアクセスするためのオフセット値を提供
セクションヘッダにアクセスするためには必須です。
8. e_flagsはプロセッサ依存のフラグ
9. e_ehsizeは、ELFヘッダのサイズ(Byte)
10. e_phentsize プログラムヘッダのサイズ(Byte)
11. e_phnum プログラムヘッダの個数
12. e_shentsize セクションヘッダのサイズ(Byte)
13. e_shnum セクションヘッダの個数
14. e_shstrndx セクションヘッダの名前テーブルのインデックス
そこで、TANG NANO 9Kのサンプルfw-flash.elfファイルをobjdumpで見てみると・・・以下の情報が出ていました。
fw-flash.elf: file format elf32-littleriscv
fw-flash.elf
architecture: riscv:rv32, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000000
これを実際のファイルから読み出すと、以下になっていました。
ELF ID [ELF]
type 0x2
machine 0xf3
version 0x1
entry 0x0
phoff 0x34
shoff 0x1645c
flags 0x0
ehsize 0x34
phetsize 0x20
phnum 0x2
shetsize 0x28
shnum 0x14