2 * Copyright (C) 2006 Sergey Bondari
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
29 /** @addtogroup generic
39 #include <arch/types.h>
50 #define ET_NONE 0 /* No type */
51 #define ET_REL 1 /* Relocatable file */
52 #define ET_EXEC 2 /* Executable */
53 #define ET_DYN 3 /* Shared object */
54 #define ET_CORE 4 /* Core */
55 #define ET_LOPROC 0xff00 /* Processor specific */
56 #define ET_HIPROC 0xffff /* Processor specific */
61 #define EM_NO 0 /* No machine */
62 #define EM_SPARC 2 /* SPARC */
63 #define EM_386 3 /* i386 */
64 #define EM_MIPS 8 /* MIPS RS3000 */
65 #define EM_MIPS_RS3_LE 10 /* MIPS RS3000 LE */
66 #define EM_PPC 20 /* PPC32 */
67 #define EM_PPC64 21 /* PPC64 */
68 #define EM_SPARCV9 43 /* SPARC64 */
69 #define EM_IA_64 50 /* IA-64 */
70 #define EM_X86_64 62 /* AMD64/EMT64 */
73 * ELF identification indexes
79 #define EI_CLASS 4 /* File class */
80 #define EI_DATA 5 /* Data encoding */
81 #define EI_VERSION 6 /* File version */
83 #define EI_ABIVERSION 8
84 #define EI_PAD 9 /* Start of padding bytes */
85 #define EI_NIDENT 16 /* ELF identification table size */
98 #define ELFCLASSNONE 0
103 * ELF data encoding types
105 #define ELFDATANONE 0
106 #define ELFDATA2LSB 1 /* Least significant byte first (little endian) */
107 #define ELFDATA2MSB 2 /* Most signigicant byte first (big endian) */
110 * ELF error return codes
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
123 #define SHT_PROGBITS 1
128 #define SHT_DYNAMIC 6
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
144 #define SHF_WRITE 0x1
145 #define SHF_ALLOC 0x2
146 #define SHF_EXECINSTR 0x4
147 #define SHF_MASKPROC 0xf0000000
155 #define STB_LOPROC 13
156 #define STB_HIPROC 15
164 #define STT_SECTION 3
166 #define STT_LOPROC 13
167 #define STT_HIPROC 15
170 * Program segment types
179 #define PT_LOPROC 0x70000000
180 #define PT_HIPROC 0x7fffffff
183 * Program segment attributes.
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
196 typedef uint64_t elf_xword
;
197 typedef int64_t elf_sxword
;
198 typedef uint32_t elf_word
;
199 typedef int32_t elf_sword
;
200 typedef uint16_t elf_half
;
203 * 32-bit ELF data types.
205 * These types are specific for 32-bit format.
207 typedef uint32_t elf32_addr
;
208 typedef uint32_t elf32_off
;
211 * 64-bit ELF data types.
213 * These types are specific for 64-bit format.
215 typedef uint64_t elf64_addr
;
216 typedef uint64_t elf64_off
;
219 struct elf32_header
{
220 uint8_t e_ident
[EI_NIDENT
];
229 elf_half e_phentsize
;
231 elf_half e_shentsize
;
235 struct elf64_header
{
236 uint8_t e_ident
[EI_NIDENT
];
245 elf_half e_phentsize
;
247 elf_half e_shentsize
;
253 * ELF segment header.
254 * Segments headers are also known as program headers.
256 struct elf32_segment_header
{
266 struct elf64_segment_header
{
280 struct elf32_section_header
{
289 elf_word sh_addralign
;
292 struct elf64_section_header
{
301 elf_xword sh_addralign
;
302 elf_xword sh_entsize
;
306 * ELF symbol table entry
308 struct elf32_symbol
{
316 struct elf64_symbol
{
326 typedef struct elf32_header elf_header_t
;
327 typedef struct elf32_segment_header elf_segment_header_t
;
328 typedef struct elf32_section_header elf_section_header_t
;
329 typedef struct elf32_symbol elf_symbol_t
;
332 typedef struct elf64_header elf_header_t
;
333 typedef struct elf64_segment_header elf_segment_header_t
;
334 typedef struct elf64_section_header elf_section_header_t
;
335 typedef struct elf64_symbol elf_symbol_t
;
338 extern int elf_load(elf_header_t
*header
, as_t
* as
);
339 extern char *elf_error(int rc
);