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,
31 	REL_GOT,
32 	REL_PLT,
33 	REL_RELATIVE,
34 	REL_OFFSET,
35 	REL_OFFSET32,
36 	REL_COPY,
37 	REL_SYM_OR_REL,
38 	REL_DTPMOD,
39 	REL_DTPOFF,
40 	REL_TPOFF,
41 	REL_TPOFF_NEG,
42 	REL_TLSDESC,
43 	REL_FUNCDESC,
44 	REL_FUNCDESC_VAL,
45 };
46 
47 struct fdpic_loadseg {
48 	uintptr_t addr, p_vaddr, p_memsz;
49 };
50 
51 struct fdpic_loadmap {
52 	unsigned short version, nsegs;
53 	struct fdpic_loadseg segs[];
54 };
55 
56 struct fdpic_dummy_loadmap {
57 	unsigned short version, nsegs;
58 	struct fdpic_loadseg segs[1];
59 };
60 
61 #include "reloc.h"
62 
63 #ifndef FDPIC_CONSTDISP_FLAG
64 #define FDPIC_CONSTDISP_FLAG 0
65 #endif
66 
67 #ifndef DL_FDPIC
68 #define DL_FDPIC 0
69 #endif
70 
71 #ifndef DL_NOMMU_SUPPORT
72 #define DL_NOMMU_SUPPORT 0
73 #endif
74 
75 #if !DL_FDPIC
76 #define IS_RELATIVE(x,s) ( \
77 	(R_TYPE(x) == REL_RELATIVE) || \
78 	(R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) )
79 #else
80 #define IS_RELATIVE(x,s) ( ( \
81 	(R_TYPE(x) == REL_FUNCDESC_VAL) || \
82 	(R_TYPE(x) == REL_SYMBOLIC) ) \
83 	&& (((s)[R_SYM(x)].st_info & 0xf) == STT_SECTION) )
84 #endif
85 
86 #ifndef NEED_MIPS_GOT_RELOCS
87 #define NEED_MIPS_GOT_RELOCS 0
88 #endif
89 
90 #ifndef DT_DEBUG_INDIRECT
91 #define DT_DEBUG_INDIRECT 0
92 #endif
93 
94 #define AUX_CNT 32
95 #define DYN_CNT 32
96 
97 typedef void (*stage2_func)(unsigned char *, size_t *);
98 typedef void (*stage3_func)(size_t *);
99 
100 hidden void *__dlsym(void *restrict, const char *restrict, void *restrict);
101 
102 hidden void __dl_seterr(const char *, ...);
103 hidden int __dl_invalid_handle(void *);
104 hidden void __dl_vseterr(const char *, va_list);
105 
106 hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
107 
108 #endif
109