ELF形式を理解する.2

Step3: セクションヘッダを読んでみる

セクションヘッダテーブル用の構造体を定義する。ELFヘッダから、セクションヘッダは8個あることがわかったので、8つ用意。

/* section_header_read.c */
#include <stdio.h>

short swap_short(unsigned short value);
int swap_int(unsigned int value);

struct section_header{
	int name;
	int type;
	int flags;
	int addr;
	int offset;
	int size;
	int link;
	int info;
	int align;
	int entry_size;
};		  

int main(void){
	struct section_header header[8];
	FILE *fp;
	int i;

	fp = fopen("kzload.elf", "rb");
	fseek(fp, 1312, SEEK_SET);
	fread(&header, sizeof(header), 1, fp);
	for(i=0; i<8; i++){
		printf("section_header %d\n", i+1);
		printf("%08x\n", swap_int(header[i].name));
		printf("%08x\n", swap_int(header[i].type));
		printf("%08x\n", swap_int(header[i].flags));
		printf("%08x\n", swap_int(header[i].addr));
		printf("%08x\n", swap_int(header[i].offset));
		printf("%08x\n", swap_int(header[i].size));
		printf("%08x\n", swap_int(header[i].link));
		printf("%08x\n", swap_int(header[i].info));
		printf("%08x\n", swap_int(header[i].align));
		printf("%08x\n", swap_int(header[i].entry_size));
	}
	fclose(fp);
	return 1;
}

実行すると、標準出力は以下の通り。

section_header 1
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
section_header 2
0000001b
00000001
00000003
00000000
00000074
00000100
00000000
00000000
00000004
00000000
section_header 3
00000024
00000001
00000006
00000100
00000174
00000128
00000000
00000000
00000002
00000000
section_header 4
0000002a
00000001
00000032
00000228
0000029c
0000000e
00000000
00000000
00000001
00000001
section_header 5
00000032
00000001
00000003
00000238
000002ac
0000000c
00000000
00000000
00000004
00000000
section_header 6
00000011
00000003
00000000
00000000
000004e6
00000038
00000000
00000000
00000001
00000000
section_header 7
00000001
00000002
00000000
00000000
000002b8
00000190
00000007
00000011
00000004
00000010
section_header 8
00000009
00000003
00000000
00000000
00000448
0000009e
00000000
00000000
00000001
00000000

それぞれの意味を調べる。
2つ目のセクションヘッダ

意味 kzload.elf kzload.elfでの意味
セクション名 0x0000001b .shstrtabセクション先頭位置から27バイト目を見る→.vectors
セクションの種類 0x00000001 このセクションはデータ(機械語や初期値など)を持っている
各種フラグ 0x00000003 このセクションはプロセス実行時に「書き込み可能にする必要がある+メモリを占領する」
メモリ上でのセクションのアドレス 0x00000000 0番地
セクションの先頭位置 0x00000074 kzload.elfの先頭から116バイト目
セクションのサイズ 0x00000100 256バイト
関連するセクションの番号 0x00000000 ???
セクション依存の情報 0x00000000 ???
セクションのアラインメント 0x00000004 ???
セクション内のエントリのサイズ 0x00000000 ???

3つ目のセクションヘッダ

セクション名 0x00000024 .shstrtabセクション先頭位置から36バイト目を見る→.text
セクションの種類 0x00000001 このセクションはデータ(機械語や初期値など)を持っている
各種フラグ 0x00000006 このセクションは「プロセス実行時にメモリを占領する+実行可能な機械語を含む」
メモリ上でのセクションのアドレス 0x00000100 256番地
セクションの先頭位置 0x00000174 kzload.elfの先頭から372バイト目
セクションのサイズ 0x00000128 296バイト
関連するセクションの番号 0x00000000 ???
セクション依存の情報 0x00000000 ???
セクションのアラインメント 0x00000002 ???
セクション内のエントリのサイズ 0x00000000 ???

4つ目のセクションヘッダ

セクション名 0x0000002a .shstrtabセクション先頭位置から42バイト目を見る→.rodata
セクションの種類 0x00000001 このセクションはデータ(機械語や初期値など)を持っている
各種フラグ 0x00000032 このセクションは「プロセス実行時にメモリを占領する+マージ可能なデータを含む?+文字列で構成される」
メモリ上でのセクションのアドレス 0x00000228 552番地
セクションの先頭位置 0x0000029c kzload.elfの先頭から668バイト目
セクションのサイズ 0x0000000e 14バイト
関連するセクションの番号 0x00000000 ???
セクション依存の情報 0x00000000 ???
セクションのアラインメント 0x00000001 ???
セクション内のエントリのサイズ 0x00000001 ???

5つ目のセクションヘッダ

セクション名 0x00000032 .shstrtabセクション先頭位置から50バイト目を見る→.data
セクションの種類 0x00000001 このセクションはデータ(機械語や初期値など)を持っている
各種フラグ 0x00000003 このセクションはプロセス実行時に「書き込み可能にする必要がある+メモリを占領する」
メモリ上でのセクションのアドレス 0x00000238 568番地
セクションの先頭位置 0x000002ac kzload.elfの先頭から684バイト目
セクションのサイズ 0x0000000c 12バイト
関連するセクションの番号 0x00000000 ???
セクション依存の情報 0x00000000 ???
セクションのアラインメント 0x00000004 ???
セクション内のエントリのサイズ 0x00000001 ???

6つ目のセクションヘッダ

セクション名 0x00000011 .shstrtabセクション先頭位置から17バイト目を見る→.shstrtab
セクションの種類 0x00000003 このセクションは文字列テーブルをを持っている
各種フラグ 0x00000000 フラグなし
メモリ上でのセクションのアドレス 0x00000000 このセクションはメモリ上に置かない
セクションの先頭位置 0x000004e6 kzload.elfの先頭から1254バイト目
セクションのサイズ 0x00000038 56バイト
関連するセクションの番号 0x00000000 ???
セクション依存の情報 0x00000000 ???
セクションのアラインメント 0x00000001 ???
セクション内のエントリのサイズ 0x00000000 ???

7つ目のセクションヘッダ

セクション名 0x00000001 .shstrtabセクション先頭位置から17バイト目を見る→.symtab
セクションの種類 0x00000002 このセクションはシンボルテーブルを持っている
各種フラグ 0x00000000 フラグなし
メモリ上でのセクションのアドレス 0x00000000 このセクションはメモリ上に置かない
セクションの先頭位置 0x000002b8 kzload.elfの先頭から696バイト目
セクションのサイズ 0x00000190 400バイト
関連するセクションの番号 0x00000007 ???
セクション依存の情報 0x00000011 ???
セクションのアラインメント 0x00000004 ???
セクション内のエントリのサイズ 0x00000010 ???


8つ目のセクションヘッダは

意味 kzload.elf kzload.elfでの意味
セクション名 0x00000009 .shstrtabセクション先頭位置から9バイト目を見る→.strtab
セクションの種類 0x00000003 このセクションは文字列テーブルをもつ
各種フラグ 0x00000000 フラグなし
メモリ上でのセクションのアドレス 0x00000000 ???
セクションの先頭位置 0x00000448 kzload.elfの先頭から1096バイト目
セクションのサイズ 0x0000009e 158バイト
関連するセクションの番号 0x00000000 ???
セクション依存の情報 0x00000000 ???
セクションのアラインメント 0x00000001 ???
セクション内のエントリのサイズ 0x00000000 ???

Step4: まとめ

f:id:bunkyu3:20181008020110p:plain