1 | /*
|
---|
2 | * Copyright (C) 2006 Sergey Bondari
|
---|
3 | * All rights reserved.
|
---|
4 | *
|
---|
5 | * Redistribution and use in source and binary forms, with or without
|
---|
6 | * modification, are permitted provided that the following conditions
|
---|
7 | * are met:
|
---|
8 | *
|
---|
9 | * - Redistributions of source code must retain the above copyright
|
---|
10 | * notice, this list of conditions and the following disclaimer.
|
---|
11 | * - Redistributions in binary form must reproduce the above copyright
|
---|
12 | * notice, this list of conditions and the following disclaimer in the
|
---|
13 | * documentation and/or other materials provided with the distribution.
|
---|
14 | * - The name of the author may not be used to endorse or promote products
|
---|
15 | * derived from this software without specific prior written permission.
|
---|
16 | *
|
---|
17 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
---|
18 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
---|
19 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
---|
20 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
---|
21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
---|
22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
---|
23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
---|
24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
---|
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
---|
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
---|
27 | */
|
---|
28 |
|
---|
29 | #ifndef __ELF_H__
|
---|
30 | #define __ELF_H__
|
---|
31 |
|
---|
32 | #include <arch/elf.h>
|
---|
33 | #include <arch/types.h>
|
---|
34 | #include <mm/as.h>
|
---|
35 |
|
---|
36 | /**
|
---|
37 | * current ELF version
|
---|
38 | */
|
---|
39 | #define EV_CURRENT 1
|
---|
40 |
|
---|
41 | /**
|
---|
42 | * ELF types
|
---|
43 | */
|
---|
44 | #define ET_NONE 0 /* No type */
|
---|
45 | #define ET_REL 1 /* Relocatable file */
|
---|
46 | #define ET_EXEC 2 /* Executable */
|
---|
47 | #define ET_DYN 3 /* Shared object */
|
---|
48 | #define ET_CORE 4 /* Core */
|
---|
49 | #define ET_LOPROC 0xff00 /* Processor specific */
|
---|
50 | #define ET_HIPROC 0xffff /* Processor specific */
|
---|
51 |
|
---|
52 | /**
|
---|
53 | * ELF machine types
|
---|
54 | */
|
---|
55 | #define EM_NO 0 /* No machine */
|
---|
56 | #define EM_SPARC 2 /* SPARC */
|
---|
57 | #define EM_386 3 /* i386 */
|
---|
58 | #define EM_MIPS 8 /* MIPS RS3000 */
|
---|
59 | #define EM_MIPS_RS3_LE 10 /* MIPS RS3000 LE */
|
---|
60 | #define EM_PPC 20 /* PPC32 */
|
---|
61 | #define EM_PPC64 21 /* PPC64 */
|
---|
62 | #define EM_SPARCV9 43 /* SPARC64 */
|
---|
63 | #define EM_IA_64 50 /* IA-64 */
|
---|
64 | #define EM_X86_64 62 /* AMD64/EMT64 */
|
---|
65 |
|
---|
66 | /**
|
---|
67 | * ELF identification indexes
|
---|
68 | */
|
---|
69 | #define EI_MAG0 0
|
---|
70 | #define EI_MAG1 1
|
---|
71 | #define EI_MAG2 2
|
---|
72 | #define EI_MAG3 3
|
---|
73 | #define EI_CLASS 4 /* File class */
|
---|
74 | #define EI_DATA 5 /* Data encoding */
|
---|
75 | #define EI_VERSION 6 /* File version */
|
---|
76 | #define EI_OSABI 7
|
---|
77 | #define EI_ABIVERSION 8
|
---|
78 | #define EI_PAD 9 /* Start of padding bytes */
|
---|
79 | #define EI_NIDENT 16 /* ELF identification table size */
|
---|
80 |
|
---|
81 | /**
|
---|
82 | * ELF magic number
|
---|
83 | */
|
---|
84 | #define ELFMAG0 0x7f
|
---|
85 | #define ELFMAG1 'E'
|
---|
86 | #define ELFMAG2 'L'
|
---|
87 | #define ELFMAG3 'F'
|
---|
88 |
|
---|
89 | /**
|
---|
90 | * ELF file classes
|
---|
91 | */
|
---|
92 | #define ELFCLASSNONE 0
|
---|
93 | #define ELFCLASS32 1
|
---|
94 | #define ELFCLASS64 2
|
---|
95 |
|
---|
96 | /**
|
---|
97 | * ELF data encoding types
|
---|
98 | */
|
---|
99 | #define ELFDATANONE 0
|
---|
100 | #define ELFDATA2LSB 1 /* Least significant byte first (little endian) */
|
---|
101 | #define ELFDATA2MSB 2 /* Most signigicant byte first (big endian) */
|
---|
102 |
|
---|
103 | /**
|
---|
104 | * ELF error return codes
|
---|
105 | */
|
---|
106 | #define EE_OK 0 /* No error */
|
---|
107 | #define EE_INVALID 1 /* Invalid ELF image */
|
---|
108 | #define EE_MEMORY 2 /* Cannot allocate address space */
|
---|
109 | #define EE_INCOMPATIBLE 3 /* ELF image is not compatible with current architecture */
|
---|
110 | #define EE_UNSUPPORTED 4 /* Non-supported ELF (e.g. dynamic ELFs) */
|
---|
111 | #define EE_IRRECOVERABLE 5
|
---|
112 |
|
---|
113 | /**
|
---|
114 | * ELF section types
|
---|
115 | */
|
---|
116 | #define SHT_NULL 0
|
---|
117 | #define SHT_PROGBITS 1
|
---|
118 | #define SHT_SYMTAB 2
|
---|
119 | #define SHT_STRTAB 3
|
---|
120 | #define SHT_RELA 4
|
---|
121 | #define SHT_HASH 5
|
---|
122 | #define SHT_DYNAMIC 6
|
---|
123 | #define SHT_NOTE 7
|
---|
124 | #define SHT_NOBITS 8
|
---|
125 | #define SHT_REL 9
|
---|
126 | #define SHT_SHLIB 10
|
---|
127 | #define SHT_DYNSYM 11
|
---|
128 | #define SHT_LOOS 0x60000000
|
---|
129 | #define SHT_HIOS 0x6fffffff
|
---|
130 | #define SHT_LOPROC 0x70000000
|
---|
131 | #define SHT_HIPROC 0x7fffffff
|
---|
132 | #define SHT_LOUSER 0x80000000
|
---|
133 | #define SHT_HIUSER 0xffffffff
|
---|
134 |
|
---|
135 | /**
|
---|
136 | * ELF section flags
|
---|
137 | */
|
---|
138 | #define SHF_WRITE 0x1
|
---|
139 | #define SHF_ALLOC 0x2
|
---|
140 | #define SHF_EXECINSTR 0x4
|
---|
141 | #define SHF_MASKPROC 0xf0000000
|
---|
142 |
|
---|
143 | /**
|
---|
144 | * Symbol binding
|
---|
145 | */
|
---|
146 | #define STB_LOCAL 0
|
---|
147 | #define STB_GLOBAL 1
|
---|
148 | #define STB_WEAK 2
|
---|
149 | #define STB_LOPROC 13
|
---|
150 | #define STB_HIPROC 15
|
---|
151 |
|
---|
152 | /**
|
---|
153 | * Symbol types
|
---|
154 | */
|
---|
155 | #define STT_NOTYPE 0
|
---|
156 | #define STT_OBJECT 1
|
---|
157 | #define STT_FUNC 2
|
---|
158 | #define STT_SECTION 3
|
---|
159 | #define STT_FILE 4
|
---|
160 | #define STT_LOPROC 13
|
---|
161 | #define STT_HIPROC 15
|
---|
162 |
|
---|
163 | /**
|
---|
164 | * Program segment types
|
---|
165 | */
|
---|
166 | #define PT_NULL 0
|
---|
167 | #define PT_LOAD 1
|
---|
168 | #define PT_DYNAMIC 2
|
---|
169 | #define PT_INTERP 3
|
---|
170 | #define PT_NOTE 4
|
---|
171 | #define PT_SHLIB 5
|
---|
172 | #define PT_PHDR 6
|
---|
173 | #define PT_LOPROC 0x70000000
|
---|
174 | #define PT_HIPROC 0x7fffffff
|
---|
175 |
|
---|
176 | /**
|
---|
177 | * Program segment attributes.
|
---|
178 | */
|
---|
179 | #define PF_X 1
|
---|
180 | #define PF_W 2
|
---|
181 | #define PF_R 4
|
---|
182 |
|
---|
183 | /**
|
---|
184 | * ELF data types
|
---|
185 | *
|
---|
186 | * These types are found to be identical in both 32-bit and 64-bit
|
---|
187 | * ELF object file specifications. They are the only types used
|
---|
188 | * in ELF header.
|
---|
189 | */
|
---|
190 | typedef __u64 elf_xword;
|
---|
191 | typedef __s64 elf_sxword;
|
---|
192 | typedef __u32 elf_word;
|
---|
193 | typedef __s32 elf_sword;
|
---|
194 | typedef __u16 elf_half;
|
---|
195 |
|
---|
196 | /**
|
---|
197 | * 32-bit ELF data types.
|
---|
198 | *
|
---|
199 | * These types are specific for 32-bit format.
|
---|
200 | */
|
---|
201 | typedef __u32 elf32_addr;
|
---|
202 | typedef __u32 elf32_off;
|
---|
203 |
|
---|
204 | /**
|
---|
205 | * 64-bit ELF data types.
|
---|
206 | *
|
---|
207 | * These types are specific for 64-bit format.
|
---|
208 | */
|
---|
209 | typedef __u64 elf64_addr;
|
---|
210 | typedef __u64 elf64_off;
|
---|
211 |
|
---|
212 | /** ELF header */
|
---|
213 | struct elf32_header {
|
---|
214 | __u8 e_ident[EI_NIDENT];
|
---|
215 | elf_half e_type;
|
---|
216 | elf_half e_machine;
|
---|
217 | elf_word e_version;
|
---|
218 | elf32_addr e_entry;
|
---|
219 | elf32_off e_phoff;
|
---|
220 | elf32_off e_shoff;
|
---|
221 | elf_word e_flags;
|
---|
222 | elf_half e_ehsize;
|
---|
223 | elf_half e_phentsize;
|
---|
224 | elf_half e_phnum;
|
---|
225 | elf_half e_shentsize;
|
---|
226 | elf_half e_shnum;
|
---|
227 | elf_half e_shstrndx;
|
---|
228 | };
|
---|
229 | struct elf64_header {
|
---|
230 | __u8 e_ident[EI_NIDENT];
|
---|
231 | elf_half e_type;
|
---|
232 | elf_half e_machine;
|
---|
233 | elf_word e_version;
|
---|
234 | elf64_addr e_entry;
|
---|
235 | elf64_off e_phoff;
|
---|
236 | elf64_off e_shoff;
|
---|
237 | elf_word e_flags;
|
---|
238 | elf_half e_ehsize;
|
---|
239 | elf_half e_phentsize;
|
---|
240 | elf_half e_phnum;
|
---|
241 | elf_half e_shentsize;
|
---|
242 | elf_half e_shnum;
|
---|
243 | elf_half e_shstrndx;
|
---|
244 | };
|
---|
245 |
|
---|
246 | /*
|
---|
247 | * ELF segment header.
|
---|
248 | * Segments headers are also known as program headers.
|
---|
249 | */
|
---|
250 | struct elf32_segment_header {
|
---|
251 | elf_word p_type;
|
---|
252 | elf32_off p_offset;
|
---|
253 | elf32_addr p_vaddr;
|
---|
254 | elf32_addr p_paddr;
|
---|
255 | elf_word p_filesz;
|
---|
256 | elf_word p_memsz;
|
---|
257 | elf_word p_flags;
|
---|
258 | elf_word p_align;
|
---|
259 | };
|
---|
260 | struct elf64_segment_header {
|
---|
261 | elf_word p_type;
|
---|
262 | elf_word p_flags;
|
---|
263 | elf64_off p_offset;
|
---|
264 | elf64_addr p_vaddr;
|
---|
265 | elf64_addr p_paddr;
|
---|
266 | elf_xword p_filesz;
|
---|
267 | elf_xword p_memsz;
|
---|
268 | elf_xword p_align;
|
---|
269 | };
|
---|
270 |
|
---|
271 | /*
|
---|
272 | * ELF section header
|
---|
273 | */
|
---|
274 | struct elf32_section_header {
|
---|
275 | elf_word sh_name;
|
---|
276 | elf_word sh_type;
|
---|
277 | elf_word sh_flags;
|
---|
278 | elf32_addr sh_addr;
|
---|
279 | elf32_off sh_offset;
|
---|
280 | elf_word sh_size;
|
---|
281 | elf_word sh_link;
|
---|
282 | elf_word sh_info;
|
---|
283 | elf_word sh_addralign;
|
---|
284 | elf_word sh_entsize;
|
---|
285 | };
|
---|
286 | struct elf64_section_header {
|
---|
287 | elf_word sh_name;
|
---|
288 | elf_word sh_type;
|
---|
289 | elf_xword sh_flags;
|
---|
290 | elf64_addr sh_addr;
|
---|
291 | elf64_off sh_offset;
|
---|
292 | elf_xword sh_size;
|
---|
293 | elf_word sh_link;
|
---|
294 | elf_word sh_info;
|
---|
295 | elf_xword sh_addralign;
|
---|
296 | elf_xword sh_entsize;
|
---|
297 | };
|
---|
298 |
|
---|
299 | /*
|
---|
300 | * ELF symbol table entry
|
---|
301 | */
|
---|
302 | struct elf32_symbol {
|
---|
303 | elf_word st_name;
|
---|
304 | elf32_addr st_value;
|
---|
305 | elf_word st_size;
|
---|
306 | __u8 st_info;
|
---|
307 | __u8 st_other;
|
---|
308 | elf_half st_shndx;
|
---|
309 | };
|
---|
310 | struct elf64_symbol {
|
---|
311 | elf_word st_name;
|
---|
312 | __u8 st_info;
|
---|
313 | __u8 st_other;
|
---|
314 | elf_half st_shndx;
|
---|
315 | elf64_addr st_value;
|
---|
316 | elf_xword st_size;
|
---|
317 | };
|
---|
318 |
|
---|
319 | #ifdef __32_BITS__
|
---|
320 | typedef struct elf32_header elf_header_t;
|
---|
321 | typedef struct elf32_segment_header elf_segment_header_t;
|
---|
322 | typedef struct elf32_section_header elf_section_header_t;
|
---|
323 | typedef struct elf32_symbol elf_symbol_t;
|
---|
324 | #endif
|
---|
325 | #ifdef __64_BITS__
|
---|
326 | typedef struct elf64_header elf_header_t;
|
---|
327 | typedef struct elf64_segment_header elf_segment_header_t;
|
---|
328 | typedef struct elf64_section_header elf_section_header_t;
|
---|
329 | typedef struct elf64_symbol elf_symbol_t;
|
---|
330 | #endif
|
---|
331 |
|
---|
332 | extern int elf_load(elf_header_t *header, as_t * as);
|
---|
333 | extern char *elf_error(int rc);
|
---|
334 |
|
---|
335 | #endif
|
---|