Subversion Repositories HelenOS

Rev

Rev 2745 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
854 bondari 1
/*
2071 jermar 2
 * Copyright (c) 2006 Sergey Bondari
854 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>
854 bondari 40
 
938 jermar 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 */
2128 jermar 67
#define EM_ARM      40  /* ARM */
938 jermar 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) */
3222 svoboda 117
#define EE_LOADER       5   /* The image is actually a program loader */
118
#define EE_IRRECOVERABLE    6
938 jermar 119
 
120
/**
121
 * ELF section types
122
 */
123
#define SHT_NULL        0
124
#define SHT_PROGBITS        1
125
#define SHT_SYMTAB      2
126
#define SHT_STRTAB      3
127
#define SHT_RELA        4
128
#define SHT_HASH        5
129
#define SHT_DYNAMIC     6
130
#define SHT_NOTE        7
131
#define SHT_NOBITS      8
132
#define SHT_REL         9
133
#define SHT_SHLIB       10
134
#define SHT_DYNSYM      11
135
#define SHT_LOOS        0x60000000
136
#define SHT_HIOS        0x6fffffff
137
#define SHT_LOPROC      0x70000000
138
#define SHT_HIPROC      0x7fffffff
139
#define SHT_LOUSER      0x80000000
140
#define SHT_HIUSER      0xffffffff
141
 
142
/**
143
 * ELF section flags
144
 */
145
#define SHF_WRITE       0x1 
146
#define SHF_ALLOC       0x2
147
#define SHF_EXECINSTR       0x4
2573 jermar 148
#define SHF_TLS         0x400
938 jermar 149
#define SHF_MASKPROC        0xf0000000
150
 
151
/**
152
 * Symbol binding
153
 */
154
#define STB_LOCAL       0
155
#define STB_GLOBAL      1
156
#define STB_WEAK        2
157
#define STB_LOPROC      13
158
#define STB_HIPROC      15
159
 
160
/**
161
 * Symbol types
162
 */
163
#define STT_NOTYPE      0
164
#define STT_OBJECT      1
165
#define STT_FUNC        2
166
#define STT_SECTION     3
167
#define STT_FILE        4
168
#define STT_LOPROC      13
169
#define STT_HIPROC      15
170
 
171
/**
172
 * Program segment types
173
 */
174
#define PT_NULL         0
175
#define PT_LOAD         1
176
#define PT_DYNAMIC      2
177
#define PT_INTERP       3
178
#define PT_NOTE         4
179
#define PT_SHLIB        5
180
#define PT_PHDR         6
181
#define PT_LOPROC       0x70000000
182
#define PT_HIPROC       0x7fffffff
183
 
184
/**
185
 * Program segment attributes.
186
 */
187
#define PF_X    1
188
#define PF_W    2
189
#define PF_R    4
190
 
191
/**
192
 * ELF data types
193
 *
194
 * These types are found to be identical in both 32-bit and 64-bit
195
 * ELF object file specifications. They are the only types used
196
 * in ELF header.
197
 */
1780 jermar 198
typedef uint64_t elf_xword;
199
typedef int64_t elf_sxword;
200
typedef uint32_t elf_word;
201
typedef int32_t elf_sword;
202
typedef uint16_t elf_half;
938 jermar 203
 
204
/**
205
 * 32-bit ELF data types.
206
 *
207
 * These types are specific for 32-bit format.
208
 */
1780 jermar 209
typedef uint32_t elf32_addr;
210
typedef uint32_t elf32_off;
938 jermar 211
 
212
/**
213
 * 64-bit ELF data types.
214
 *
215
 * These types are specific for 64-bit format.
216
 */
1780 jermar 217
typedef uint64_t elf64_addr;
218
typedef uint64_t elf64_off;
938 jermar 219
 
