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: まとめ