move declaration of interfaces between malloc and ldso to dynlink.h
[oweals/musl.git] / 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 #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_USYMBOLIC,
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 *);
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 hidden extern int __malloc_replaced;
109 hidden void __malloc_donate(char *, char *);
110
111 #endif