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