Subversion Repositories HelenOS-historic

Rev

Rev 854 | Rev 952 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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