]> git.proxmox.com Git - qemu.git/blame - elf.h
new i386 emulator core
[qemu.git] / elf.h
CommitLineData
31e31b8a
FB
1/*
2 * ELF register definitions..
3 */
4
5#include <inttypes.h>
6
7typedef uint32_t elf_greg_t;
8
01ffc75b 9#define ELF_NGREG (sizeof (struct target_pt_regs) / sizeof(elf_greg_t))
31e31b8a
FB
10typedef elf_greg_t elf_gregset_t[ELF_NGREG];
11
12typedef struct user_i387_struct elf_fpregset_t;
13
14/*
15 * This is used to ensure we don't load something for the wrong architecture.
16 */
17#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
18
19/*
20 * These are used to set parameters in the core dumps.
21 */
22#define ELF_CLASS ELFCLASS32
23#define ELF_DATA ELFDATA2LSB;
24#define ELF_ARCH EM_386
25
26 /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program
27 starts %edx contains a pointer to a function which might be
28 registered using `atexit'. This provides a mean for the
29 dynamic linker to call DT_FINI functions for shared libraries
30 that have been loaded before the code runs.
31
32 A value of 0 tells we have no such handler. */
33#define ELF_PLAT_INIT(_r) _r->edx = 0
34
35#define USE_ELF_CORE_DUMP
36#define ELF_EXEC_PAGESIZE 4096
37
38
39typedef uint32_t Elf32_Addr;
40typedef uint16_t Elf32_Half;
41typedef uint32_t Elf32_Off;
42typedef int32_t Elf32_Sword;
43typedef uint32_t Elf32_Word;
44
45/* These constants are for the segment types stored in the image headers */
46#define PT_NULL 0
47#define PT_LOAD 1
48#define PT_DYNAMIC 2
49#define PT_INTERP 3
50#define PT_NOTE 4
51#define PT_SHLIB 5
52#define PT_PHDR 6
53#define PT_LOPROC 0x70000000
54#define PT_HIPROC 0x7fffffff
55
56/* These constants define the different elf file types */
57#define ET_NONE 0
58#define ET_REL 1
59#define ET_EXEC 2
60#define ET_DYN 3
61#define ET_CORE 4
62#define ET_LOPROC 5
63#define ET_HIPROC 6
64
65/* These constants define the various ELF target machines */
66#define EM_NONE 0
67#define EM_M32 1
68#define EM_SPARC 2
69#define EM_386 3
70#define EM_68K 4
71#define EM_88K 5
72#define EM_486 6 /* Perhaps disused */
73#define EM_860 7
74
75#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */
76
77#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */
78
79#define EM_SPARC64 11 /* SPARC v9 (not official) 64-bit */
80
81#define EM_PARISC 15 /* HPPA */
82
83#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
84
85#define EM_PPC 20 /* PowerPC */
86
87/*
88 * This is an interim value that we will use until the committee comes
89 * up with a final number.
90 */
91#define EM_ALPHA 0x9026
92
93
94/* This is the info that is needed to parse the dynamic section of the file */
95#define DT_NULL 0
96#define DT_NEEDED 1
97#define DT_PLTRELSZ 2
98#define DT_PLTGOT 3
99#define DT_HASH 4
100#define DT_STRTAB 5
101#define DT_SYMTAB 6
102#define DT_RELA 7
103#define DT_RELASZ 8
104#define DT_RELAENT 9
105#define DT_STRSZ 10
106#define DT_SYMENT 11
107#define DT_INIT 12
108#define DT_FINI 13
109#define DT_SONAME 14
110#define DT_RPATH 15
111#define DT_SYMBOLIC 16
112#define DT_REL 17
113#define DT_RELSZ 18
114#define DT_RELENT 19
115#define DT_PLTREL 20
116#define DT_DEBUG 21
117#define DT_TEXTREL 22
118#define DT_JMPREL 23
119#define DT_LOPROC 0x70000000
120#define DT_HIPROC 0x7fffffff
121
122/* This info is needed when parsing the symbol table */
123#define STB_LOCAL 0
124#define STB_GLOBAL 1
125#define STB_WEAK 2
126
127#define STT_NOTYPE 0
128#define STT_OBJECT 1
129#define STT_FUNC 2
130#define STT_SECTION 3
131#define STT_FILE 4
132
133#define ELF32_ST_BIND(x) ((x) >> 4)
134#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
135
136/* Symbolic values for the entries in the auxiliary table
137 put on the initial stack */
138#define AT_NULL 0 /* end of vector */
139#define AT_IGNORE 1 /* entry should be ignored */
140#define AT_EXECFD 2 /* file descriptor of program */
141#define AT_PHDR 3 /* program headers for program */
142#define AT_PHENT 4 /* size of program header entry */
143#define AT_PHNUM 5 /* number of program headers */
144#define AT_PAGESZ 6 /* system page size */
145#define AT_BASE 7 /* base address of interpreter */
146#define AT_FLAGS 8 /* flags */
147#define AT_ENTRY 9 /* entry point of program */
148#define AT_NOTELF 10 /* program is not ELF */
149#define AT_UID 11 /* real uid */
150#define AT_EUID 12 /* effective uid */
151#define AT_GID 13 /* real gid */
152#define AT_EGID 14 /* effective gid */
153
154
155typedef struct dynamic{
156 Elf32_Sword d_tag;
157 union{
158 Elf32_Sword d_val;
159 Elf32_Addr d_ptr;
160 } d_un;
161} Elf32_Dyn;
162
163typedef struct {
164 unsigned long long d_tag; /* entry tag value */
165 union {
166 unsigned long long d_val;
167 unsigned long long d_ptr;
168 } d_un;
169} Elf64_Dyn;
170
171/* The following are used with relocations */
172#define ELF32_R_SYM(x) ((x) >> 8)
173#define ELF32_R_TYPE(x) ((x) & 0xff)
174
175#define R_386_NONE 0
176#define R_386_32 1
177#define R_386_PC32 2
178#define R_386_GOT32 3
179#define R_386_PLT32 4
180#define R_386_COPY 5
181#define R_386_GLOB_DAT 6
182#define R_386_JMP_SLOT 7
183#define R_386_RELATIVE 8
184#define R_386_GOTOFF 9
185#define R_386_GOTPC 10
186#define R_386_NUM 11
187
188typedef struct elf32_rel {
189 Elf32_Addr r_offset;
190 Elf32_Word r_info;
191} Elf32_Rel;
192
193typedef struct elf64_rel {
194 unsigned long long r_offset; /* Location at which to apply the action */
195 unsigned long long r_info; /* index and type of relocation */
196} Elf64_Rel;
197
198typedef struct elf32_rela{
199 Elf32_Addr r_offset;
200 Elf32_Word r_info;
201 Elf32_Sword r_addend;
202} Elf32_Rela;
203
204typedef struct elf64_rela {
205 unsigned long long r_offset; /* Location at which to apply the action */
206 unsigned long long r_info; /* index and type of relocation */
207 unsigned long long r_addend; /* Constant addend used to compute value */
208} Elf64_Rela;
209
210typedef struct elf32_sym{
211 Elf32_Word st_name;
212 Elf32_Addr st_value;
213 Elf32_Word st_size;
214 unsigned char st_info;
215 unsigned char st_other;
216 Elf32_Half st_shndx;
217} Elf32_Sym;
218
219typedef struct elf64_sym {
220 unsigned int st_name; /* Symbol name, index in string tbl */
221 unsigned char st_info; /* Type and binding attributes */
222 unsigned char st_other; /* No defined meaning, 0 */
223 unsigned short st_shndx; /* Associated section index */
224 unsigned long long st_value; /* Value of the symbol */
225 unsigned long long st_size; /* Associated symbol size */
226} Elf64_Sym;
227
228
229#define EI_NIDENT 16
230
231typedef struct elf32_hdr{
232 unsigned char e_ident[EI_NIDENT];
233 Elf32_Half e_type;
234 Elf32_Half e_machine;
235 Elf32_Word e_version;
236 Elf32_Addr e_entry; /* Entry point */
237 Elf32_Off e_phoff;
238 Elf32_Off e_shoff;
239 Elf32_Word e_flags;
240 Elf32_Half e_ehsize;
241 Elf32_Half e_phentsize;
242 Elf32_Half e_phnum;
243 Elf32_Half e_shentsize;
244 Elf32_Half e_shnum;
245 Elf32_Half e_shstrndx;
246} Elf32_Ehdr;
247
248typedef struct elf64_hdr {
249 unsigned char e_ident[16]; /* ELF "magic number" */
250 short int e_type;
251 short unsigned int e_machine;
252 int e_version;
253 unsigned long long e_entry; /* Entry point virtual address */
254 unsigned long long e_phoff; /* Program header table file offset */
255 unsigned long long e_shoff; /* Section header table file offset */
256 int e_flags;
257 short int e_ehsize;
258 short int e_phentsize;
259 short int e_phnum;
260 short int e_shentsize;
261 short int e_shnum;
262 short int e_shstrndx;
263} Elf64_Ehdr;
264
265/* These constants define the permissions on sections in the program
266 header, p_flags. */
267#define PF_R 0x4
268#define PF_W 0x2
269#define PF_X 0x1
270
271typedef struct elf32_phdr{
272 Elf32_Word p_type;
273 Elf32_Off p_offset;
274 Elf32_Addr p_vaddr;
275 Elf32_Addr p_paddr;
276 Elf32_Word p_filesz;
277 Elf32_Word p_memsz;
278 Elf32_Word p_flags;
279 Elf32_Word p_align;
280} Elf32_Phdr;
281
282typedef struct elf64_phdr {
283 int p_type;
284 int p_flags;
285 unsigned long long p_offset; /* Segment file offset */
286 unsigned long long p_vaddr; /* Segment virtual address */
287 unsigned long long p_paddr; /* Segment physical address */
288 unsigned long long p_filesz; /* Segment size in file */
289 unsigned long long p_memsz; /* Segment size in memory */
290 unsigned long long p_align; /* Segment alignment, file & memory */
291} Elf64_Phdr;
292
293/* sh_type */
294#define SHT_NULL 0
295#define SHT_PROGBITS 1
296#define SHT_SYMTAB 2
297#define SHT_STRTAB 3
298#define SHT_RELA 4
299#define SHT_HASH 5
300#define SHT_DYNAMIC 6
301#define SHT_NOTE 7
302#define SHT_NOBITS 8
303#define SHT_REL 9
304#define SHT_SHLIB 10
305#define SHT_DYNSYM 11
306#define SHT_NUM 12
307#define SHT_LOPROC 0x70000000
308#define SHT_HIPROC 0x7fffffff
309#define SHT_LOUSER 0x80000000
310#define SHT_HIUSER 0xffffffff
311
312/* sh_flags */
313#define SHF_WRITE 0x1
314#define SHF_ALLOC 0x2
315#define SHF_EXECINSTR 0x4
316#define SHF_MASKPROC 0xf0000000
317
318/* special section indexes */
319#define SHN_UNDEF 0
320#define SHN_LORESERVE 0xff00
321#define SHN_LOPROC 0xff00
322#define SHN_HIPROC 0xff1f
323#define SHN_ABS 0xfff1
324#define SHN_COMMON 0xfff2
325#define SHN_HIRESERVE 0xffff
326
327typedef struct {
328 Elf32_Word sh_name;
329 Elf32_Word sh_type;
330 Elf32_Word sh_flags;
331 Elf32_Addr sh_addr;
332 Elf32_Off sh_offset;
333 Elf32_Word sh_size;
334 Elf32_Word sh_link;
335 Elf32_Word sh_info;
336 Elf32_Word sh_addralign;
337 Elf32_Word sh_entsize;
338} Elf32_Shdr;
339
340typedef struct elf64_shdr {
341 unsigned int sh_name; /* Section name, index in string tbl */
342 unsigned int sh_type; /* Type of section */
343 unsigned long long sh_flags; /* Miscellaneous section attributes */
344 unsigned long long sh_addr; /* Section virtual addr at execution */
345 unsigned long long sh_offset; /* Section file offset */
346 unsigned long long sh_size; /* Size of section in bytes */
347 unsigned int sh_link; /* Index of another section */
348 unsigned int sh_info; /* Additional section information */
349 unsigned long long sh_addralign; /* Section alignment */
350 unsigned long long sh_entsize; /* Entry size if section holds table */
351} Elf64_Shdr;
352
353#define EI_MAG0 0 /* e_ident[] indexes */
354#define EI_MAG1 1
355#define EI_MAG2 2
356#define EI_MAG3 3
357#define EI_CLASS 4
358#define EI_DATA 5
359#define EI_VERSION 6
360#define EI_PAD 7
361
362#define ELFMAG0 0x7f /* EI_MAG */
363#define ELFMAG1 'E'
364#define ELFMAG2 'L'
365#define ELFMAG3 'F'
366#define ELFMAG "\177ELF"
367#define SELFMAG 4
368
369#define ELFCLASSNONE 0 /* EI_CLASS */
370#define ELFCLASS32 1
371#define ELFCLASS64 2
372#define ELFCLASSNUM 3
373
374#define ELFDATANONE 0 /* e_ident[EI_DATA] */
375#define ELFDATA2LSB 1
376#define ELFDATA2MSB 2
377
378#define EV_NONE 0 /* e_version, EI_VERSION */
379#define EV_CURRENT 1
380#define EV_NUM 2
381
382/* Notes used in ET_CORE */
383#define NT_PRSTATUS 1
384#define NT_PRFPREG 2
385#define NT_PRPSINFO 3
386#define NT_TASKSTRUCT 4
387
388/* Note header in a PT_NOTE section */
389typedef struct elf32_note {
390 Elf32_Word n_namesz; /* Name size */
391 Elf32_Word n_descsz; /* Content size */
392 Elf32_Word n_type; /* Content type */
393} Elf32_Nhdr;
394
395/* Note header in a PT_NOTE section */
396/*
397 * For now we use the 32 bit version of the structure until we figure
398 * out whether we need anything better. Note - on the Alpha, "unsigned int"
399 * is only 32 bits.
400 */
401typedef struct elf64_note {
402 unsigned int n_namesz; /* Name size */
403 unsigned int n_descsz; /* Content size */
404 unsigned int n_type; /* Content type */
405} Elf64_Nhdr;
406
407#define ELF_START_MMAP 0x80000000
408
409#if ELF_CLASS == ELFCLASS32
410
411extern Elf32_Dyn _DYNAMIC [];
412#define elfhdr elf32_hdr
413#define elf_phdr elf32_phdr
414#define elf_note elf32_note
415
416#else
417
418extern Elf64_Dyn _DYNAMIC [];
419#define elfhdr elf64_hdr
420#define elf_phdr elf64_phdr
421#define elf_note elf64_note
422
423#endif
424
425