reloc_x86_64.c (5880B)
1 /* RelocKind <-> x86_64 ELF reloc-type mapping. 2 * 3 * Mirror of elf_reloc_aarch64.c for the x86_64 SysV ABI. The arch- 4 * agnostic R_ABS / R_PC / R_REL RelocKind entries fan out to the 5 * native x86_64 codes; the x86_64-only encodings (R_X64_PC8, PLT32, 6 * GOTPCREL, dynamic-only entries) live in the lower band. 7 * 8 * Returning ELF_R_X86_64_NONE for an unsupported kind is the signal 9 * to the caller to either panic (emit) or panic (read with diagnostic). */ 10 11 #include "obj/elf/elf.h" 12 13 u32 elf_x86_64_reloc_to(u32 kind /* RelocKind */) { 14 switch (kind) { 15 case R_NONE: 16 return ELF_R_X86_64_NONE; 17 case R_ABS64: 18 return ELF_R_X86_64_64; 19 case R_ABS32: 20 return ELF_R_X86_64_32; 21 case R_X64_32S: 22 return ELF_R_X86_64_32S; 23 case R_PC32: 24 return ELF_R_X86_64_PC32; 25 case R_PC64: 26 return ELF_R_X86_64_PC64; 27 case R_REL32: 28 return ELF_R_X86_64_PC32; 29 case R_REL64: 30 return ELF_R_X86_64_PC64; 31 case R_X64_PC8: 32 return ELF_R_X86_64_PC8; 33 case R_PLT32: 34 case R_X64_PLT32: 35 return ELF_R_X86_64_PLT32; 36 case R_GOT32: 37 return ELF_R_X86_64_GOT32; 38 case R_X64_GOTPCREL: 39 return ELF_R_X86_64_GOTPCREL; 40 case R_X64_GOTPCRELX: 41 return ELF_R_X86_64_GOTPCRELX; 42 case R_X64_REX_GOTPCRELX: 43 return ELF_R_X86_64_REX_GOTPCRELX; 44 case R_X64_GOTPC32: 45 return ELF_R_X86_64_GOTPC32; 46 case R_X64_GOTOFF64: 47 return ELF_R_X86_64_GOTOFF64; 48 case R_X64_TPOFF32: 49 return ELF_R_X86_64_TPOFF32; 50 case R_TPOFF64: 51 return ELF_R_X86_64_TPOFF64; 52 case R_X64_DTPOFF32: 53 return ELF_R_X86_64_DTPOFF32; 54 case R_X64_DTPMOD64: 55 return ELF_R_X86_64_DTPMOD64; 56 case R_X64_DTPOFF64: 57 return ELF_R_X86_64_DTPOFF64; 58 case R_X64_TLSGD: 59 return ELF_R_X86_64_TLSGD; 60 case R_X64_TLSLD: 61 return ELF_R_X86_64_TLSLD; 62 case R_X64_GOTTPOFF: 63 return ELF_R_X86_64_GOTTPOFF; 64 case R_X64_GLOB_DAT: 65 return ELF_R_X86_64_GLOB_DAT; 66 case R_X64_JUMP_SLOT: 67 return ELF_R_X86_64_JUMP_SLOT; 68 case R_X64_RELATIVE: 69 return ELF_R_X86_64_RELATIVE; 70 case R_X64_COPY: 71 return ELF_R_X86_64_COPY; 72 default: 73 return ELF_R_X86_64_NONE; 74 } 75 } 76 77 u32 elf_x86_64_reloc_from(u32 elf_type) { 78 switch (elf_type) { 79 case ELF_R_X86_64_NONE: 80 return R_NONE; 81 case ELF_R_X86_64_64: 82 return R_ABS64; 83 case ELF_R_X86_64_32: 84 return R_ABS32; 85 case ELF_R_X86_64_32S: 86 return R_X64_32S; 87 case ELF_R_X86_64_PC32: 88 return R_PC32; 89 case ELF_R_X86_64_PC64: 90 return R_PC64; 91 case ELF_R_X86_64_PC8: 92 return R_X64_PC8; 93 case ELF_R_X86_64_PLT32: 94 return R_X64_PLT32; 95 case ELF_R_X86_64_GOT32: 96 return R_GOT32; 97 case ELF_R_X86_64_GOTPCREL: 98 return R_X64_GOTPCREL; 99 case ELF_R_X86_64_GOTPCRELX: 100 return R_X64_GOTPCRELX; 101 case ELF_R_X86_64_REX_GOTPCRELX: 102 return R_X64_REX_GOTPCRELX; 103 case ELF_R_X86_64_GOTPC32: 104 return R_X64_GOTPC32; 105 case ELF_R_X86_64_GOTOFF64: 106 return R_X64_GOTOFF64; 107 case ELF_R_X86_64_TPOFF32: 108 return R_X64_TPOFF32; 109 case ELF_R_X86_64_TPOFF64: 110 return R_TPOFF64; 111 case ELF_R_X86_64_DTPOFF32: 112 return R_X64_DTPOFF32; 113 case ELF_R_X86_64_DTPMOD64: 114 return R_X64_DTPMOD64; 115 case ELF_R_X86_64_DTPOFF64: 116 return R_X64_DTPOFF64; 117 case ELF_R_X86_64_TLSGD: 118 return R_X64_TLSGD; 119 case ELF_R_X86_64_TLSLD: 120 return R_X64_TLSLD; 121 case ELF_R_X86_64_GOTTPOFF: 122 return R_X64_GOTTPOFF; 123 case ELF_R_X86_64_GLOB_DAT: 124 return R_X64_GLOB_DAT; 125 case ELF_R_X86_64_JUMP_SLOT: 126 return R_X64_JUMP_SLOT; 127 case ELF_R_X86_64_RELATIVE: 128 return R_X64_RELATIVE; 129 case ELF_R_X86_64_COPY: 130 return R_X64_COPY; 131 default: 132 return (u32)-1; /* sentinel */ 133 } 134 } 135 136 /* Diagnostic spelling for an x86_64 ELF reloc *wire* type. Returns a 137 * static literal, or NULL for an unknown type. */ 138 const char* elf_x86_64_reloc_name(u32 elf_type) { 139 switch (elf_type) { 140 case ELF_R_X86_64_NONE: 141 return "R_X86_64_NONE"; 142 case ELF_R_X86_64_64: 143 return "R_X86_64_64"; 144 case ELF_R_X86_64_PC32: 145 return "R_X86_64_PC32"; 146 case ELF_R_X86_64_GOT32: 147 return "R_X86_64_GOT32"; 148 case ELF_R_X86_64_PLT32: 149 return "R_X86_64_PLT32"; 150 case ELF_R_X86_64_COPY: 151 return "R_X86_64_COPY"; 152 case ELF_R_X86_64_GLOB_DAT: 153 return "R_X86_64_GLOB_DAT"; 154 case ELF_R_X86_64_JUMP_SLOT: 155 return "R_X86_64_JUMP_SLOT"; 156 case ELF_R_X86_64_RELATIVE: 157 return "R_X86_64_RELATIVE"; 158 case ELF_R_X86_64_IRELATIVE: 159 return "R_X86_64_IRELATIVE"; 160 case ELF_R_X86_64_GOTPCREL: 161 return "R_X86_64_GOTPCREL"; 162 case ELF_R_X86_64_32: 163 return "R_X86_64_32"; 164 case ELF_R_X86_64_32S: 165 return "R_X86_64_32S"; 166 case ELF_R_X86_64_16: 167 return "R_X86_64_16"; 168 case ELF_R_X86_64_PC16: 169 return "R_X86_64_PC16"; 170 case ELF_R_X86_64_8: 171 return "R_X86_64_8"; 172 case ELF_R_X86_64_PC8: 173 return "R_X86_64_PC8"; 174 case ELF_R_X86_64_DTPMOD64: 175 return "R_X86_64_DTPMOD64"; 176 case ELF_R_X86_64_DTPOFF64: 177 return "R_X86_64_DTPOFF64"; 178 case ELF_R_X86_64_TPOFF64: 179 return "R_X86_64_TPOFF64"; 180 case ELF_R_X86_64_TLSGD: 181 return "R_X86_64_TLSGD"; 182 case ELF_R_X86_64_TLSLD: 183 return "R_X86_64_TLSLD"; 184 case ELF_R_X86_64_DTPOFF32: 185 return "R_X86_64_DTPOFF32"; 186 case ELF_R_X86_64_GOTTPOFF: 187 return "R_X86_64_GOTTPOFF"; 188 case ELF_R_X86_64_TPOFF32: 189 return "R_X86_64_TPOFF32"; 190 case ELF_R_X86_64_PC64: 191 return "R_X86_64_PC64"; 192 case ELF_R_X86_64_GOTOFF64: 193 return "R_X86_64_GOTOFF64"; 194 case ELF_R_X86_64_GOTPC32: 195 return "R_X86_64_GOTPC32"; 196 case ELF_R_X86_64_GOTPCRELX: 197 return "R_X86_64_GOTPCRELX"; 198 case ELF_R_X86_64_REX_GOTPCRELX: 199 return "R_X86_64_REX_GOTPCRELX"; 200 default: 201 return NULL; 202 } 203 }