OSDN Git Service

projects clean up 1
[pinoc/pinoc.git] / test / readelf_test / readelf_test / read_elf.c
1 /*
2  * read_elf.c
3  *
4  *  Created on: 2011/04/25
5  *      Author: mizu
6  */
7
8 // \8cÃ\82¢\83\\81[\83X\83R\81[\83h\82Å\82·\81B
9
10 #include "read_elf.h"
11 #include "3069f_sci.h"
12 #include "string.h"
13
14 char* gen_xval(unsigned long val, int column)
15 {
16         int i;
17         static char buf[9];
18         char* p;
19
20 //      for(i = 0; i < 9; i++)
21 //              buf[i] = 0;
22
23         p = buf + sizeof buf - 1;
24         *(p--) = 0x00;
25
26         if(!val && !column)
27                 column++;
28
29         while(val || column)
30         {
31                 *(p--) = "0123456789abcdef"[val & 0x0f];
32                 val >>= 4;
33                 if(column) column--;
34         }
35         return buf;
36 }
37
38 static int elf_check(struct elf_header *header)
39 {
40         if(memcmp(header->id.magic, "\x7f" "ELF", 4))
41                 return -1;
42
43         // \83w\83b\83_\8fî\95ñ\83`\83F\83b\83N
44         if(header->id.class             != 1) return -1;        // ELF32
45         if(header->id.format    != 2) return -1;        // Big endian
46         if(header->id.version   != 1) return -1;        // version 1
47         if(header->type                 != 2) return -1;        // Exe file
48         if(header->version              != 1) return -1;        // version 1
49
50         // H8\83A\81[\83L\83e\83N\83`\83\83 Exe file
51         if((header->arch != 46) && (header->arch != 47)) return -1;
52
53         return 0;
54 }
55
56 // elf\82ðRAM\82Ö\93W\8aJ\82·\82é
57 char* elf_develop(char* p)
58 {
59         struct elf_header* header;
60         header = (struct elf_header*) p;
61         struct elf_program_header *program;
62
63         if(elf_check(header))
64         {
65                 sci_write_str(SCI_NO_1, "It's not ELF...\r\n");
66                 return 0;
67         }else
68         {
69                 sci_write_str(SCI_NO_1, "It's ELF Data!!\r\n");
70         }
71
72         sci_write_str(SCI_NO_1, "EntryPoint  >>> ");
73         sci_write_str(SCI_NO_1, gen_xval(header->entry_point, 8));
74
75         int i;
76         for (i = 0; i < header->program_header_num; i++)
77         {
78
79                 program = (struct elf_program_header*) ((char*) header
80                                 + header->program_header_offset + header->program_header_size
81                                 * i);
82
83                 sci_write_str(SCI_NO_1, "\r\noffset        -> ");
84                 sci_write_str(SCI_NO_1, gen_xval(program->offset,                       6));
85                 sci_write_str(SCI_NO_1, "\r\nvirtual_addr  -> ");
86                 sci_write_str(SCI_NO_1, gen_xval(program->virtual_addr,         8));
87                 sci_write_str(SCI_NO_1, "\r\nphysical_addr -> ");
88                 sci_write_str(SCI_NO_1, gen_xval(program->physical_addr,        8));
89                 sci_write_str(SCI_NO_1, "\r\nfile_size     -> ");
90                 sci_write_str(SCI_NO_1, gen_xval(program->file_size,            5));
91                 sci_write_str(SCI_NO_1, "\r\nmemory_size   -> ");
92                 sci_write_str(SCI_NO_1, gen_xval(program->memory_size,          5));
93                 sci_write_str(SCI_NO_1, "\r\nflags         -> ");
94                 sci_write_str(SCI_NO_1, gen_xval(program->flags,                        2));
95                 sci_write_str(SCI_NO_1, "\r\nalign         -> ");
96                 sci_write_str(SCI_NO_1, gen_xval(program->align,                        2));
97                 sci_write_str(SCI_NO_1, "\r\n");
98
99                 // \83\8d\81[\83h\89Â\94\\82©\82Ç\82¤\82©
100                 if (program->type != 1)
101                 {
102                         sci_write_str(SCI_NO_1, "can not load...\r\n");
103                         continue;
104                 }else
105                 {
106                         sci_write_str(SCI_NO_1, "loading...\r\n");
107                 }
108
109                 sci_write_str(SCI_NO_1, "program headers devloping...\r\n");
110                 // \83\81\83\82\83\8a\82Ö\83Z\83N\83V\83\87\83\93\93W\8aJ
111                 memcpy((char*) program->physical_addr, (char*) header + program->offset, program->file_size);
112                 sci_write_str(SCI_NO_1, "program headers devloped...\r\n");
113
114                 sci_write_str(SCI_NO_1, "initing...\r\n");
115                 // \83\81\83\82\83\8a\83T\83C\83Y\82Æ\83t\83@\83C\83\8b\83T\83C\83Y\82Ì\8c\84\8aÔ\82ð0\82Å\96\84\82ß\82é
116                 memset((char*) program->physical_addr + program->file_size, 0, program->memory_size - program->file_size);
117                 sci_write_str(SCI_NO_1, "inited...\r\n");
118
119         }
120
121         // \83w\83b\83_\81[\82Ì\83G\83\93\83g\83\8a\81[\83|\83C\83\93\83g\82ª\95K\82¸\91\8dÝ\82·\82é\82í\82¯\82Å\82Í\82È\82¢\82Ì\82Å\81A\82±\82Ì\83v\83\8d\83O\83\89\83\80\82ÍNG
122         return (char*)header->entry_point;
123 }
124
125 int elf_analysis(char* p)
126 {
127         struct elf_header* header;
128
129         header = (struct elf_header*) p;
130
131         int i;
132         for (i = 0; i < header->section_header_num; i++)
133         {
134
135                 struct elf_program_header *program =
136                                 (struct elf_program_header*) ((char*) header
137                                                 + header->program_header_offset
138                                                 + header->program_header_size * i);
139
140                 // \83\8d\81[\83h\89Â\94\\82©\82Ç\82¤\82©
141                 if (program->type != 1)
142                         return -1;
143
144         }
145
146         return 0;
147
148
149 //      sci_write(SCI1, );
150 }
151
152 int elf_read(char* p)
153 {
154         struct elf_header* header;
155
156         header = (struct elf_header*)p;
157
158         // ELF\82©\83`\83F\83b\83N
159         if(elf_check(header))
160         {
161                 return -1;
162         }
163
164         return 0;
165
166 }