• 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 #ifndef __LITEOS__
10 #include <link.h>
11 #include <sys/types.h>
12 #include <stdlib.h>
13 #include "libc.h"
14 #ifdef __HISPARK_LINUX__
15 #include "../../ldso/namespace.h"
16 #else
17 #include "../../ldso/linux/namespace.h"
18 #endif
19 #endif
20 
21 #if UINTPTR_MAX == 0xffffffff
22 typedef Elf32_Ehdr Ehdr;
23 typedef Elf32_Phdr Phdr;
24 typedef Elf32_Sym Sym;
25 #ifndef __LITEOS__
26 typedef Elf32_Shdr Shdr;
27 typedef Elf32_Verdaux Verdaux;
28 typedef Elf32_Verdef Verdef;
29 typedef Elf32_Vernaux Vernaux;
30 typedef Elf32_Verneed Verneed;
31 #endif
32 #define R_TYPE(x) ((x)&255)
33 #define R_SYM(x) ((x)>>8)
34 #define R_INFO ELF32_R_INFO
35 #else
36 typedef Elf64_Ehdr Ehdr;
37 typedef Elf64_Phdr Phdr;
38 typedef Elf64_Sym Sym;
39 #ifndef __LITEOS__
40 typedef Elf64_Shdr Shdr;
41 typedef Elf64_Verdaux Verdaux;
42 typedef Elf64_Verdef Verdef;
43 typedef Elf64_Vernaux Vernaux;
44 typedef Elf64_Verneed Verneed;
45 #endif
46 #define R_TYPE(x) ((x)&0x7fffffff)
47 #define R_SYM(x) ((x)>>32)
48 #define R_INFO ELF64_R_INFO
49 #endif
50 
51 /* These enum constants provide unmatchable default values for
52  * any relocation type the arch does not use. */
53 enum {
54 	REL_NONE = 0,
55 	REL_SYMBOLIC = -100,
56 	REL_USYMBOLIC,
57 	REL_GOT,
58 	REL_PLT,
59 	REL_RELATIVE,
60 	REL_OFFSET,
61 	REL_OFFSET32,
62 	REL_COPY,
63 	REL_SYM_OR_REL,
64 	REL_DTPMOD,
65 	REL_DTPOFF,
66 	REL_TPOFF,
67 	REL_TPOFF_NEG,
68 	REL_TLSDESC,
69 	REL_FUNCDESC,
70 	REL_FUNCDESC_VAL,
71 };
72 #ifndef __LITEOS__
73 struct td_index {
74 	size_t args[2];
75 	struct td_index *next;
76 };
77 
78 struct verinfo {
79 	const char *s;
80 	const char *v;
81 	bool use_vna_hash;
82 	uint32_t vna_hash;
83 };
84 
85 struct sym_info_pair {
86 	uint_fast32_t sym_h;
87 	uint32_t sym_l;
88 };
89 
90 struct dso {
91 #if DL_FDPIC
92 	struct fdpic_loadmap *loadmap;
93 #else
94 	unsigned char *base;
95 #endif
96 	char *name;
97 	size_t *dynv;
98 	struct dso *next, *prev;
99 	/* add namespace */
100 	ns_t *namespace;
101 	int cache_sym_index;
102 	struct dso *cache_dso;
103 	Sym *cache_sym;
104 	Phdr *phdr;
105 	int phnum;
106 	size_t phentsize;
107 	Sym *syms;
108 	Elf_Symndx *hashtab;
109 	uint32_t *ghashtab;
110 	int16_t *versym;
111 	Verdef *verdef;
112 	Verneed *verneed;
113 	char *strings;
114 	struct dso *syms_next, *lazy_next;
115 	size_t *lazy, lazy_cnt;
116 	unsigned char *map;
117 	size_t map_len;
118 	dev_t dev;
119 	ino_t ino;
120 	uint64_t file_offset;
121 	pthread_t ctor_visitor;
122 	char *rpath_orig, *rpath;
123 	struct tls_module tls;
124 	size_t tls_id;
125 	size_t relro_start, relro_end;
126 	uintptr_t *new_dtv;
127 	unsigned char *new_tls;
128 	struct td_index *td_index;
129 	struct dso *fini_next;
130 	char *shortname;
131 #if DL_FDPIC
132 	unsigned char *base;
133 #else
134 	struct fdpic_loadmap *loadmap;
135 #endif
136 	struct funcdesc {
137 		void *addr;
138 		size_t *got;
139 	} *funcdescs;
140 	size_t *got;
141 	struct dso **deps, *needed_by;
142 	/* only assigned when a thread local destructor is added */
143 	struct dso **deps_all;
144 	uint16_t ndeps_direct;
145 	uint16_t next_dep;
146 	uint16_t parents_count;
147 	uint16_t parents_capacity;
148 	struct dso **parents;
149 	struct dso **reloc_can_search_dso_list;
150 	uint16_t reloc_can_search_dso_count;
151 	uint16_t reloc_can_search_dso_capacity;
152 	/* mark the dso status */
153 	uint32_t flags;
154 	uint32_t nr_dlopen;
155 	bool is_global;
156 	bool is_preload;
157 	bool is_reloc_head_so_dep;
158 	char relocated;
159 	char constructed;
160 	char kernel_mapped;
161 	char mark;
162 	char bfs_built;
163 	char deps_all_built;
164 	char runtime_loaded;
165 	char by_dlopen;
166 	bool is_mapped_to_shadow;
167 	struct dso_debug_info *debug_info;
168 	char buf[];
169 };
170 
171 struct dso_debug_info {
172 #if DL_FDPIC
173 	struct fdpic_loadmap *loadmap;
174 #else
175 	unsigned char *base;
176 #endif
177 	char *name;
178 	size_t *dynv;
179 	struct dso_debug_info *next, *prev;
180 };
181 
182 struct symdef {
183 	Sym *sym;
184 	struct dso *dso;
185 };
186 
187 struct dlopen_time_info {
188 	int entry_header_time;
189 	int deps_header_time;
190 	int map_so_time;
191 	int reloc_time;
192 	int map_cfi_time;
193 	int init_time;
194 	int total_time;
195 	int encaps_time;
196 };
197 #endif
198 
199 struct fdpic_loadseg {
200 	uintptr_t addr, p_vaddr, p_memsz;
201 };
202 
203 struct fdpic_loadmap {
204 	unsigned short version, nsegs;
205 	struct fdpic_loadseg segs[];
206 };
207 
208 struct fdpic_dummy_loadmap {
209 	unsigned short version, nsegs;
210 	struct fdpic_loadseg segs[1];
211 };
212 
213 #include "reloc.h"
214 
215 #ifndef FDPIC_CONSTDISP_FLAG
216 #define FDPIC_CONSTDISP_FLAG 0
217 #endif
218 
219 #ifndef DL_FDPIC
220 #define DL_FDPIC 0
221 #endif
222 
223 #ifndef DL_NOMMU_SUPPORT
224 #define DL_NOMMU_SUPPORT 0
225 #endif
226 
227 #ifndef TLSDESC_BACKWARDS
228 #define TLSDESC_BACKWARDS 0
229 #endif
230 
231 #if !DL_FDPIC
232 #define IS_RELATIVE(x,s) ( \
233 	(R_TYPE(x) == REL_RELATIVE) || \
234 	(R_TYPE(x) == REL_SYM_OR_REL && !R_SYM(x)) )
235 #else
236 #define IS_RELATIVE(x,s) ( ( \
237 	(R_TYPE(x) == REL_FUNCDESC_VAL) || \
238 	(R_TYPE(x) == REL_SYMBOLIC) ) \
239 	&& (((s)[R_SYM(x)].st_info & 0xf) == STT_SECTION) )
240 #endif
241 
242 #ifndef NEED_MIPS_GOT_RELOCS
243 #define NEED_MIPS_GOT_RELOCS 0
244 #endif
245 
246 #ifndef DT_DEBUG_INDIRECT
247 #define DT_DEBUG_INDIRECT 0
248 #endif
249 
250 #ifndef DT_DEBUG_INDIRECT_REL
251 #define DT_DEBUG_INDIRECT_REL 0
252 #endif
253 
254 #define AUX_CNT 32
255 #ifndef __LITEOS__
256 #define DYN_CNT 37
257 
258 #define DT_ANDROID_REL (DT_LOOS + 2)
259 #define DT_ANDROID_RELSZ (DT_LOOS + 3)
260 
261 #define DT_ANDROID_RELA (DT_LOOS + 4)
262 #define DT_ANDROID_RELASZ (DT_LOOS + 5)
263 
264 #define ANDROID_REL_SIGN_SIZE 4
265 
266 #define RELOCATION_GROUPED_BY_INFO_FLAG 1
267 #define RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG 2
268 #define RELOCATION_GROUPED_BY_ADDEND_FLAG 4
269 #define RELOCATION_GROUP_HAS_ADDEND_FLAG 8
270 
271 #define CLOCK_NANO_TO_MILLI 1000000
272 #define CLOCK_SECOND_TO_MILLI 1000
273 #define DLOPEN_TIME_THRESHOLD 1000
274 
275 typedef void (*stage2_func)(unsigned char *, size_t *);
276 
277 #if DL_FDPIC
278 void *laddr(const struct dso *p, size_t v);
279 #endif
280 
281 #ifdef UNIT_TEST_STATIC
282     #define UT_STATIC
283 #else
284     #define UT_STATIC static
285 #endif
286 
287 void *addr2dso(size_t a);
288 UT_STATIC size_t count_syms(struct dso *p);
289 struct sym_info_pair gnu_hash(const char *s0);
290 struct symdef find_sym_impl(
291 	struct dso *dso, struct verinfo *verinfo, struct sym_info_pair s_info_p, int need_def, ns_t *ns);
292 
293 hidden void *__dlsym(void *restrict, const char *restrict, void *restrict);
294 hidden void *__dlvsym(void *restrict, const char *restrict, const char *restrict, void *restrict);
295 hidden int __dlclose(void *p);
296 #else
297 #define DYN_CNT 37
298 
299 typedef void (*stage2_func)(unsigned char *, size_t *);
300 
301 hidden void *__dlsym(void *restrict, const char *restrict, void *restrict);
302 #endif
303 hidden void __dl_seterr(const char *, ...);
304 hidden int __dl_invalid_handle(void *);
305 hidden void __dl_vseterr(const char *, va_list);
306 
307 hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
308 
309 hidden extern int __malloc_replaced;
310 hidden extern int __aligned_alloc_replaced;
311 hidden void __malloc_donate(char *, char *);
312 hidden int __malloc_allzerop(void *);
313 
314 #endif
315