This source file includes following definitions.
- Elf32_Ehdr
- Elf64_Ehdr
- Elf32_Shdr
- Elf64_Shdr
- Elf32_Sym
- Elf64_Sym
- Elf32_Rel
- Elf32_Rela
- Elf64_Rel
- Elf64_Rela
- Elf32_Phdr
- Elf64_Phdr
- Elf32_Dyn
- Elf64_Dyn
- Elf32_Note
- Elf64_Note
- Aux32Info
- Aux64Info
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #ifndef _SYS_EXEC_ELF_H_
34 #define _SYS_EXEC_ELF_H_
35
36 #include <machine/_types.h>
37 #include <machine/exec.h>
38
39 typedef __uint8_t Elf_Byte;
40
41 typedef __uint32_t Elf32_Addr;
42 typedef __uint32_t Elf32_Off;
43 typedef __int32_t Elf32_Sword;
44 typedef __uint32_t Elf32_Word;
45 typedef __uint16_t Elf32_Half;
46
47 typedef __uint64_t Elf64_Addr;
48 typedef __uint64_t Elf64_Off;
49 typedef __int32_t Elf64_Shalf;
50
51 #ifdef __alpha__
52 typedef __int64_t Elf64_Sword;
53 typedef __uint64_t Elf64_Word;
54 #else
55 typedef __int32_t Elf64_Sword;
56 typedef __uint32_t Elf64_Word;
57 #endif
58
59 typedef __int64_t Elf64_Sxword;
60 typedef __uint64_t Elf64_Xword;
61
62 typedef __uint32_t Elf64_Half;
63 typedef __uint16_t Elf64_Quarter;
64
65
66
67
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
74 #define EI_DATA 5
75 #define EI_VERSION 6
76 #define EI_OSABI 7
77 #define EI_ABIVERSION 8
78 #define EI_PAD 9
79 #define EI_NIDENT 16
80
81
82 #define ELFMAG0 0x7f
83 #define ELFMAG1 'E'
84 #define ELFMAG2 'L'
85 #define ELFMAG3 'F'
86 #define ELFMAG "\177ELF"
87 #define SELFMAG 4
88
89
90 #define ELFCLASSNONE 0
91 #define ELFCLASS32 1
92 #define ELFCLASS64 2
93 #define ELFCLASSNUM 3
94
95
96 #define ELFDATANONE 0
97 #define ELFDATA2LSB 1
98 #define ELFDATA2MSB 2
99 #define ELFDATANUM 3
100
101
102 #define ELFOSABI_SYSV 0
103 #define ELFOSABI_HPUX 1
104 #define ELFOSABI_NETBSD 2
105 #define ELFOSABI_LINUX 3
106 #define ELFOSABI_HURD 4
107 #define ELFOSABI_86OPEN 5
108 #define ELFOSABI_SOLARIS 6
109 #define ELFOSABI_MONTEREY 7
110 #define ELFOSABI_IRIX 8
111 #define ELFOSABI_FREEBSD 9
112 #define ELFOSABI_TRU64 10
113 #define ELFOSABI_MODESTO 11
114 #define ELFOSABI_OPENBSD 12
115 #define ELFOSABI_ARM 97
116 #define ELFOSABI_STANDALONE 255
117
118
119 #define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
120 (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
121 (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
122 (ehdr).e_ident[EI_MAG3] == ELFMAG3)
123
124
125 typedef struct elfhdr {
126 unsigned char e_ident[EI_NIDENT];
127 Elf32_Half e_type;
128 Elf32_Half e_machine;
129 Elf32_Word e_version;
130 Elf32_Addr e_entry;
131 Elf32_Off e_phoff;
132 Elf32_Off e_shoff;
133 Elf32_Word e_flags;
134 Elf32_Half e_ehsize;
135 Elf32_Half e_phentsize;
136 Elf32_Half e_phnum;
137 Elf32_Half e_shentsize;
138 Elf32_Half e_shnum;
139 Elf32_Half e_shstrndx;
140
141 } Elf32_Ehdr;
142
143 typedef struct {
144 unsigned char e_ident[EI_NIDENT];
145 Elf64_Quarter e_type;
146 Elf64_Quarter e_machine;
147 Elf64_Half e_version;
148 Elf64_Addr e_entry;
149 Elf64_Off e_phoff;
150 Elf64_Off e_shoff;
151 Elf64_Half e_flags;
152 Elf64_Quarter e_ehsize;
153 Elf64_Quarter e_phentsize;
154 Elf64_Quarter e_phnum;
155 Elf64_Quarter e_shentsize;
156 Elf64_Quarter e_shnum;
157 Elf64_Quarter e_shstrndx;
158 } Elf64_Ehdr;
159
160
161 #define ET_NONE 0
162 #define ET_REL 1
163 #define ET_EXEC 2
164 #define ET_DYN 3
165 #define ET_CORE 4
166 #define ET_NUM 5
167 #define ET_LOPROC 0xff00
168 #define ET_HIPROC 0xffff
169
170
171 #define EM_NONE 0
172 #define EM_M32 1
173 #define EM_SPARC 2
174 #define EM_386 3
175 #define EM_68K 4
176 #define EM_88K 5
177 #define EM_486 6
178 #define EM_860 7
179 #define EM_MIPS 8
180
181
182
183
184
185 #define EM_MIPS_RS4_BE 10
186 #define EM_SPARC64 11
187 #define EM_PARISC 15
188 #define EM_SPARC32PLUS 18
189 #define EM_PPC 20
190 #define EM_ARM 40
191 #define EM_ALPHA 41
192 #define EM_SH 42
193 #define EM_SPARCV9 43
194 #define EM_ALPHA_EXP 0x9026
195 #define EM_AMD64 62
196 #define EM_VAX 75
197 #define EM_NUM 15
198
199
200 #define EV_NONE 0
201 #define EV_CURRENT 1
202 #define EV_NUM 2
203
204
205 typedef struct {
206 Elf32_Word sh_name;
207
208 Elf32_Word sh_type;
209 Elf32_Word sh_flags;
210 Elf32_Addr sh_addr;
211 Elf32_Off sh_offset;
212 Elf32_Word sh_size;
213 Elf32_Word sh_link;
214 Elf32_Word sh_info;
215 Elf32_Word sh_addralign;
216 Elf32_Word sh_entsize;
217 } Elf32_Shdr;
218
219 typedef struct {
220 Elf64_Half sh_name;
221 Elf64_Half sh_type;
222 Elf64_Xword sh_flags;
223 Elf64_Addr sh_addr;
224 Elf64_Off sh_offset;
225 Elf64_Xword sh_size;
226 Elf64_Half sh_link;
227 Elf64_Half sh_info;
228 Elf64_Xword sh_addralign;
229 Elf64_Xword sh_entsize;
230 } Elf64_Shdr;
231
232
233 #define SHN_UNDEF 0
234 #define SHN_LORESERVE 0xff00
235 #define SHN_LOPROC 0xff00
236 #define SHN_HIPROC 0xff1f
237 #define SHN_ABS 0xfff1
238 #define SHN_COMMON 0xfff2
239 #define SHN_HIRESERVE 0xffff
240
241
242 #define SHT_NULL 0
243 #define SHT_PROGBITS 1
244 #define SHT_SYMTAB 2
245 #define SHT_STRTAB 3
246 #define SHT_RELA 4
247 #define SHT_HASH 5
248 #define SHT_DYNAMIC 6
249 #define SHT_NOTE 7
250 #define SHT_NOBITS 8
251 #define SHT_REL 9
252 #define SHT_SHLIB 10
253 #define SHT_DYNSYM 11
254 #define SHT_NUM 12
255 #define SHT_LOPROC 0x70000000
256 #define SHT_HIPROC 0x7fffffff
257 #define SHT_LOUSER 0x80000000
258 #define SHT_HIUSER 0xffffffff
259
260
261 #define ELF_BSS ".bss"
262 #define ELF_DATA ".data"
263 #define ELF_DEBUG ".debug"
264 #define ELF_DYNAMIC ".dynamic"
265 #define ELF_DYNSTR ".dynstr"
266 #define ELF_DYNSYM ".dynsym"
267 #define ELF_FINI ".fini"
268 #define ELF_GOT ".got"
269 #define ELF_HASH ".hash"
270 #define ELF_INIT ".init"
271 #define ELF_REL_DATA ".rel.data"
272 #define ELF_REL_FINI ".rel.fini"
273 #define ELF_REL_INIT ".rel.init"
274 #define ELF_REL_DYN ".rel.dyn"
275 #define ELF_REL_RODATA ".rel.rodata"
276 #define ELF_REL_TEXT ".rel.text"
277 #define ELF_RODATA ".rodata"
278 #define ELF_SHSTRTAB ".shstrtab"
279 #define ELF_STRTAB ".strtab"
280 #define ELF_SYMTAB ".symtab"
281 #define ELF_TEXT ".text"
282
283
284
285 #define SHF_WRITE 0x1
286 #define SHF_ALLOC 0x2
287 #define SHF_EXECINSTR 0x4
288 #define SHF_MASKPROC 0xf0000000
289
290
291
292 typedef struct elf32_sym {
293 Elf32_Word st_name;
294 Elf32_Addr st_value;
295 Elf32_Word st_size;
296 unsigned char st_info;
297 unsigned char st_other;
298 Elf32_Half st_shndx;
299 } Elf32_Sym;
300
301 typedef struct {
302 Elf64_Half st_name;
303 Elf_Byte st_info;
304 Elf_Byte st_other;
305 Elf64_Quarter st_shndx;
306 Elf64_Xword st_value;
307 Elf64_Xword st_size;
308 } Elf64_Sym;
309
310
311 #define STN_UNDEF 0
312
313
314 #define ELF32_ST_BIND(x) ((x) >> 4)
315 #define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
316 #define ELF32_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf))
317
318 #define ELF64_ST_BIND(x) ((x) >> 4)
319 #define ELF64_ST_TYPE(x) (((unsigned int) x) & 0xf)
320 #define ELF64_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf))
321
322
323 #define STB_LOCAL 0
324 #define STB_GLOBAL 1
325 #define STB_WEAK 2
326 #define STB_NUM 3
327 #define STB_LOPROC 13
328 #define STB_HIPROC 15
329
330
331 #define STT_NOTYPE 0
332 #define STT_OBJECT 1
333 #define STT_FUNC 2
334 #define STT_SECTION 3
335 #define STT_FILE 4
336 #define STT_NUM 5
337 #define STT_LOPROC 13
338 #define STT_HIPROC 15
339
340
341 typedef struct {
342 Elf32_Addr r_offset;
343 Elf32_Word r_info;
344 } Elf32_Rel;
345
346
347 typedef struct {
348 Elf32_Addr r_offset;
349 Elf32_Word r_info;
350 Elf32_Sword r_addend;
351 } Elf32_Rela;
352
353
354 #define ELF32_R_SYM(i) ((i) >> 8)
355 #define ELF32_R_TYPE(i) ((unsigned char) (i))
356 #define ELF32_R_INFO(s,t) (((s) << 8) + (unsigned char)(t))
357
358 typedef struct {
359 Elf64_Xword r_offset;
360 Elf64_Xword r_info;
361 } Elf64_Rel;
362
363 typedef struct {
364 Elf64_Xword r_offset;
365 Elf64_Xword r_info;
366 Elf64_Sxword r_addend;
367 } Elf64_Rela;
368
369 #define ELF64_R_SYM(info) ((info) >> 32)
370 #define ELF64_R_TYPE(info) ((info) & 0xFFFFFFFF)
371 #define ELF64_R_INFO(s,t) (((s) << 32) + (__uint32_t)(t))
372
373
374 typedef struct {
375 Elf32_Word p_type;
376 Elf32_Off p_offset;
377 Elf32_Addr p_vaddr;
378 Elf32_Addr p_paddr;
379 Elf32_Word p_filesz;
380 Elf32_Word p_memsz;
381 Elf32_Word p_flags;
382 Elf32_Word p_align;
383 } Elf32_Phdr;
384
385 typedef struct {
386 Elf64_Half p_type;
387 Elf64_Half p_flags;
388 Elf64_Off p_offset;
389 Elf64_Addr p_vaddr;
390 Elf64_Addr p_paddr;
391 Elf64_Xword p_filesz;
392 Elf64_Xword p_memsz;
393 Elf64_Xword p_align;
394 } Elf64_Phdr;
395
396
397 #define PT_NULL 0
398 #define PT_LOAD 1
399 #define PT_DYNAMIC 2
400 #define PT_INTERP 3
401 #define PT_NOTE 4
402 #define PT_SHLIB 5
403 #define PT_PHDR 6
404 #define PT_NUM 7
405 #define PT_LOOS 0x60000000
406 #define PT_HIOS 0x6fffffff
407 #define PT_LOPROC 0x70000000
408 #define PT_HIPROC 0x7fffffff
409
410
411 #define PF_X 0x1
412 #define PF_W 0x2
413 #define PF_R 0x4
414 #define PF_MASKPROC 0xf0000000
415
416
417
418 typedef struct {
419 Elf32_Sword d_tag;
420 union {
421 Elf32_Word d_val;
422 Elf32_Addr d_ptr;
423 } d_un;
424 } Elf32_Dyn;
425
426 typedef struct {
427 Elf64_Xword d_tag;
428 union {
429 Elf64_Addr d_ptr;
430 Elf64_Xword d_val;
431 } d_un;
432 } Elf64_Dyn;
433
434
435 #define DT_NULL 0
436 #define DT_NEEDED 1
437 #define DT_PLTRELSZ 2
438 #define DT_PLTGOT 3
439 #define DT_HASH 4
440 #define DT_STRTAB 5
441 #define DT_SYMTAB 6
442 #define DT_RELA 7
443 #define DT_RELASZ 8
444 #define DT_RELAENT 9
445 #define DT_STRSZ 10
446 #define DT_SYMENT 11
447 #define DT_INIT 12
448 #define DT_FINI 13
449 #define DT_SONAME 14
450 #define DT_RPATH 15
451
452 #define DT_SYMBOLIC 16
453 #define DT_REL 17
454 #define DT_RELSZ 18
455 #define DT_RELENT 19
456 #define DT_PLTREL 20
457 #define DT_DEBUG 21
458 #define DT_TEXTREL 22
459 #define DT_JMPREL 23
460 #define DT_BIND_NOW 24
461 #define DT_NUM 25
462 #define DT_LOPROC 0x70000000
463 #define DT_HIPROC 0x7fffffff
464
465
466 unsigned int elf_hash(const unsigned char *name);
467
468
469
470
471 typedef struct {
472 Elf32_Word namesz;
473 Elf32_Word descsz;
474 Elf32_Word type;
475 } Elf32_Note;
476
477 typedef struct {
478 Elf64_Half namesz;
479 Elf64_Half descsz;
480 Elf64_Half type;
481 } Elf64_Note;
482
483
484
485
486 #if defined(_KERNEL) || defined(_DYN_LOADER)
487
488 #define ELF32_NO_ADDR ((uint32_t) ~0)
489 #define ELF_AUX_ENTRIES 8
490
491 typedef struct {
492 Elf32_Sword au_id;
493 Elf32_Word au_v;
494 } Aux32Info;
495
496 #define ELF64_NO_ADDR ((__uint64_t) ~0)
497 #define ELF64_AUX_ENTRIES 8
498
499 typedef struct {
500 Elf64_Shalf au_id;
501 Elf64_Xword au_v;
502 } Aux64Info;
503
504 enum AuxID {
505 AUX_null = 0,
506 AUX_ignore = 1,
507 AUX_execfd = 2,
508 AUX_phdr = 3,
509 AUX_phent = 4,
510 AUX_phnum = 5,
511 AUX_pagesz = 6,
512 AUX_base = 7,
513 AUX_flags = 8,
514 AUX_entry = 9,
515 AUX_sun_uid = 2000,
516 AUX_sun_ruid = 2001,
517 AUX_sun_gid = 2002,
518 AUX_sun_rgid = 2003
519 };
520
521 struct elf_args {
522 u_long arg_entry;
523 u_long arg_interp;
524 u_long arg_phaddr;
525 u_long arg_phentsize;
526 u_long arg_phnum;
527 u_long arg_os;
528 };
529
530 #endif
531
532 #if !defined(ELFSIZE) && defined(ARCH_ELFSIZE)
533 #define ELFSIZE ARCH_ELFSIZE
534 #endif
535
536 #if defined(ELFSIZE)
537 #define CONCAT(x,y) __CONCAT(x,y)
538 #define ELFNAME(x) CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
539 #define ELFNAME2(x,y) CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
540 #define ELFNAMEEND(x) CONCAT(x,CONCAT(_elf,ELFSIZE))
541 #define ELFDEFNNAME(x) CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
542 #endif
543
544 #if defined(ELFSIZE) && (ELFSIZE == 32)
545 #define Elf_Ehdr Elf32_Ehdr
546 #define Elf_Phdr Elf32_Phdr
547 #define Elf_Shdr Elf32_Shdr
548 #define Elf_Sym Elf32_Sym
549 #define Elf_Rel Elf32_Rel
550 #define Elf_RelA Elf32_Rela
551 #define Elf_Dyn Elf32_Dyn
552 #define Elf_Half Elf32_Half
553 #define Elf_Word Elf32_Word
554 #define Elf_Sword Elf32_Sword
555 #define Elf_Addr Elf32_Addr
556 #define Elf_Off Elf32_Off
557 #define Elf_Nhdr Elf32_Nhdr
558 #define Elf_Note Elf32_Note
559
560 #define ELF_R_SYM ELF32_R_SYM
561 #define ELF_R_TYPE ELF32_R_TYPE
562 #define ELF_R_INFO ELF32_R_INFO
563 #define ELFCLASS ELFCLASS32
564
565 #define ELF_ST_BIND ELF32_ST_BIND
566 #define ELF_ST_TYPE ELF32_ST_TYPE
567 #define ELF_ST_INFO ELF32_ST_INFO
568
569 #define AuxInfo Aux32Info
570 #elif defined(ELFSIZE) && (ELFSIZE == 64)
571 #define Elf_Ehdr Elf64_Ehdr
572 #define Elf_Phdr Elf64_Phdr
573 #define Elf_Shdr Elf64_Shdr
574 #define Elf_Sym Elf64_Sym
575 #define Elf_Rel Elf64_Rel
576 #define Elf_RelA Elf64_Rela
577 #define Elf_Dyn Elf64_Dyn
578 #define Elf_Half Elf64_Half
579 #define Elf_Word Elf64_Word
580 #define Elf_Sword Elf64_Sword
581 #define Elf_Addr Elf64_Addr
582 #define Elf_Off Elf64_Off
583 #define Elf_Nhdr Elf64_Nhdr
584 #define Elf_Note Elf64_Note
585
586 #define ELF_R_SYM ELF64_R_SYM
587 #define ELF_R_TYPE ELF64_R_TYPE
588 #define ELF_R_INFO ELF64_R_INFO
589 #define ELFCLASS ELFCLASS64
590
591 #define ELF_ST_BIND ELF64_ST_BIND
592 #define ELF_ST_TYPE ELF64_ST_TYPE
593 #define ELF_ST_INFO ELF64_ST_INFO
594
595 #define AuxInfo Aux64Info
596 #endif
597
598 #ifndef _KERNEL
599 extern Elf_Dyn _DYNAMIC[];
600 #endif
601
602 #ifdef _KERNEL
603 #ifdef _KERN_DO_ELF64
604 int exec_elf64_makecmds(struct proc *, struct exec_package *);
605 void *elf64_copyargs(struct exec_package *, struct ps_strings *,
606 void *, void *);
607 int exec_elf64_fixup(struct proc *, struct exec_package *);
608 char *elf64_check_brand(Elf64_Ehdr *);
609 int elf64_os_pt_note(struct proc *, struct exec_package *, Elf64_Ehdr *,
610 char *, size_t, size_t);
611 #endif
612 #ifdef _KERN_DO_ELF
613 int exec_elf32_makecmds(struct proc *, struct exec_package *);
614 void *elf32_copyargs(struct exec_package *, struct ps_strings *,
615 void *, void *);
616 int exec_elf32_fixup(struct proc *, struct exec_package *);
617 char *elf32_check_brand(Elf32_Ehdr *);
618 int elf32_os_pt_note(struct proc *, struct exec_package *, Elf32_Ehdr *,
619 char *, size_t, size_t);
620 #endif
621
622 #endif
623
624 #define ELF_TARG_VER 1
625
626 #endif