220
/** ELF header */
221
struct elf32_header {
1780 jermar 222
    uint8_t e_ident[EI_NIDENT];
938 jermar 223
    elf_half e_type;
224
    elf_half e_machine;
225
    elf_word e_version;
226
    elf32_addr e_entry;
227
    elf32_off e_phoff;
228
    elf32_off e_shoff;
229
    elf_word e_flags;
230
    elf_half e_ehsize;
231
    elf_half e_phentsize;
232
    elf_half e_phnum;
233
    elf_half e_shentsize;
234
    elf_half e_shnum;
235
    elf_half e_shstrndx;
236
};
237
struct elf64_header {
1780 jermar 238
    uint8_t e_ident[EI_NIDENT];
938 jermar 239
    elf_half e_type;
240
    elf_half e_machine;
241
    elf_word e_version;
242
    elf64_addr e_entry;
243
    elf64_off e_phoff;
244
    elf64_off e_shoff;
245
    elf_word e_flags;
246
    elf_half e_ehsize;
247
    elf_half e_phentsize;
248
    elf_half e_phnum;
249
    elf_half e_shentsize;
250
    elf_half e_shnum;
251
    elf_half e_shstrndx;
252
};
253
 
254
/*
952 jermar 255
 * ELF segment header.
256
 * Segments headers are also known as program headers.
257
 */
258
struct elf32_segment_header {
259
    elf_word p_type;
260
    elf32_off p_offset;
261
    elf32_addr p_vaddr;
262
    elf32_addr p_paddr;
263
    elf_word p_filesz;
264
    elf_word p_memsz;
265
    elf_word p_flags;
266
    elf_word p_align;
267
};
268
struct elf64_segment_header {
269
    elf_word p_type;
270
    elf_word p_flags;
271
    elf64_off p_offset;
272
    elf64_addr p_vaddr;
273
    elf64_addr p_paddr;
274
    elf_xword p_filesz;
275
    elf_xword p_memsz;
276
    elf_xword p_align;
277
};
278
 
279
/*
938 jermar 280
 * ELF section header
281
 */
282
struct elf32_section_header {
283
    elf_word sh_name;
284
    elf_word sh_type;
285
    elf_word sh_flags;
286
    elf32_addr sh_addr;
287
    elf32_off sh_offset;
288
    elf_word sh_size;
289
    elf_word sh_link;
290
    elf_word sh_info;
291
    elf_word sh_addralign;
292
    elf_word sh_entsize;
293
};
294
struct elf64_section_header {
295
    elf_word sh_name;
296
    elf_word sh_type;
297
    elf_xword sh_flags;
298
    elf64_addr sh_addr;
299
    elf64_off sh_offset;
300
    elf_xword sh_size;
301
    elf_word sh_link;
302
    elf_word sh_info;
303
    elf_xword sh_addralign;
304
    elf_xword sh_entsize;
305
};
306
 
307
/*
308
 * ELF symbol table entry
309
 */
310
struct elf32_symbol {
311
    elf_word st_name;
312
    elf32_addr st_value;
313
    elf_word st_size;
1780 jermar 314
    uint8_t st_info;
315
    uint8_t st_other;
938 jermar 316
    elf_half st_shndx;
317
};
318
struct elf64_symbol {
319
    elf_word st_name;
1780 jermar 320
    uint8_t st_info;
321
    uint8_t st_other;
938 jermar 322
    elf_half st_shndx;
323
    elf64_addr st_value;
324
    elf_xword st_size;
325
};
326
 
327
#ifdef __32_BITS__ 
328
typedef struct elf32_header elf_header_t;
952 jermar 329
typedef struct elf32_segment_header elf_segment_header_t;
938 jermar 330
typedef struct elf32_section_header elf_section_header_t;
331
typedef struct elf32_symbol elf_symbol_t;
854 bondari 332
#endif
938 jermar 333
#ifdef __64_BITS__
334
typedef struct elf64_header elf_header_t;
952 jermar 335
typedef struct elf64_segment_header elf_segment_header_t;
938 jermar 336
typedef struct elf64_section_header elf_section_header_t;
337
typedef struct elf64_symbol elf_symbol_t;
338
#endif
339
 
2745 decky 340
extern char *elf_error(unsigned int rc);
938 jermar 341
 
3222 svoboda 342
/* Interpreter string used to recognize the program loader */
343
#define ELF_INTERP_ZSTR "kernel"
344
#define ELF_INTERP_ZLEN  sizeof(ELF_INTERP_ZSTR)
345
 
938 jermar 346
#endif
1702 cejka 347
 
1819 decky 348
/** @}
1702 cejka 349
 */