source: mainline/kernel/generic/include/lib/elf.h@ d630139

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d630139 was d630139, checked in by Jakub Jermar <jakub@…>, 18 years ago

Add arm32 architecture. The 32 suffix is used to specify that 16-bit Thumb
instructions are not used. The arm32 code is mostly composed of placeholders
that need to be replaced by real implementation. So far, the arm32 tree
only compiles. If run under GXEmul simulator, an infinit loop at the
kernel entry point will be entered.

  • Property mode set to 100644
File size: 7.6 KB
Line 
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/** @addtogroup generic
30 * @{
31 */
32/** @file
33 */
34
35#ifndef KERN_ELF_H_
36#define KERN_ELF_H_
37
38#include <arch/elf.h>
39#include <arch/types.h>
40
41/**
42 * current ELF version
43 */
44#define EV_CURRENT 1
45
46/**
47 * ELF types
48 */
49#define ET_NONE 0 /* No type */
50#define ET_REL 1 /* Relocatable file */
51#define ET_EXEC 2 /* Executable */
52#define ET_DYN 3 /* Shared object */
53#define ET_CORE 4 /* Core */
54#define ET_LOPROC 0xff00 /* Processor specific */
55#define ET_HIPROC 0xffff /* Processor specific */
56
57/**
58 * ELF machine types
59 */
60#define EM_NO 0 /* No machine */
61#define EM_SPARC 2 /* SPARC */
62#define EM_386 3 /* i386 */
63#define EM_MIPS 8 /* MIPS RS3000 */
64#define EM_MIPS_RS3_LE 10 /* MIPS RS3000 LE */
65#define EM_PPC 20 /* PPC32 */
66#define EM_PPC64 21 /* PPC64 */
67#define EM_ARM 40 /* ARM */
68#define EM_SPARCV9 43 /* SPARC64 */
69#define EM_IA_64 50 /* IA-64 */
70#define EM_X86_64 62 /* AMD64/EMT64 */
71
72/**
73 * ELF identification indexes
74 */
75#define EI_MAG0 0
76#define EI_MAG1 1
77#define EI_MAG2 2
78#define EI_MAG3 3
79#define EI_CLASS 4 /* File class */
80#define EI_DATA 5 /* Data encoding */
81#define EI_VERSION 6 /* File version */
82#define EI_OSABI 7
83#define EI_ABIVERSION 8
84#define EI_PAD 9 /* Start of padding bytes */
85#define EI_NIDENT 16 /* ELF identification table size */
86
87/**
88 * ELF magic number
89 */
90#define ELFMAG0 0x7f
91#define ELFMAG1 'E'
92#define ELFMAG2 'L'
93#define ELFMAG3 'F'
94
95/**
96 * ELF file classes
97 */
98#define ELFCLASSNONE 0
99#define ELFCLASS32 1
100#define ELFCLASS64 2
101
102/**
103 * ELF data encoding types
104 */
105#define ELFDATANONE 0
106#define ELFDATA2LSB 1 /* Least significant byte first (little endian) */
107#define ELFDATA2MSB 2 /* Most signigicant byte first (big endian) */
108
109/**
110 * ELF error return codes
111 */
112#define EE_OK 0 /* No error */
113#define EE_INVALID 1 /* Invalid ELF image */
114#define EE_MEMORY 2 /* Cannot allocate address space */
115#define EE_INCOMPATIBLE 3 /* ELF image is not compatible with current architecture */
116#define EE_UNSUPPORTED 4 /* Non-supported ELF (e.g. dynamic ELFs) */
117#define EE_IRRECOVERABLE 5
118
119/**
120 * ELF section types
121 */
122#define SHT_NULL 0
123#define SHT_PROGBITS 1
124#define SHT_SYMTAB 2
125#define SHT_STRTAB 3
126#define SHT_RELA 4
127#define SHT_HASH 5
128#define SHT_DYNAMIC 6
129#define SHT_NOTE 7
130#define SHT_NOBITS 8
131#define SHT_REL 9
132#define SHT_SHLIB 10
133#define SHT_DYNSYM 11
134#define SHT_LOOS 0x60000000
135#define SHT_HIOS 0x6fffffff
136#define SHT_LOPROC 0x70000000
137#define SHT_HIPROC 0x7fffffff
138#define SHT_LOUSER 0x80000000
139#define SHT_HIUSER 0xffffffff
140
141/**
142 * ELF section flags
143 */
144#define SHF_WRITE 0x1
145#define SHF_ALLOC 0x2
146#define SHF_EXECINSTR 0x4
147#define SHF_MASKPROC 0xf0000000
148
149/**
150 * Symbol binding
151 */
152#define STB_LOCAL 0
153#define STB_GLOBAL 1
154#define STB_WEAK 2
155#define STB_LOPROC 13
156#define STB_HIPROC 15
157
158/**
159 * Symbol types
160 */
161#define STT_NOTYPE 0
162#define STT_OBJECT 1
163#define STT_FUNC 2
164#define STT_SECTION 3
165#define STT_FILE 4
166#define STT_LOPROC 13
167#define STT_HIPROC 15
168
169/**
170 * Program segment types
171 */
172#define PT_NULL 0
173#define PT_LOAD 1
174#define PT_DYNAMIC 2
175#define PT_INTERP 3
176#define PT_NOTE 4
177#define PT_SHLIB 5
178#define PT_PHDR 6
179#define PT_LOPROC 0x70000000
180#define PT_HIPROC 0x7fffffff
181
182/**
183 * Program segment attributes.
184 */
185#define PF_X 1
186#define PF_W 2
187#define PF_R 4
188
189/**
190 * ELF data types
191 *
192 * These types are found to be identical in both 32-bit and 64-bit
193 * ELF object file specifications. They are the only types used
194 * in ELF header.
195 */
196typedef uint64_t elf_xword;
197typedef int64_t elf_sxword;
198typedef uint32_t elf_word;
199typedef int32_t elf_sword;
200typedef uint16_t elf_half;
201
202/**
203 * 32-bit ELF data types.
204 *
205 * These types are specific for 32-bit format.
206 */
207typedef uint32_t elf32_addr;
208typedef uint32_t elf32_off;
209
210/**
211 * 64-bit ELF data types.
212 *
213 * These types are specific for 64-bit format.
214 */
215typedef uint64_t elf64_addr;
216typedef uint64_t elf64_off;
217
218/** ELF header */
219struct elf32_header {
220 uint8_t e_ident[EI_NIDENT];
221 elf_half e_type;
222 elf_half e_machine;
223 elf_word e_version;
224 elf32_addr e_entry;
225 elf32_off e_phoff;
226 elf32_off e_shoff;
227 elf_word e_flags;
228 elf_half e_ehsize;
229 elf_half e_phentsize;
230 elf_half e_phnum;
231 elf_half e_shentsize;
232 elf_half e_shnum;
233 elf_half e_shstrndx;
234};
235struct elf64_header {
236 uint8_t e_ident[EI_NIDENT];
237 elf_half e_type;
238 elf_half e_machine;
239 elf_word e_version;
240 elf64_addr e_entry;
241 elf64_off e_phoff;
242 elf64_off e_shoff;
243 elf_word e_flags;
244 elf_half e_ehsize;
245 elf_half e_phentsize;
246 elf_half e_phnum;
247 elf_half e_shentsize;
248 elf_half e_shnum;
249 elf_half e_shstrndx;
250};
251
252/*
253 * ELF segment header.
254 * Segments headers are also known as program headers.
255 */
256struct elf32_segment_header {
257 elf_word p_type;
258 elf32_off p_offset;
259 elf32_addr p_vaddr;
260 elf32_addr p_paddr;
261 elf_word p_filesz;
262 elf_word p_memsz;
263 elf_word p_flags;
264 elf_word p_align;
265};
266struct elf64_segment_header {
267 elf_word p_type;
268 elf_word p_flags;
269 elf64_off p_offset;
270 elf64_addr p_vaddr;
271 elf64_addr p_paddr;
272 elf_xword p_filesz;
273 elf_xword p_memsz;
274 elf_xword p_align;
275};
276
277/*
278 * ELF section header
279 */
280struct elf32_section_header {
281 elf_word sh_name;
282 elf_word sh_type;
283 elf_word sh_flags;
284 elf32_addr sh_addr;
285 elf32_off sh_offset;
286 elf_word sh_size;
287 elf_word sh_link;
288 elf_word sh_info;
289 elf_word sh_addralign;
290 elf_word sh_entsize;
291};
292struct elf64_section_header {
293 elf_word sh_name;
294 elf_word sh_type;
295 elf_xword sh_flags;
296 elf64_addr sh_addr;
297 elf64_off sh_offset;
298 elf_xword sh_size;
299 elf_word sh_link;
300 elf_word sh_info;
301 elf_xword sh_addralign;
302 elf_xword sh_entsize;
303};
304
305/*
306 * ELF symbol table entry
307 */
308struct elf32_symbol {
309 elf_word st_name;
310 elf32_addr st_value;
311 elf_word st_size;
312 uint8_t st_info;
313 uint8_t st_other;
314 elf_half st_shndx;
315};
316struct elf64_symbol {
317 elf_word st_name;
318 uint8_t st_info;
319 uint8_t st_other;
320 elf_half st_shndx;
321 elf64_addr st_value;
322 elf_xword st_size;
323};
324
325#ifdef __32_BITS__
326typedef struct elf32_header elf_header_t;
327typedef struct elf32_segment_header elf_segment_header_t;
328typedef struct elf32_section_header elf_section_header_t;
329typedef struct elf32_symbol elf_symbol_t;
330#endif
331#ifdef __64_BITS__
332typedef struct elf64_header elf_header_t;
333typedef struct elf64_segment_header elf_segment_header_t;
334typedef struct elf64_section_header elf_section_header_t;
335typedef struct elf64_symbol elf_symbol_t;
336#endif
337
338extern char *elf_error(int rc);
339
340#endif
341
342/** @}
343 */
Note: See TracBrowser for help on using the repository browser.