• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 typedef Elf32_Verdaux Verdaux;
15 typedef Elf32_Verdef Verdef;
16 typedef Elf32_Vernaux Vernaux;
17 typedef Elf32_Verneed Verneed;
18 #define R_TYPE(x) ((x)&255)
19 #define R_SYM(x) ((x)>>8)
20 #define R_INFO ELF32_R_INFO
21 #else
22 typedef Elf64_Ehdr Ehdr;
23 typedef Elf64_Phdr Phdr;
24 typedef Elf64_Sym Sym;
25 typedef Elf64_Verdaux Verdaux;
26 typedef Elf64_Verdef Verdef;
27 typedef Elf64_Vernaux Vernaux;
28 typedef Elf64_Verneed Verneed;
29 #define R_TYPE(x) ((x)&0x7fffffff)
30 #define R_SYM(x) ((x)>>32)
31 #define R_INFO ELF64_R_INFO
32 #endif
33 
34 /* These enum constants provide unmatchable default values for
35  * any relocation type the arch does not use. */
36 enum {
37 	REL_NONE = 0,
38 	REL_SYMBOLIC = -100,
39 	REL_USYMBOLIC,
40 	REL_GOT,
41 	REL_PLT,
42 	REL_RELATIVE,
43 	REL_OFFSET,
44 	REL_OFFSET32,
45 	REL_COPY,
46 	REL_SYM_OR_REL,
47 	REL_DTPMOD,
48 	REL_DTPOFF,
49 	REL_TPOFF,
50 	REL_TPOFF_NEG,
51 	REL_TLSDESC,
52 	REL_FUNCDESC,
53 	REL_FUNCDESC_VAL,
54 };
55 
56 struct fdpic_loadseg {
57 	uintptr_t addr, p_vaddr, p_memsz;
58 };
59 
60 struct fdpic_loadmap {
61 	unsigned short version, nsegs;
62 	struct fdpic_loadseg segs[];
63 };
64 
65 struct fdpic_dummy_loadmap {
66 	unsigned short version, nsegs;
67 	struct fdpic_loadseg segs[1];
68 };
69 
70 #include "reloc.h"
71 
72 #ifndef FDPIC_CONSTDISP_FLAG
73 #define FDPIC_CONSTDISP_FLAG 0
74 #endif
75 
76 #ifndef DL_FDPIC
77 #define DL_FDPIC 0
78 #endif
79 
80 #ifndef DL_NOMMU_SUPPORT
81 #define DL_NOMMU_SUPPORT 0
82 #endif
83 
84 #if !DL_FDPIC
85 #define IS_RELATIVE(x,s) ( \
86 	(R_TYPE(x) == REL_RELATIVE) || \
87 	(R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) )
88 #else
89 #define IS_RELATIVE(x,s) ( ( \
90 	(R_TYPE(x) == REL_FUNCDESC_VAL) || \
91 	(R_TYPE(x) == REL_SYMBOLIC) ) \
92 	&& (((s)[R_SYM(x)].st_info & 0xf) == STT_SECTION) )
93 #endif
94 
95 #ifndef NEED_MIPS_GOT_RELOCS
96 #define NEED_MIPS_GOT_RELOCS 0
97 #endif
98 
99 #ifndef DT_DEBUG_INDIRECT
100 #define DT_DEBUG_INDIRECT 0
101 #endif
102 
103 #define AUX_CNT 32
104 #define DYN_CNT 37
105 
106 #define DT_ANDROID_REL (DT_LOOS + 2)
107 #define DT_ANDROID_RELSZ (DT_LOOS + 3)
108 
109 #define DT_ANDROID_RELA (DT_LOOS + 4)
110 #define DT_ANDROID_RELASZ (DT_LOOS + 5)
111 
112 #define ANDROID_REL_SIGN_SIZE 4
113 
114 #define RELOCATION_GROUPED_BY_INFO_FLAG 1
115 #define RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG 2
116 #define RELOCATION_GROUPED_BY_ADDEND_FLAG 4
117 #define RELOCATION_GROUP_HAS_ADDEND_FLAG 8
118 
119 typedef void (*stage2_func)(unsigned char *, size_t *);
120 
121 hidden void *__dlsym(void *restrict, const char *restrict, void *restrict);
122 hidden void *__dlvsym(void *restrict, const char *restrict, const char *restrict, void *restrict);
123 hidden int __dlclose(void *p);
124 
125 hidden void __dl_seterr(const char *, ...);
126 hidden int __dl_invalid_handle(void *);
127 hidden void __dl_vseterr(const char *, va_list);
128 
129 hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
130 
131 #endif
132