オブジェクト修行 (2)
とりあえず早起きできたので活動開始。ええと KOZOS なリポジトリから clone して step5 をマージしてるコミットをとりだしてます (おそらくここにしか中身をダンプしてる手続きが無かったはず)。
ヘッダのチェック
な手続きが以下。
static int elf_check(struct elf_header *header) { if (memcmp(header->id.magic, "\x7f" "ELF", 4)) return -1; if (header->id.class != 1) return -1; /* ELF32 */ if (header->id.format != 2) return -1; /* Big endian */ if (header->id.version != 1) return -1; /* version 1 */ if (header->type != 2) return -1; /* Executable file */ if (header->version != 1) return -1; /* version 1 */ /* Hitachi H8/300 or H8/300H */ if ((header->arch != 46) && (header->arch != 47)) return -1; return 0; }
id.format は 1 (little-endian) に修正必要。type も 2 ではなくて 3 (ET_DYN) なのかどうなのか。あと、上の手続きの arch という属性の値も違いますね。何になるんだろ。
Machine: ARM
ええと od な出力が以下か。
$ od -t x -A x /sbin/init 000000 464c457f 00010101 00000000 00000000 000010 00280003 00000001 000048e5 00000034
28 がソレ、って思って良いのかどうか (を
EM_ARM で grep してみれば良いのかな。と以下が出てきた。
/usr/include/elf.h:#define EM_ARM 40 /* ARM */
0x28 は 40 で良いみたいに見えますがどうでしょ。で、もひとつの中身をダンプしている elf_loadl_program が以下。
static int elf_load_program(struct elf_header *header) { int i; struct elf_program_header *phdr; for (i = 0; i < header->program_header_num; i++) { phdr = (struct elf_program_header *) ((char *)header + header->program_header_offset + header->program_header_size * i); if (phdr->type != 1) continue; putxval(phdr->offset, 6); puts(" "); putxval(phdr->virtual_addr, 8); puts(" "); putxval(phdr->physical_addr, 8); puts(" "); putxval(phdr->file_size, 5); puts(" "); putxval(phdr->memory_size, 5); puts(" "); putxval(phdr->flags, 2); puts(" "); putxval(phdr->align, 2); puts("\n"); } return 0; }
とりあえず arm な /sbin/init を読み込んで先頭アドレスを手続きに渡せば何とかなる風に見えるんですが、どう領域を確保するかな。面倒なので、ELF 前提でヘッダを読み込んで上のチェックに渡して無問題なら、という形なのかどうか。
stat でサイズをナニして領域確保してから fread で全部読み込めば良いのかな。
そういえば
objdump の間違いは昨日エントリの理解で大丈夫だったようです。@tetsu_koba さんからもコメント頂戴しました。色々とありがとうございます。