dynamic linker bootstrap overhaul
[musl] / src / internal / dynlink.h
1 #ifndef _INTERNAL_RELOC_H
2 #define _INTERNAL_RELOC_H
3
4 #include <features.h>
5 #include <elf.h>
6 #include <stdint.h>
7
8 #if UINTPTR_MAX == 0xffffffff
9 typedef Elf32_Ehdr Ehdr;
10 typedef Elf32_Phdr Phdr;
11 typedef Elf32_Sym Sym;
12 #define R_TYPE(x) ((x)&255)
13 #define R_SYM(x) ((x)>>8)
14 #else
15 typedef Elf64_Ehdr Ehdr;
16 typedef Elf64_Phdr Phdr;
17 typedef Elf64_Sym Sym;
18 #define R_TYPE(x) ((x)&0x7fffffff)
19 #define R_SYM(x) ((x)>>32)
20 #endif
21
22 /* These enum constants provide unmatchable default values for
23  * any relocation type the arch does not use. */
24 enum {
25         REL_NONE = 0,
26         REL_SYMBOLIC = -100,
27         REL_GOT,
28         REL_PLT,
29         REL_RELATIVE,
30         REL_OFFSET,
31         REL_OFFSET32,
32         REL_COPY,
33         REL_SYM_OR_REL,
34         REL_DTPMOD,
35         REL_DTPOFF,
36         REL_TPOFF,
37         REL_TPOFF_NEG,
38         REL_TLSDESC,
39 };
40
41 #include "reloc.h"
42
43 #define IS_RELATIVE(x) ( \
44         (R_TYPE(x) == REL_RELATIVE) || \
45         (R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) )
46
47 #ifndef NEED_MIPS_GOT_RELOCS
48 #define NEED_MIPS_GOT_RELOCS 0
49 #endif
50
51 #define AUX_CNT 32
52 #define DYN_CNT 32
53
54 typedef void (*stage2_func)(unsigned char *);
55 typedef _Noreturn void (*stage3_func)(size_t *);
56
57 #endif