7 unsigned char magic[4];
10 unsigned char version;
12 unsigned char abi_version;
13 unsigned char reserve[7];
19 long program_header_offset;
20 long section_header_offset;
23 short program_header_size;
24 short program_header_num;
25 short section_header_size;
26 short section_header_num;
27 short section_name_index;
30 struct elf_program_header {
41 /* ELF¥Ø¥Ã¥À¤Î¥Á¥§¥Ã¥¯ */
42 static int elf_check(struct elf_header *header)
44 if (memcmp(header->id.magic, "\x7f" "ELF", 4))
47 if (header->id.class != 1) return -1; /* ELF32 */
48 if (header->id.format != 2) return -1; /* Big endian */
49 if (header->id.version != 1) return -1; /* version 1 */
50 if (header->type != 2) return -1; /* Executable file */
51 if (header->version != 1) return -1; /* version 1 */
53 /* Hitachi H8/300 or H8/300H */
54 if ((header->arch != 46) && (header->arch != 47)) return -1;
59 /* ¥»¥°¥á¥ó¥Èñ°Ì¤Ç¤Î¥í¡¼¥É */
60 static int elf_load_program(struct elf_header *header)
63 struct elf_program_header *phdr;
65 for (i = 0; i < header->program_header_num; i++) {
66 /* ¥×¥í¥°¥é¥à¡¦¥Ø¥Ã¥À¤ò¼èÆÀ */
67 phdr = (struct elf_program_header *)
68 ((char *)header + header->program_header_offset +
69 header->program_header_size * i);
71 if (phdr->type != 1) /* ¥í¡¼¥É²Äǽ¤Ê¥»¥°¥á¥ó¥È¤«¡© */
74 memcpy((char *)phdr->physical_addr, (char *)header + phdr->offset,
76 memset((char *)phdr->physical_addr + phdr->file_size, 0,
77 phdr->memory_size - phdr->file_size);
83 char *elf_load(char *buf)
85 struct elf_header *header = (struct elf_header *)buf;
87 if (elf_check(header) < 0) /* ELF¥Ø¥Ã¥À¤Î¥Á¥§¥Ã¥¯ */
90 if (elf_load_program(header) < 0) /* ¥»¥°¥á¥ó¥Èñ°Ì¤Ç¤Î¥í¡¼¥É */
93 return (char *)header->entry_point;