]>
Commit | Line | Data |
---|---|---|
320054e8 DG |
1 | #ifndef _INTERNAL_RELOC_H |
2 | #define _INTERNAL_RELOC_H | |
3 | ||
4 | #include <features.h> | |
5 | #include <elf.h> | |
6 | #include <stdint.h> | |
7 | #include <stddef.h> | |
8 | #include <stdarg.h> | |
9 | ||
10 | #if UINTPTR_MAX == 0xffffffff | |
11 | typedef Elf32_Ehdr Ehdr; | |
12 | typedef Elf32_Phdr Phdr; | |
13 | typedef Elf32_Sym Sym; | |
14 | #define R_TYPE(x) ((x)&255) | |
15 | #define R_SYM(x) ((x)>>8) | |
16 | #define R_INFO ELF32_R_INFO | |
17 | #else | |
18 | typedef Elf64_Ehdr Ehdr; | |
19 | typedef Elf64_Phdr Phdr; | |
20 | typedef Elf64_Sym Sym; | |
21 | #define R_TYPE(x) ((x)&0x7fffffff) | |
22 | #define R_SYM(x) ((x)>>32) | |
23 | #define R_INFO ELF64_R_INFO | |
24 | #endif | |
25 | ||
26 | /* These enum constants provide unmatchable default values for | |
27 | * any relocation type the arch does not use. */ | |
28 | enum { | |
29 | REL_NONE = 0, | |
30 | REL_SYMBOLIC = -100, | |
79a9b408 | 31 | REL_USYMBOLIC, |
320054e8 DG |
32 | REL_GOT, |
33 | REL_PLT, | |
34 | REL_RELATIVE, | |
35 | REL_OFFSET, | |
36 | REL_OFFSET32, | |
37 | REL_COPY, | |
38 | REL_SYM_OR_REL, | |
39 | REL_DTPMOD, | |
40 | REL_DTPOFF, | |
41 | REL_TPOFF, | |
42 | REL_TPOFF_NEG, | |
43 | REL_TLSDESC, | |
44 | REL_FUNCDESC, | |
45 | REL_FUNCDESC_VAL, | |
46 | }; | |
47 | ||
48 | struct fdpic_loadseg { | |
49 | uintptr_t addr, p_vaddr, p_memsz; | |
50 | }; | |
51 | ||
52 | struct fdpic_loadmap { | |
53 | unsigned short version, nsegs; | |
54 | struct fdpic_loadseg segs[]; | |
55 | }; | |
56 | ||
57 | struct fdpic_dummy_loadmap { | |
58 | unsigned short version, nsegs; | |
59 | struct fdpic_loadseg segs[1]; | |
60 | }; | |
61 | ||
62 | #include "reloc.h" | |
63 | ||
64 | #ifndef FDPIC_CONSTDISP_FLAG | |
65 | #define FDPIC_CONSTDISP_FLAG 0 | |
66 | #endif | |
67 | ||
68 | #ifndef DL_FDPIC | |
69 | #define DL_FDPIC 0 | |
70 | #endif | |
71 | ||
72 | #ifndef DL_NOMMU_SUPPORT | |
73 | #define DL_NOMMU_SUPPORT 0 | |
74 | #endif | |
75 | ||
76 | #if !DL_FDPIC | |
77 | #define IS_RELATIVE(x,s) ( \ | |
78 | (R_TYPE(x) == REL_RELATIVE) || \ | |
79 | (R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) ) | |
80 | #else | |
81 | #define IS_RELATIVE(x,s) ( ( \ | |
82 | (R_TYPE(x) == REL_FUNCDESC_VAL) || \ | |
83 | (R_TYPE(x) == REL_SYMBOLIC) ) \ | |
84 | && (((s)[R_SYM(x)].st_info & 0xf) == STT_SECTION) ) | |
85 | #endif | |
86 | ||
87 | #ifndef NEED_MIPS_GOT_RELOCS | |
88 | #define NEED_MIPS_GOT_RELOCS 0 | |
89 | #endif | |
90 | ||
91 | #ifndef DT_DEBUG_INDIRECT | |
92 | #define DT_DEBUG_INDIRECT 0 | |
93 | #endif | |
94 | ||
95 | #define AUX_CNT 32 | |
96 | #define DYN_CNT 32 | |
97 | ||
98 | typedef void (*stage2_func)(unsigned char *, size_t *); | |
d4db3fa2 | 99 | typedef void (*stage3_func)(size_t *); |
320054e8 DG |
100 | |
101 | hidden void *__dlsym(void *restrict, const char *restrict, void *restrict); | |
102 | ||
103 | hidden void __dl_seterr(const char *, ...); | |
104 | hidden int __dl_invalid_handle(void *); | |
105 | hidden void __dl_vseterr(const char *, va_list); | |
106 | ||
107 | hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic(); | |
108 | ||
109 | #endif |