~galfy/helenos/bird-port-mainline

« back to all changes in this revision

Viewing changes to uspace/srv/loader/include/elf.h

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 ELF_H_
 
36
#define ELF_H_
 
37
 
 
38
#include <arch/elf.h>
 
39
#include <sys/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_TLS                 0x400
 
148
#define SHF_MASKPROC            0xf0000000
 
149
 
 
150
/**
 
151
 * Symbol binding
 
152
 */
 
153
#define STB_LOCAL               0
 
154
#define STB_GLOBAL              1
 
155
#define STB_WEAK                2
 
156
#define STB_LOPROC              13
 
157
#define STB_HIPROC              15
 
158
 
 
159
/**
 
160
 * Symbol types
 
161
 */
 
162
#define STT_NOTYPE              0
 
163
#define STT_OBJECT              1
 
164
#define STT_FUNC                2
 
165
#define STT_SECTION             3
 
166
#define STT_FILE                4
 
167
#define STT_LOPROC              13
 
168
#define STT_HIPROC              15
 
169
 
 
170
/**
 
171
 * Program segment types
 
172
 */
 
173
#define PT_NULL                 0
 
174
#define PT_LOAD                 1
 
175
#define PT_DYNAMIC              2
 
176
#define PT_INTERP               3
 
177
#define PT_NOTE                 4
 
178
#define PT_SHLIB                5
 
179
#define PT_PHDR                 6
 
180
#define PT_LOPROC               0x70000000
 
181
#define PT_HIPROC               0x7fffffff
 
182
 
 
183
/**
 
184
 * Program segment attributes.
 
185
 */
 
186
#define PF_X    1
 
187
#define PF_W    2
 
188
#define PF_R    4
 
189
 
 
190
/**
 
191
 * ELF data types
 
192
 *
 
193
 * These types are found to be identical in both 32-bit and 64-bit
 
194
 * ELF object file specifications. They are the only types used
 
195
 * in ELF header.
 
196
 */
 
197
typedef uint64_t elf_xword;
 
198
typedef int64_t elf_sxword;
 
199
typedef uint32_t elf_word;
 
200
typedef int32_t elf_sword;
 
201
typedef uint16_t elf_half;
 
202
 
 
203
/**
 
204
 * 32-bit ELF data types.
 
205
 *
 
206
 * These types are specific for 32-bit format.
 
207
 */
 
208
typedef uint32_t elf32_addr;
 
209
typedef uint32_t elf32_off;
 
210
 
 
211
/**
 
212
 * 64-bit ELF data types.
 
213
 *
 
214
 * These types are specific for 64-bit format.
 
215
 */
 
216
typedef uint64_t elf64_addr;
 
217
typedef uint64_t elf64_off;
 
218
 
 
219
/** ELF header */
 
220
struct elf32_header {
 
221
        uint8_t e_ident[EI_NIDENT];
 
222
        elf_half e_type;
 
223
        elf_half e_machine;
 
224
        elf_word e_version;
 
225
        elf32_addr e_entry;
 
226
        elf32_off e_phoff;
 
227
        elf32_off e_shoff;
 
228
        elf_word e_flags;
 
229
        elf_half e_ehsize;
 
230
        elf_half e_phentsize;
 
231
        elf_half e_phnum;
 
232
        elf_half e_shentsize;
 
233
        elf_half e_shnum;
 
234
        elf_half e_shstrndx;
 
235
};
 
236
struct elf64_header {
 
237
        uint8_t e_ident[EI_NIDENT];
 
238
        elf_half e_type;
 
239
        elf_half e_machine;
 
240
        elf_word e_version;
 
241
        elf64_addr e_entry;
 
242
        elf64_off e_phoff;
 
243
        elf64_off e_shoff;
 
244
        elf_word e_flags;
 
245
        elf_half e_ehsize;
 
246
        elf_half e_phentsize;
 
247
        elf_half e_phnum;
 
248
        elf_half e_shentsize;
 
249
        elf_half e_shnum;
 
250
        elf_half e_shstrndx;
 
251
};
 
252
 
 
253
/*
 
254
 * ELF segment header.
 
255
 * Segments headers are also known as program headers.
 
256
 */
 
257
struct elf32_segment_header {
 
258
        elf_word p_type;
 
259
        elf32_off p_offset;
 
260
        elf32_addr p_vaddr;
 
261
        elf32_addr p_paddr;
 
262
        elf_word p_filesz;
 
263
        elf_word p_memsz;
 
264
        elf_word p_flags;
 
265
        elf_word p_align;
 
266
};
 
267
struct elf64_segment_header {
 
268
        elf_word p_type;
 
269
        elf_word p_flags;
 
270
        elf64_off p_offset;
 
271
        elf64_addr p_vaddr;
 
272
        elf64_addr p_paddr;
 
273
        elf_xword p_filesz;
 
274
        elf_xword p_memsz;
 
275
        elf_xword p_align;
 
276
};
 
277
 
 
278
/*
 
279
 * ELF section header
 
280
 */
 
281
struct elf32_section_header {
 
282
        elf_word sh_name;
 
283
        elf_word sh_type;
 
284
        elf_word sh_flags;
 
285
        elf32_addr sh_addr;
 
286
        elf32_off sh_offset;
 
287
        elf_word sh_size;
 
288
        elf_word sh_link;
 
289
        elf_word sh_info;
 
290
        elf_word sh_addralign;
 
291
        elf_word sh_entsize;
 
292
};
 
293
struct elf64_section_header {
 
294
        elf_word sh_name;
 
295
        elf_word sh_type;
 
296
        elf_xword sh_flags;
 
297
        elf64_addr sh_addr;
 
298
        elf64_off sh_offset;
 
299
        elf_xword sh_size;
 
300
        elf_word sh_link;
 
301
        elf_word sh_info;
 
302
        elf_xword sh_addralign;
 
303
        elf_xword sh_entsize;
 
304
};
 
305
 
 
306
/*
 
307
 * ELF symbol table entry
 
308
 */
 
309
struct elf32_symbol {
 
310
        elf_word st_name;
 
311
        elf32_addr st_value;
 
312
        elf_word st_size;
 
313
        uint8_t st_info;
 
314
        uint8_t st_other;
 
315
        elf_half st_shndx;
 
316
};
 
317
struct elf64_symbol {
 
318
        elf_word st_name;
 
319
        uint8_t st_info;
 
320
        uint8_t st_other;
 
321
        elf_half st_shndx;
 
322
        elf64_addr st_value;
 
323
        elf_xword st_size;
 
324
};
 
325
 
 
326
#ifdef __32_BITS__ 
 
327
typedef struct elf32_header elf_header_t;
 
328
typedef struct elf32_segment_header elf_segment_header_t;
 
329
typedef struct elf32_section_header elf_section_header_t;
 
330
typedef struct elf32_symbol elf_symbol_t;
 
331
#endif
 
332
#ifdef __64_BITS__
 
333
typedef struct elf64_header elf_header_t;
 
334
typedef struct elf64_segment_header elf_segment_header_t;
 
335
typedef struct elf64_section_header elf_section_header_t;
 
336
typedef struct elf64_symbol elf_symbol_t;
 
337
#endif
 
338
 
 
339
extern char *elf_error(unsigned int rc);
 
340
 
 
341
#endif
 
342
 
 
343
/** @}
 
344
 */