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