4 * Created on: 2011/04/25
12 char* gen_xval(unsigned long val, int column)
18 // for(i = 0; i < 9; i++)
21 p = buf + sizeof buf - 1;
29 *(p--) = "0123456789abcdef"[val & 0x0f];
36 static int elf_check(struct elf_header *header)
38 if(memcmp(header->id.magic, "\x7f" "ELF", 4))
42 if(header->id.class != 1) return -1; // ELF32
43 if(header->id.format != 2) return -1; // Big endian
44 if(header->id.version != 1) return -1; // version 1
45 if(header->type != 2) return -1; // Exe file
46 if(header->version != 1) return -1; // version 1
49 if((header->arch != 46) && (header->arch != 47)) return -1;
55 char* elf_develop(char* p)
57 struct elf_header* header;
58 header = (struct elf_header*) p;
59 struct elf_program_header *program;
63 sci_write_str(SCI_NO_1, "It's not ELF...\r\n");
67 sci_write_str(SCI_NO_1, "It's ELF Data!!\r\n");
70 sci_write_str(SCI_NO_1, "EntryPoint >>> ");
71 sci_write_str(SCI_NO_1, gen_xval(header->entry_point, 8));
74 for (i = 0; i < header->program_header_num; i++)
77 program = (struct elf_program_header*) ((char*) header
78 + header->program_header_offset + header->program_header_size
81 sci_write_str(SCI_NO_1, "\r\noffset -> ");
82 sci_write_str(SCI_NO_1, gen_xval(program->offset, 6));
83 sci_write_str(SCI_NO_1, "\r\nvirtual_addr -> ");
84 sci_write_str(SCI_NO_1, gen_xval(program->virtual_addr, 8));
85 sci_write_str(SCI_NO_1, "\r\nphysical_addr -> ");
86 sci_write_str(SCI_NO_1, gen_xval(program->physical_addr, 8));
87 sci_write_str(SCI_NO_1, "\r\nfile_size -> ");
88 sci_write_str(SCI_NO_1, gen_xval(program->file_size, 5));
89 sci_write_str(SCI_NO_1, "\r\nmemory_size -> ");
90 sci_write_str(SCI_NO_1, gen_xval(program->memory_size, 5));
91 sci_write_str(SCI_NO_1, "\r\nflags -> ");
92 sci_write_str(SCI_NO_1, gen_xval(program->flags, 2));
93 sci_write_str(SCI_NO_1, "\r\nalign -> ");
94 sci_write_str(SCI_NO_1, gen_xval(program->align, 2));
95 sci_write_str(SCI_NO_1, "\r\n");
98 if (program->type != 1)
100 sci_write_str(SCI_NO_1, "can not load...\r\n");
104 sci_write_str(SCI_NO_1, "loading...\r\n");
107 sci_write_str(SCI_NO_1, "program headers devloping...\r\n");
109 memcpy((char*) program->physical_addr, (char*) header + program->offset, program->file_size);
110 sci_write_str(SCI_NO_1, "program headers devloped...\r\n");
112 sci_write_str(SCI_NO_1, "initing...\r\n");
113 // メモリサイズとファイルサイズの隙間を0で埋める
114 memset((char*) program->physical_addr + program->file_size, 0, program->memory_size - program->file_size);
115 sci_write_str(SCI_NO_1, "inited...\r\n");
119 return (char*)header->entry_point;
122 int elf_analysis(char* p)
124 struct elf_header* header;
126 header = (struct elf_header*) p;
129 for (i = 0; i < header->section_header_num; i++)
132 struct elf_program_header *program =
133 (struct elf_program_header*) ((char*) header
134 + header->program_header_offset
135 + header->program_header_size * i);
138 if (program->type != 1)
146 // sci_write(SCI1, );
149 int elf_read(char* p)
151 struct elf_header* header;
153 header = (struct elf_header*)p;
156 if(elf_check(header))