Subversion Repositories HelenOS

Rev

Rev 1888 | Rev 2071 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
854 bondari 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
 
1819 decky 29
/** @addtogroup generic	
1702 cejka 30
 * @{
31
 */
32
/** @file
33
 */
34
 
1888 jermar 35
#ifndef KERN_ELF_H_
36
#define KERN_ELF_H_
854 bondari 37
 
38
#include <arch/elf.h>
938 jermar 39
#include <arch/types.h>
1425 jermar 40
#include <typedefs.h>
854 bondari 41
 
938 jermar 42
/**
43
 * current ELF version
44
 */
45
#define	EV_CURRENT	1
46
 
47
/** 
48
 * ELF types 
49
 */
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 */
57
 
58
/** 
59
 * ELF machine types
60
 */
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 */
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
 */
1780 jermar 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;
938 jermar 201
 
202
/**
203
 * 32-bit ELF data types.
204
 *
205
 * These types are specific for 32-bit format.
206
 */
1780 jermar 207
typedef uint32_t elf32_addr;
208
typedef uint32_t elf32_off;
938 jermar 209
 
210
/**
211
 * 64-bit ELF data types.
212
 *
213
 * These types are specific for 64-bit format.
214
 */
1780 jermar 215
typedef uint64_t elf64_addr;
216
typedef uint64_t elf64_off;
938 jermar 217
 
218
/** ELF header */
219
struct elf32_header {
1780 jermar 220
	uint8_t e_ident[EI_NIDENT];
938 jermar 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
};
235
struct elf64_header {
1780 jermar 236
	uint8_t e_ident[EI_NIDENT];
938 jermar 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
/*
952 jermar 253
 * ELF segment header.
254
 * Segments headers are also known as program headers.
255
 */
256
struct 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
};
266
struct 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
/*
938 jermar 278
 * ELF section header
279
 */
280
struct 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
};
292
struct 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
 */
308
struct elf32_symbol {
309
	elf_word st_name;
310
	elf32_addr st_value;
311
	elf_word st_size;
1780 jermar 312
	uint8_t st_info;
313
	uint8_t st_other;
938 jermar 314
	elf_half st_shndx;
315
};
316
struct elf64_symbol {
317
	elf_word st_name;
1780 jermar 318
	uint8_t st_info;
319
	uint8_t st_other;
938 jermar 320
	elf_half st_shndx;
321
	elf64_addr st_value;
322
	elf_xword st_size;
323
};
324
 
325
#ifdef __32_BITS__ 
326
typedef struct elf32_header elf_header_t;
952 jermar 327
typedef struct elf32_segment_header elf_segment_header_t;
938 jermar 328
typedef struct elf32_section_header elf_section_header_t;
329
typedef struct elf32_symbol elf_symbol_t;
854 bondari 330
#endif
938 jermar 331
#ifdef __64_BITS__
332
typedef struct elf64_header elf_header_t;
952 jermar 333
typedef struct elf64_segment_header elf_segment_header_t;
938 jermar 334
typedef struct elf64_section_header elf_section_header_t;
335
typedef struct elf64_symbol elf_symbol_t;
336
#endif
337
 
338
extern int elf_load(elf_header_t *header, as_t * as);
339
extern char *elf_error(int rc);
340
 
341
#endif
1702 cejka 342
 
1819 decky 343
/** @}
1702 cejka 344
 */