1 //===- Target.cpp ---------------------------------------------------------===// 2 // 3 // The LLVM Linker 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Machine-specific things, such as applying relocations, creation of 11 // GOT or PLT entries, etc., are handled in this file. 12 // 13 // Refer the ELF spec for the single letter varaibles, S, A or P, used 14 // in this file. 15 // 16 // Some functions defined in this file has "relaxTls" as part of their names. 17 // They do peephole optimization for TLS variables by rewriting instructions. 18 // They are not part of the ABI but optional optimization, so you can skip 19 // them if you are not interested in how TLS variables are optimized. 20 // See the following paper for the details. 21 // 22 // Ulrich Drepper, ELF Handling For Thread-Local Storage 23 // http://www.akkadia.org/drepper/tls.pdf 24 // 25 //===----------------------------------------------------------------------===// 26 27 #include "Target.h" 28 #include "Error.h" 29 #include "InputFiles.h" 30 #include "OutputSections.h" 31 #include "Symbols.h" 32 33 #include "llvm/ADT/ArrayRef.h" 34 #include "llvm/Object/ELF.h" 35 #include "llvm/Support/Endian.h" 36 #include "llvm/Support/ELF.h" 37 38 using namespace llvm; 39 using namespace llvm::object; 40 using namespace llvm::support::endian; 41 using namespace llvm::ELF; 42 43 namespace lld { 44 namespace elf { 45 46 TargetInfo *Target; 47 48 static void or32le(uint8_t *P, int32_t V) { write32le(P, read32le(P) | V); } 49 50 template <unsigned N> static void checkInt(int64_t V, uint32_t Type) { 51 if (isInt<N>(V)) 52 return; 53 StringRef S = getELFRelocationTypeName(Config->EMachine, Type); 54 error("relocation " + S + " out of range"); 55 } 56 57 template <unsigned N> static void checkUInt(uint64_t V, uint32_t Type) { 58 if (isUInt<N>(V)) 59 return; 60 StringRef S = getELFRelocationTypeName(Config->EMachine, Type); 61 error("relocation " + S + " out of range"); 62 } 63 64 template <unsigned N> static void checkIntUInt(uint64_t V, uint32_t Type) { 65 if (isInt<N>(V) || isUInt<N>(V)) 66 return; 67 StringRef S = getELFRelocationTypeName(Config->EMachine, Type); 68 error("relocation " + S + " out of range"); 69 } 70 71 template <unsigned N> static void checkAlignment(uint64_t V, uint32_t Type) { 72 if ((V & (N - 1)) == 0) 73 return; 74 StringRef S = getELFRelocationTypeName(Config->EMachine, Type); 75 error("improper alignment for relocation " + S); 76 } 77 78 namespace { 79 class X86TargetInfo final : public TargetInfo { 80 public: 81 X86TargetInfo(); 82 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override; 83 uint64_t getImplicitAddend(const uint8_t *Buf, uint32_t Type) const override; 84 void writeGotPltHeader(uint8_t *Buf) const override; 85 uint32_t getDynRel(uint32_t Type) const override; 86 uint32_t getTlsGotRel(uint32_t Type) const override; 87 bool isTlsLocalDynamicRel(uint32_t Type) const override; 88 bool isTlsGlobalDynamicRel(uint32_t Type) const override; 89 bool isTlsInitialExecRel(uint32_t Type) const override; 90 void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override; 91 void writePltZero(uint8_t *Buf) const override; 92 void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr, 93 int32_t Index, unsigned RelOff) const override; 94 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 95 96 void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 97 void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 98 void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 99 void relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 100 }; 101 102 class X86_64TargetInfo final : public TargetInfo { 103 public: 104 X86_64TargetInfo(); 105 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override; 106 uint32_t getDynRel(uint32_t Type) const override; 107 uint32_t getTlsGotRel(uint32_t Type) const override; 108 bool isTlsLocalDynamicRel(uint32_t Type) const override; 109 bool isTlsGlobalDynamicRel(uint32_t Type) const override; 110 bool isTlsInitialExecRel(uint32_t Type) const override; 111 void writeGotPltHeader(uint8_t *Buf) const override; 112 void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override; 113 void writePltZero(uint8_t *Buf) const override; 114 void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr, 115 int32_t Index, unsigned RelOff) const override; 116 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 117 118 void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 119 void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 120 void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 121 void relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 122 }; 123 124 class PPCTargetInfo final : public TargetInfo { 125 public: 126 PPCTargetInfo(); 127 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 128 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override; 129 }; 130 131 class PPC64TargetInfo final : public TargetInfo { 132 public: 133 PPC64TargetInfo(); 134 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override; 135 void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr, 136 int32_t Index, unsigned RelOff) const override; 137 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 138 }; 139 140 class AArch64TargetInfo final : public TargetInfo { 141 public: 142 AArch64TargetInfo(); 143 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override; 144 uint32_t getDynRel(uint32_t Type) const override; 145 bool isTlsGlobalDynamicRel(uint32_t Type) const override; 146 bool isTlsInitialExecRel(uint32_t Type) const override; 147 void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override; 148 void writePltZero(uint8_t *Buf) const override; 149 void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr, 150 int32_t Index, unsigned RelOff) const override; 151 uint32_t getTlsGotRel(uint32_t Type) const override; 152 bool usesOnlyLowPageBits(uint32_t Type) const override; 153 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 154 void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 155 void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 156 157 private: 158 static const uint64_t TcbSize = 16; 159 }; 160 161 class AMDGPUTargetInfo final : public TargetInfo { 162 public: 163 AMDGPUTargetInfo() {} 164 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 165 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override; 166 }; 167 168 template <class ELFT> class MipsTargetInfo final : public TargetInfo { 169 public: 170 MipsTargetInfo(); 171 RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override; 172 uint64_t getImplicitAddend(const uint8_t *Buf, uint32_t Type) const override; 173 uint32_t getDynRel(uint32_t Type) const override; 174 void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override; 175 void writePltZero(uint8_t *Buf) const override; 176 void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr, 177 int32_t Index, unsigned RelOff) const override; 178 void writeThunk(uint8_t *Buf, uint64_t S) const override; 179 bool needsThunk(uint32_t Type, const InputFile &File, 180 const SymbolBody &S) const override; 181 void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; 182 bool isHintRel(uint32_t Type) const override; 183 bool usesOnlyLowPageBits(uint32_t Type) const override; 184 }; 185 } // anonymous namespace 186 187 TargetInfo *createTarget() { 188 switch (Config->EMachine) { 189 case EM_386: 190 return new X86TargetInfo(); 191 case EM_AARCH64: 192 return new AArch64TargetInfo(); 193 case EM_AMDGPU: 194 return new AMDGPUTargetInfo(); 195 case EM_MIPS: 196 switch (Config->EKind) { 197 case ELF32LEKind: 198 return new MipsTargetInfo<ELF32LE>(); 199 case ELF32BEKind: 200 return new MipsTargetInfo<ELF32BE>(); 201 case ELF64LEKind: 202 return new MipsTargetInfo<ELF64LE>(); 203 case ELF64BEKind: 204 return new MipsTargetInfo<ELF64BE>(); 205 default: 206 fatal("unsupported MIPS target"); 207 } 208 case EM_PPC: 209 return new PPCTargetInfo(); 210 case EM_PPC64: 211 return new PPC64TargetInfo(); 212 case EM_X86_64: 213 return new X86_64TargetInfo(); 214 } 215 fatal("unknown target machine"); 216 } 217 218 TargetInfo::~TargetInfo() {} 219 220 uint64_t TargetInfo::getImplicitAddend(const uint8_t *Buf, 221 uint32_t Type) const { 222 return 0; 223 } 224 225 uint64_t TargetInfo::getVAStart() const { return Config->Pic ? 0 : VAStart; } 226 227 bool TargetInfo::isHintRel(uint32_t Type) const { return false; } 228 bool TargetInfo::usesOnlyLowPageBits(uint32_t Type) const { return false; } 229 230 bool TargetInfo::needsThunk(uint32_t Type, const InputFile &File, 231 const SymbolBody &S) const { 232 return false; 233 } 234 235 bool TargetInfo::isTlsInitialExecRel(uint32_t Type) const { return false; } 236 237 bool TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const { return false; } 238 239 bool TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const { 240 return false; 241 } 242 243 void TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, 244 uint64_t Val) const { 245 llvm_unreachable("Should not have claimed to be relaxable"); 246 } 247 248 void TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, 249 uint64_t Val) const { 250 llvm_unreachable("Should not have claimed to be relaxable"); 251 } 252 253 void TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, 254 uint64_t Val) const { 255 llvm_unreachable("Should not have claimed to be relaxable"); 256 } 257 258 void TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, 259 uint64_t Val) const { 260 llvm_unreachable("Should not have claimed to be relaxable"); 261 } 262 263 X86TargetInfo::X86TargetInfo() { 264 CopyRel = R_386_COPY; 265 GotRel = R_386_GLOB_DAT; 266 PltRel = R_386_JUMP_SLOT; 267 IRelativeRel = R_386_IRELATIVE; 268 RelativeRel = R_386_RELATIVE; 269 TlsGotRel = R_386_TLS_TPOFF; 270 TlsModuleIndexRel = R_386_TLS_DTPMOD32; 271 TlsOffsetRel = R_386_TLS_DTPOFF32; 272 UseLazyBinding = true; 273 PltEntrySize = 16; 274 PltZeroSize = 16; 275 TlsGdToLeSkip = 2; 276 } 277 278 RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { 279 switch (Type) { 280 default: 281 return R_ABS; 282 case R_386_TLS_GD: 283 return R_TLSGD; 284 case R_386_TLS_LDM: 285 return R_TLSLD; 286 case R_386_PLT32: 287 return R_PLT_PC; 288 case R_386_PC32: 289 return R_PC; 290 case R_386_GOTPC: 291 return R_GOTONLY_PC; 292 case R_386_TLS_IE: 293 return R_GOT; 294 case R_386_GOT32: 295 case R_386_TLS_GOTIE: 296 return R_GOT_FROM_END; 297 case R_386_GOTOFF: 298 return R_GOTREL; 299 case R_386_TLS_LE: 300 return R_TLS; 301 case R_386_TLS_LE_32: 302 return R_NEG_TLS; 303 } 304 } 305 306 void X86TargetInfo::writeGotPltHeader(uint8_t *Buf) const { 307 write32le(Buf, Out<ELF32LE>::Dynamic->getVA()); 308 } 309 310 void X86TargetInfo::writeGotPlt(uint8_t *Buf, uint64_t Plt) const { 311 // Entries in .got.plt initially points back to the corresponding 312 // PLT entries with a fixed offset to skip the first instruction. 313 write32le(Buf, Plt + 6); 314 } 315 316 uint32_t X86TargetInfo::getDynRel(uint32_t Type) const { 317 if (Type == R_386_TLS_LE) 318 return R_386_TLS_TPOFF; 319 if (Type == R_386_TLS_LE_32) 320 return R_386_TLS_TPOFF32; 321 return Type; 322 } 323 324 uint32_t X86TargetInfo::getTlsGotRel(uint32_t Type) const { 325 if (Type == R_386_TLS_IE) 326 return Type; 327 return R_386_GOT32; 328 } 329 330 bool X86TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const { 331 return Type == R_386_TLS_GD; 332 } 333 334 bool X86TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const { 335 return Type == R_386_TLS_LDO_32 || Type == R_386_TLS_LDM; 336 } 337 338 bool X86TargetInfo::isTlsInitialExecRel(uint32_t Type) const { 339 return Type == R_386_TLS_IE || Type == R_386_TLS_GOTIE; 340 } 341 342 void X86TargetInfo::writePltZero(uint8_t *Buf) const { 343 // Executable files and shared object files have 344 // separate procedure linkage tables. 345 if (Config->Pic) { 346 const uint8_t V[] = { 347 0xff, 0xb3, 0x04, 0x00, 0x00, 0x00, // pushl 4(%ebx) 348 0xff, 0xa3, 0x08, 0x00, 0x00, 0x00, // jmp *8(%ebx) 349 0x90, 0x90, 0x90, 0x90 // nop; nop; nop; nop 350 }; 351 memcpy(Buf, V, sizeof(V)); 352 return; 353 } 354 355 const uint8_t PltData[] = { 356 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushl (GOT+4) 357 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *(GOT+8) 358 0x90, 0x90, 0x90, 0x90 // nop; nop; nop; nop 359 }; 360 memcpy(Buf, PltData, sizeof(PltData)); 361 uint32_t Got = Out<ELF32LE>::GotPlt->getVA(); 362 write32le(Buf + 2, Got + 4); 363 write32le(Buf + 8, Got + 8); 364 } 365 366 void X86TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr, 367 uint64_t PltEntryAddr, int32_t Index, 368 unsigned RelOff) const { 369 const uint8_t Inst[] = { 370 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, // jmp *foo_in_GOT|*foo@GOT(%ebx) 371 0x68, 0x00, 0x00, 0x00, 0x00, // pushl $reloc_offset 372 0xe9, 0x00, 0x00, 0x00, 0x00 // jmp .PLT0@PC 373 }; 374 memcpy(Buf, Inst, sizeof(Inst)); 375 376 // jmp *foo@GOT(%ebx) or jmp *foo_in_GOT 377 Buf[1] = Config->Pic ? 0xa3 : 0x25; 378 uint32_t Got = UseLazyBinding ? Out<ELF32LE>::GotPlt->getVA() 379 : Out<ELF32LE>::Got->getVA(); 380 write32le(Buf + 2, Config->Shared ? GotEntryAddr - Got : GotEntryAddr); 381 write32le(Buf + 7, RelOff); 382 write32le(Buf + 12, -Index * PltEntrySize - PltZeroSize - 16); 383 } 384 385 uint64_t X86TargetInfo::getImplicitAddend(const uint8_t *Buf, 386 uint32_t Type) const { 387 switch (Type) { 388 default: 389 return 0; 390 case R_386_32: 391 case R_386_GOT32: 392 case R_386_GOTOFF: 393 case R_386_GOTPC: 394 case R_386_PC32: 395 case R_386_PLT32: 396 return read32le(Buf); 397 } 398 } 399 400 void X86TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, 401 uint64_t Val) const { 402 checkInt<32>(Val, Type); 403 write32le(Loc, Val); 404 } 405 406 void X86TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, 407 uint64_t Val) const { 408 // Convert 409 // leal x@tlsgd(, %ebx, 1), 410 // call __tls_get_addr@plt 411 // to 412 // movl %gs:0,%eax 413 // subl $x@ntpoff,%eax 414 const uint8_t Inst[] = { 415 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax 416 0x81, 0xe8, 0x00, 0x00, 0x00, 0x00 // subl 0(%ebx), %eax 417 }; 418 memcpy(Loc - 3, Inst, sizeof(Inst)); 419 relocateOne(Loc + 5, R_386_32, Out<ELF32LE>::TlsPhdr->p_memsz - Val); 420 } 421 422 void X86TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, 423 uint64_t Val) const { 424 // Convert 425 // leal x@tlsgd(, %ebx, 1), 426 // call __tls_get_addr@plt 427 // to 428 // movl %gs:0, %eax 429 // addl x@gotntpoff(%ebx), %eax 430 const uint8_t Inst[] = { 431 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax 432 0x03, 0x83, 0x00, 0x00, 0x00, 0x00 // addl 0(%ebx), %eax 433 }; 434 memcpy(Loc - 3, Inst, sizeof(Inst)); 435 relocateOne(Loc + 5, R_386_32, Val - Out<ELF32LE>::Got->getVA() - 436 Out<ELF32LE>::Got->getNumEntries() * 4); 437 } 438 439 // In some conditions, relocations can be optimized to avoid using GOT. 440 // This function does that for Initial Exec to Local Exec case. 441 void X86TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, 442 uint64_t Val) const { 443 // Ulrich's document section 6.2 says that @gotntpoff can 444 // be used with MOVL or ADDL instructions. 445 // @indntpoff is similar to @gotntpoff, but for use in 446 // position dependent code. 447 uint8_t *Inst = Loc - 2; 448 uint8_t *Op = Loc - 1; 449 uint8_t Reg = (Loc[-1] >> 3) & 7; 450 bool IsMov = *Inst == 0x8b; 451 if (Type == R_386_TLS_IE) { 452 // For R_386_TLS_IE relocation we perform the next transformations: 453 // MOVL foo@INDNTPOFF,%EAX is transformed to MOVL $foo,%EAX 454 // MOVL foo@INDNTPOFF,%REG is transformed to MOVL $foo,%REG 455 // ADDL foo@INDNTPOFF,%REG is transformed to ADDL $foo,%REG 456 // First one is special because when EAX is used the sequence is 5 bytes 457 // long, otherwise it is 6 bytes. 458 if (*Op == 0xa1) { 459 *Op = 0xb8; 460 } else { 461 *Inst = IsMov ? 0xc7 : 0x81; 462 *Op = 0xc0 | ((*Op >> 3) & 7); 463 } 464 } else { 465 // R_386_TLS_GOTIE relocation can be optimized to 466 // R_386_TLS_LE so that it does not use GOT. 467 // "MOVL foo@GOTTPOFF(%RIP), %REG" is transformed to "MOVL $foo, %REG". 468 // "ADDL foo@GOTNTPOFF(%RIP), %REG" is transformed to "LEAL foo(%REG), %REG" 469 // Note: gold converts to ADDL instead of LEAL. 470 *Inst = IsMov ? 0xc7 : 0x8d; 471 if (IsMov) 472 *Op = 0xc0 | ((*Op >> 3) & 7); 473 else 474 *Op = 0x80 | Reg | (Reg << 3); 475 } 476 relocateOne(Loc, R_386_TLS_LE, Val - Out<ELF32LE>::TlsPhdr->p_memsz); 477 } 478 479 void X86TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, 480 uint64_t Val) const { 481 if (Type == R_386_TLS_LDO_32) { 482 relocateOne(Loc, R_386_TLS_LE, Val - Out<ELF32LE>::TlsPhdr->p_memsz); 483 return; 484 } 485 486 // Convert 487 // leal foo(%reg),%eax 488 // call ___tls_get_addr 489 // to 490 // movl %gs:0,%eax 491 // nop 492 // leal 0(%esi,1),%esi 493 const uint8_t Inst[] = { 494 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0,%eax 495 0x90, // nop 496 0x8d, 0x74, 0x26, 0x00 // leal 0(%esi,1),%esi 497 }; 498 memcpy(Loc - 2, Inst, sizeof(Inst)); 499 } 500 501 X86_64TargetInfo::X86_64TargetInfo() { 502 CopyRel = R_X86_64_COPY; 503 GotRel = R_X86_64_GLOB_DAT; 504 PltRel = R_X86_64_JUMP_SLOT; 505 RelativeRel = R_X86_64_RELATIVE; 506 IRelativeRel = R_X86_64_IRELATIVE; 507 TlsGotRel = R_X86_64_TPOFF64; 508 TlsModuleIndexRel = R_X86_64_DTPMOD64; 509 TlsOffsetRel = R_X86_64_DTPOFF64; 510 UseLazyBinding = true; 511 PltEntrySize = 16; 512 PltZeroSize = 16; 513 TlsGdToLeSkip = 2; 514 } 515 516 RelExpr X86_64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { 517 switch (Type) { 518 default: 519 return R_ABS; 520 case R_X86_64_TPOFF32: 521 return R_TLS; 522 case R_X86_64_TLSLD: 523 return R_TLSLD_PC; 524 case R_X86_64_TLSGD: 525 return R_TLSGD_PC; 526 case R_X86_64_SIZE32: 527 case R_X86_64_SIZE64: 528 return R_SIZE; 529 case R_X86_64_PLT32: 530 return R_PLT_PC; 531 case R_X86_64_PC32: 532 case R_X86_64_PC64: 533 return R_PC; 534 case R_X86_64_GOT32: 535 return R_GOT_FROM_END; 536 case R_X86_64_GOTPCREL: 537 case R_X86_64_GOTPCRELX: 538 case R_X86_64_REX_GOTPCRELX: 539 case R_X86_64_GOTTPOFF: 540 return R_GOT_PC; 541 } 542 } 543 544 void X86_64TargetInfo::writeGotPltHeader(uint8_t *Buf) const { 545 write64le(Buf, Out<ELF64LE>::Dynamic->getVA()); 546 } 547 548 void X86_64TargetInfo::writeGotPlt(uint8_t *Buf, uint64_t Plt) const { 549 // See comments in X86TargetInfo::writeGotPlt. 550 write32le(Buf, Plt + 6); 551 } 552 553 void X86_64TargetInfo::writePltZero(uint8_t *Buf) const { 554 const uint8_t PltData[] = { 555 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip) 556 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip) 557 0x0f, 0x1f, 0x40, 0x00 // nopl 0x0(rax) 558 }; 559 memcpy(Buf, PltData, sizeof(PltData)); 560 uint64_t Got = Out<ELF64LE>::GotPlt->getVA(); 561 uint64_t Plt = Out<ELF64LE>::Plt->getVA(); 562 write32le(Buf + 2, Got - Plt + 2); // GOT+8 563 write32le(Buf + 8, Got - Plt + 4); // GOT+16 564 } 565 566 void X86_64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr, 567 uint64_t PltEntryAddr, int32_t Index, 568 unsigned RelOff) const { 569 const uint8_t Inst[] = { 570 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *got(%rip) 571 0x68, 0x00, 0x00, 0x00, 0x00, // pushq <relocation index> 572 0xe9, 0x00, 0x00, 0x00, 0x00 // jmpq plt[0] 573 }; 574 memcpy(Buf, Inst, sizeof(Inst)); 575 576 write32le(Buf + 2, GotEntryAddr - PltEntryAddr - 6); 577 write32le(Buf + 7, Index); 578 write32le(Buf + 12, -Index * PltEntrySize - PltZeroSize - 16); 579 } 580 581 uint32_t X86_64TargetInfo::getDynRel(uint32_t Type) const { 582 if (Type == R_X86_64_PC32 || Type == R_X86_64_32) 583 if (Config->Shared) 584 error(getELFRelocationTypeName(EM_X86_64, Type) + 585 " cannot be a dynamic relocation"); 586 return Type; 587 } 588 589 uint32_t X86_64TargetInfo::getTlsGotRel(uint32_t Type) const { 590 // No other types of TLS relocations requiring GOT should 591 // reach here. 592 assert(Type == R_X86_64_GOTTPOFF); 593 return R_X86_64_PC32; 594 } 595 596 bool X86_64TargetInfo::isTlsInitialExecRel(uint32_t Type) const { 597 return Type == R_X86_64_GOTTPOFF; 598 } 599 600 bool X86_64TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const { 601 return Type == R_X86_64_TLSGD; 602 } 603 604 bool X86_64TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const { 605 return Type == R_X86_64_DTPOFF32 || Type == R_X86_64_DTPOFF64 || 606 Type == R_X86_64_TLSLD; 607 } 608 609 void X86_64TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, 610 uint64_t Val) const { 611 // Convert 612 // .byte 0x66 613 // leaq x@tlsgd(%rip), %rdi 614 // .word 0x6666 615 // rex64 616 // call __tls_get_addr@plt 617 // to 618 // mov %fs:0x0,%rax 619 // lea x@tpoff,%rax 620 const uint8_t Inst[] = { 621 0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, // mov %fs:0x0,%rax 622 0x48, 0x8d, 0x80, 0x00, 0x00, 0x00, 0x00 // lea x@tpoff,%rax 623 }; 624 memcpy(Loc - 4, Inst, sizeof(Inst)); 625 relocateOne(Loc + 8, R_X86_64_TPOFF32, 626 Val + 4 - Out<ELF64LE>::TlsPhdr->p_memsz); 627 } 628 629 void X86_64TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, 630 uint64_t Val) const { 631 // Convert 632 // .byte 0x66 633 // leaq x@tlsgd(%rip), %rdi 634 // .word 0x6666 635 // rex64 636 // call __tls_get_addr@plt 637 // to 638 // mov %fs:0x0,%rax 639 // addq x@tpoff,%rax 640 const uint8_t Inst[] = { 641 0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, // mov %fs:0x0,%rax 642 0x48, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00 // addq x@tpoff,%rax 643 }; 644 memcpy(Loc - 4, Inst, sizeof(Inst)); 645 relocateOne(Loc + 8, R_X86_64_PC32, Val - 8); 646 } 647 648 // In some conditions, R_X86_64_GOTTPOFF relocation can be optimized to 649 // R_X86_64_TPOFF32 so that it does not use GOT. 650 void X86_64TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, 651 uint64_t Val) const { 652 // Ulrich's document section 6.5 says that @gottpoff(%rip) must be 653 // used in MOVQ or ADDQ instructions only. 654 // "MOVQ foo@GOTTPOFF(%RIP), %REG" is transformed to "MOVQ $foo, %REG". 655 // "ADDQ foo@GOTTPOFF(%RIP), %REG" is transformed to "LEAQ foo(%REG), %REG" 656 // (if the register is not RSP/R12) or "ADDQ $foo, %RSP". 657 // Opcodes info can be found at http://ref.x86asm.net/coder64.html#x48. 658 uint8_t *Prefix = Loc - 3; 659 uint8_t *Inst = Loc - 2; 660 uint8_t *RegSlot = Loc - 1; 661 uint8_t Reg = Loc[-1] >> 3; 662 bool IsMov = *Inst == 0x8b; 663 bool RspAdd = !IsMov && Reg == 4; 664 665 // r12 and rsp registers requires special handling. 666 // Problem is that for other registers, for example leaq 0xXXXXXXXX(%r11),%r11 667 // result out is 7 bytes: 4d 8d 9b XX XX XX XX, 668 // but leaq 0xXXXXXXXX(%r12),%r12 is 8 bytes: 4d 8d a4 24 XX XX XX XX. 669 // The same true for rsp. So we convert to addq for them, saving 1 byte that 670 // we dont have. 671 if (RspAdd) 672 *Inst = 0x81; 673 else 674 *Inst = IsMov ? 0xc7 : 0x8d; 675 if (*Prefix == 0x4c) 676 *Prefix = (IsMov || RspAdd) ? 0x49 : 0x4d; 677 *RegSlot = (IsMov || RspAdd) ? (0xc0 | Reg) : (0x80 | Reg | (Reg << 3)); 678 relocateOne(Loc, R_X86_64_TPOFF32, Val + 4 - Out<ELF64LE>::TlsPhdr->p_memsz); 679 } 680 681 void X86_64TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, 682 uint64_t Val) const { 683 // Convert 684 // leaq bar@tlsld(%rip), %rdi 685 // callq __tls_get_addr@PLT 686 // leaq bar@dtpoff(%rax), %rcx 687 // to 688 // .word 0x6666 689 // .byte 0x66 690 // mov %fs:0,%rax 691 // leaq bar@tpoff(%rax), %rcx 692 if (Type == R_X86_64_DTPOFF64) { 693 write64le(Loc, Val - Out<ELF64LE>::TlsPhdr->p_memsz); 694 return; 695 } 696 if (Type == R_X86_64_DTPOFF32) { 697 relocateOne(Loc, R_X86_64_TPOFF32, Val - Out<ELF64LE>::TlsPhdr->p_memsz); 698 return; 699 } 700 701 const uint8_t Inst[] = { 702 0x66, 0x66, //.word 0x6666 703 0x66, //.byte 0x66 704 0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00 // mov %fs:0,%rax 705 }; 706 memcpy(Loc - 3, Inst, sizeof(Inst)); 707 } 708 709 void X86_64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, 710 uint64_t Val) const { 711 switch (Type) { 712 case R_X86_64_32: 713 checkUInt<32>(Val, Type); 714 write32le(Loc, Val); 715 break; 716 case R_X86_64_32S: 717 case R_X86_64_TPOFF32: 718 case R_X86_64_GOT32: 719 checkInt<32>(Val, Type); 720 write32le(Loc, Val); 721 break; 722 case R_X86_64_64: 723 case R_X86_64_DTPOFF64: 724 case R_X86_64_SIZE64: 725 case R_X86_64_PC64: 726 write64le(Loc, Val); 727 break; 728 case R_X86_64_GOTPCREL: 729 case R_X86_64_GOTPCRELX: 730 case R_X86_64_REX_GOTPCRELX: 731 case R_X86_64_PC32: 732 case R_X86_64_PLT32: 733 case R_X86_64_TLSGD: 734 case R_X86_64_TLSLD: 735 case R_X86_64_DTPOFF32: 736 case R_X86_64_SIZE32: 737 write32le(Loc, Val); 738 break; 739 default: 740 fatal("unrecognized reloc " + Twine(Type)); 741 } 742 } 743 744 // Relocation masks following the #lo(value), #hi(value), #ha(value), 745 // #higher(value), #highera(value), #highest(value), and #highesta(value) 746 // macros defined in section 4.5.1. Relocation Types of the PPC-elf64abi 747 // document. 748 static uint16_t applyPPCLo(uint64_t V) { return V; } 749 static uint16_t applyPPCHi(uint64_t V) { return V >> 16; } 750 static uint16_t applyPPCHa(uint64_t V) { return (V + 0x8000) >> 16; } 751 static uint16_t applyPPCHigher(uint64_t V) { return V >> 32; } 752 static uint16_t applyPPCHighera(uint64_t V) { return (V + 0x8000) >> 32; } 753 static uint16_t applyPPCHighest(uint64_t V) { return V >> 48; } 754 static uint16_t applyPPCHighesta(uint64_t V) { return (V + 0x8000) >> 48; } 755 756 PPCTargetInfo::PPCTargetInfo() {} 757 758 void PPCTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, 759 uint64_t Val) const { 760 switch (Type) { 761 case R_PPC_ADDR16_HA: 762 write16be(Loc, applyPPCHa(Val)); 763 break; 764 case R_PPC_ADDR16_LO: 765 write16be(Loc, applyPPCLo(Val)); 766 break; 767 default: 768 fatal("unrecognized reloc " + Twine(Type)); 769 } 770 } 771 772 RelExpr PPCTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { 773 return R_ABS; 774 } 775 776 PPC64TargetInfo::PPC64TargetInfo() { 777 GotRel = R_PPC64_GLOB_DAT; 778 RelativeRel = R_PPC64_RELATIVE; 779 PltEntrySize = 32; 780 781 // We need 64K pages (at least under glibc/Linux, the loader won't 782 // set different permissions on a finer granularity than that). 783 PageSize = 65536; 784 785 // The PPC64 ELF ABI v1 spec, says: 786 // 787 // It is normally desirable to put segments with different characteristics 788 // in separate 256 Mbyte portions of the address space, to give the 789 // operating system full paging flexibility in the 64-bit address space. 790 // 791 // And because the lowest non-zero 256M boundary is 0x10000000, PPC64 linkers 792 // use 0x10000000 as the starting address. 793 VAStart = 0x10000000; 794 } 795 796 static uint64_t PPC64TocOffset = 0x8000; 797 798 uint64_t getPPC64TocBase() { 799 // The TOC consists of sections .got, .toc, .tocbss, .plt in that order. The 800 // TOC starts where the first of these sections starts. We always create a 801 // .got when we see a relocation that uses it, so for us the start is always 802 // the .got. 803 uint64_t TocVA = Out<ELF64BE>::Got->getVA(); 804 805 // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000 806 // thus permitting a full 64 Kbytes segment. Note that the glibc startup 807 // code (crt1.o) assumes that you can get from the TOC base to the 808 // start of the .toc section with only a single (signed) 16-bit relocation. 809 return TocVA + PPC64TocOffset; 810 } 811 812 RelExpr PPC64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { 813 switch (Type) { 814 default: 815 return R_ABS; 816 case R_PPC64_TOC16: 817 case R_PPC64_TOC16_DS: 818 case R_PPC64_TOC16_HA: 819 case R_PPC64_TOC16_HI: 820 case R_PPC64_TOC16_LO: 821 case R_PPC64_TOC16_LO_DS: 822 return R_GOTREL; 823 case R_PPC64_TOC: 824 return R_PPC_TOC; 825 case R_PPC64_REL24: 826 return R_PPC_PLT_OPD; 827 } 828 } 829 830 void PPC64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr, 831 uint64_t PltEntryAddr, int32_t Index, 832 unsigned RelOff) const { 833 uint64_t Off = GotEntryAddr - getPPC64TocBase(); 834 835 // FIXME: What we should do, in theory, is get the offset of the function 836 // descriptor in the .opd section, and use that as the offset from %r2 (the 837 // TOC-base pointer). Instead, we have the GOT-entry offset, and that will 838 // be a pointer to the function descriptor in the .opd section. Using 839 // this scheme is simpler, but requires an extra indirection per PLT dispatch. 840 841 write32be(Buf, 0xf8410028); // std %r2, 40(%r1) 842 write32be(Buf + 4, 0x3d620000 | applyPPCHa(Off)); // addis %r11, %r2, X@ha 843 write32be(Buf + 8, 0xe98b0000 | applyPPCLo(Off)); // ld %r12, X@l(%r11) 844 write32be(Buf + 12, 0xe96c0000); // ld %r11,0(%r12) 845 write32be(Buf + 16, 0x7d6903a6); // mtctr %r11 846 write32be(Buf + 20, 0xe84c0008); // ld %r2,8(%r12) 847 write32be(Buf + 24, 0xe96c0010); // ld %r11,16(%r12) 848 write32be(Buf + 28, 0x4e800420); // bctr 849 } 850 851 void PPC64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, 852 uint64_t Val) const { 853 uint64_t TO = PPC64TocOffset; 854 855 // For a TOC-relative relocation, proceed in terms of the corresponding 856 // ADDR16 relocation type. 857 switch (Type) { 858 case R_PPC64_TOC16: Type = R_PPC64_ADDR16; Val -= TO; break; 859 case R_PPC64_TOC16_DS: Type = R_PPC64_ADDR16_DS; Val -= TO; break; 860 case R_PPC64_TOC16_HA: Type = R_PPC64_ADDR16_HA; Val -= TO; break; 861 case R_PPC64_TOC16_HI: Type = R_PPC64_ADDR16_HI; Val -= TO; break; 862 case R_PPC64_TOC16_LO: Type = R_PPC64_ADDR16_LO; Val -= TO; break; 863 case R_PPC64_TOC16_LO_DS: Type = R_PPC64_ADDR16_LO_DS; Val -= TO; break; 864 default: break; 865 } 866 867 switch (Type) { 868 case R_PPC64_ADDR14: { 869 checkAlignment<4>(Val, Type); 870 // Preserve the AA/LK bits in the branch instruction 871 uint8_t AALK = Loc[3]; 872 write16be(Loc + 2, (AALK & 3) | (Val & 0xfffc)); 873 break; 874 } 875 case R_PPC64_ADDR16: 876 checkInt<16>(Val, Type); 877 write16be(Loc, Val); 878 break; 879 case R_PPC64_ADDR16_DS: 880 checkInt<16>(Val, Type); 881 write16be(Loc, (read16be(Loc) & 3) | (Val & ~3)); 882 break; 883 case R_PPC64_ADDR16_HA: 884 write16be(Loc, applyPPCHa(Val)); 885 break; 886 case R_PPC64_ADDR16_HI: 887 write16be(Loc, applyPPCHi(Val)); 888 break; 889 case R_PPC64_ADDR16_HIGHER: 890 write16be(Loc, applyPPCHigher(Val)); 891 break; 892 case R_PPC64_ADDR16_HIGHERA: 893 write16be(Loc, applyPPCHighera(Val)); 894 break; 895 case R_PPC64_ADDR16_HIGHEST: 896 write16be(Loc, applyPPCHighest(Val)); 897 break; 898 case R_PPC64_ADDR16_HIGHESTA: 899 write16be(Loc, applyPPCHighesta(Val)); 900 break; 901 case R_PPC64_ADDR16_LO: 902 write16be(Loc, applyPPCLo(Val)); 903 break; 904 case R_PPC64_ADDR16_LO_DS: 905 write16be(Loc, (read16be(Loc) & 3) | (applyPPCLo(Val) & ~3)); 906 break; 907 case R_PPC64_ADDR32: 908 checkInt<32>(Val, Type); 909 write32be(Loc, Val); 910 break; 911 case R_PPC64_ADDR64: 912 write64be(Loc, Val); 913 break; 914 case R_PPC64_REL16_HA: 915 write16be(Loc, applyPPCHa(Val)); 916 break; 917 case R_PPC64_REL16_HI: 918 write16be(Loc, applyPPCHi(Val)); 919 break; 920 case R_PPC64_REL16_LO: 921 write16be(Loc, applyPPCLo(Val)); 922 break; 923 case R_PPC64_REL24: { 924 uint32_t Mask = 0x03FFFFFC; 925 checkInt<24>(Val, Type); 926 write32be(Loc, (read32be(Loc) & ~Mask) | (Val & Mask)); 927 break; 928 } 929 case R_PPC64_REL32: 930 checkInt<32>(Val, Type); 931 write32be(Loc, Val); 932 break; 933 case R_PPC64_REL64: 934 write64be(Loc, Val); 935 break; 936 case R_PPC64_TOC: 937 write64be(Loc, Val); 938 break; 939 default: 940 fatal("unrecognized reloc " + Twine(Type)); 941 } 942 } 943 944 AArch64TargetInfo::AArch64TargetInfo() { 945 CopyRel = R_AARCH64_COPY; 946 RelativeRel = R_AARCH64_RELATIVE; 947 IRelativeRel = R_AARCH64_IRELATIVE; 948 GotRel = R_AARCH64_GLOB_DAT; 949 PltRel = R_AARCH64_JUMP_SLOT; 950 TlsGotRel = R_AARCH64_TLS_TPREL64; 951 TlsModuleIndexRel = R_AARCH64_TLS_DTPMOD64; 952 TlsOffsetRel = R_AARCH64_TLS_DTPREL64; 953 UseLazyBinding = true; 954 PltEntrySize = 16; 955 PltZeroSize = 32; 956 } 957 958 RelExpr AArch64TargetInfo::getRelExpr(uint32_t Type, 959 const SymbolBody &S) const { 960 switch (Type) { 961 default: 962 return R_ABS; 963 case R_AARCH64_CALL26: 964 case R_AARCH64_CONDBR19: 965 case R_AARCH64_JUMP26: 966 case R_AARCH64_TSTBR14: 967 return R_PLT_PC; 968 969 case R_AARCH64_PREL16: 970 case R_AARCH64_PREL32: 971 case R_AARCH64_PREL64: 972 case R_AARCH64_ADR_PREL_LO21: 973 return R_PC; 974 case R_AARCH64_ADR_PREL_PG_HI21: 975 return R_PAGE_PC; 976 case R_AARCH64_LD64_GOT_LO12_NC: 977 case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: 978 return R_GOT; 979 case R_AARCH64_ADR_GOT_PAGE: 980 case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: 981 return R_GOT_PAGE_PC; 982 } 983 } 984 985 bool AArch64TargetInfo::usesOnlyLowPageBits(uint32_t Type) const { 986 switch (Type) { 987 default: 988 return false; 989 case R_AARCH64_ADD_ABS_LO12_NC: 990 case R_AARCH64_LDST8_ABS_LO12_NC: 991 case R_AARCH64_LDST16_ABS_LO12_NC: 992 case R_AARCH64_LDST32_ABS_LO12_NC: 993 case R_AARCH64_LDST64_ABS_LO12_NC: 994 case R_AARCH64_LDST128_ABS_LO12_NC: 995 case R_AARCH64_LD64_GOT_LO12_NC: 996 return true; 997 } 998 } 999 1000 bool AArch64TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const { 1001 return Type == R_AARCH64_TLSDESC_ADR_PAGE21 || 1002 Type == R_AARCH64_TLSDESC_LD64_LO12_NC || 1003 Type == R_AARCH64_TLSDESC_ADD_LO12_NC || 1004 Type == R_AARCH64_TLSDESC_CALL; 1005 } 1006 1007 bool AArch64TargetInfo::isTlsInitialExecRel(uint32_t Type) const { 1008 return Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 || 1009 Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC; 1010 } 1011 1012 uint32_t AArch64TargetInfo::getDynRel(uint32_t Type) const { 1013 if (Type == R_AARCH64_ABS32 || Type == R_AARCH64_ABS64) 1014 return Type; 1015 StringRef S = getELFRelocationTypeName(EM_AARCH64, Type); 1016 error("relocation " + S + " cannot be used when making a shared object; " 1017 "recompile with -fPIC."); 1018 // Keep it going with a dummy value so that we can find more reloc errors. 1019 return R_AARCH64_ABS32; 1020 } 1021 1022 void AArch64TargetInfo::writeGotPlt(uint8_t *Buf, uint64_t Plt) const { 1023 write64le(Buf, Out<ELF64LE>::Plt->getVA()); 1024 } 1025 1026 static uint64_t getAArch64Page(uint64_t Expr) { 1027 return Expr & (~static_cast<uint64_t>(0xFFF)); 1028 } 1029 1030 void AArch64TargetInfo::writePltZero(uint8_t *Buf) const { 1031 const uint8_t PltData[] = { 1032 0xf0, 0x7b, 0xbf, 0xa9, // stp x16, x30, [sp,#-16]! 1033 0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[2])) 1034 0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16, Offset(&(.plt.got[2]))] 1035 0x10, 0x02, 0x00, 0x91, // add x16, x16, Offset(&(.plt.got[2])) 1036 0x20, 0x02, 0x1f, 0xd6, // br x17 1037 0x1f, 0x20, 0x03, 0xd5, // nop 1038 0x1f, 0x20, 0x03, 0xd5, // nop 1039 0x1f, 0x20, 0x03, 0xd5 // nop 1040 }; 1041 memcpy(Buf, PltData, sizeof(PltData)); 1042 1043 uint64_t Got = Out<ELF64LE>::GotPlt->getVA(); 1044 uint64_t Plt = Out<ELF64LE>::Plt->getVA(); 1045 relocateOne(Buf + 4, R_AARCH64_ADR_PREL_PG_HI21, 1046 getAArch64Page(Got + 16) - getAArch64Page(Plt + 4)); 1047 relocateOne(Buf + 8, R_AARCH64_LDST64_ABS_LO12_NC, Got + 16); 1048 relocateOne(Buf + 12, R_AARCH64_ADD_ABS_LO12_NC, Got + 16); 1049 } 1050 1051 void AArch64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr, 1052 uint64_t PltEntryAddr, int32_t Index, 1053 unsigned RelOff) const { 1054 const uint8_t Inst[] = { 1055 0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[n])) 1056 0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16, Offset(&(.plt.got[n]))] 1057 0x10, 0x02, 0x00, 0x91, // add x16, x16, Offset(&(.plt.got[n])) 1058 0x20, 0x02, 0x1f, 0xd6 // br x17 1059 }; 1060 memcpy(Buf, Inst, sizeof(Inst)); 1061 1062 relocateOne(Buf, R_AARCH64_ADR_PREL_PG_HI21, 1063 getAArch64Page(GotEntryAddr) - getAArch64Page(PltEntryAddr)); 1064 relocateOne(Buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, GotEntryAddr); 1065 relocateOne(Buf + 8, R_AARCH64_ADD_ABS_LO12_NC, GotEntryAddr); 1066 } 1067 1068 uint32_t AArch64TargetInfo::getTlsGotRel(uint32_t Type) const { 1069 assert(Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 || 1070 Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC); 1071 return Type; 1072 } 1073 1074 static void updateAArch64Addr(uint8_t *L, uint64_t Imm) { 1075 uint32_t ImmLo = (Imm & 0x3) << 29; 1076 uint32_t ImmHi = ((Imm & 0x1FFFFC) >> 2) << 5; 1077 uint64_t Mask = (0x3 << 29) | (0x7FFFF << 5); 1078 write32le(L, (read32le(L) & ~Mask) | ImmLo | ImmHi); 1079 } 1080 1081 static inline void updateAArch64Add(uint8_t *L, uint64_t Imm) { 1082 or32le(L, (Imm & 0xFFF) << 10); 1083 } 1084 1085 void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, 1086 uint64_t Val) const { 1087 switch (Type) { 1088 case R_AARCH64_ABS16: 1089 checkIntUInt<16>(Val, Type); 1090 write16le(Loc, Val); 1091 break; 1092 case R_AARCH64_ABS32: 1093 checkIntUInt<32>(Val, Type); 1094 write32le(Loc, Val); 1095 break; 1096 case R_AARCH64_ABS64: 1097 write64le(Loc, Val); 1098 break; 1099 case R_AARCH64_ADD_ABS_LO12_NC: 1100 // This relocation stores 12 bits and there's no instruction 1101 // to do it. Instead, we do a 32 bits store of the value 1102 // of r_addend bitwise-or'ed Loc. This assumes that the addend 1103 // bits in Loc are zero. 1104 or32le(Loc, (Val & 0xFFF) << 10); 1105 break; 1106 case R_AARCH64_ADR_GOT_PAGE: 1107 checkInt<33>(Val, Type); 1108 updateAArch64Addr(Loc, (Val >> 12) & 0x1FFFFF); // X[32:12] 1109 break; 1110 case R_AARCH64_ADR_PREL_LO21: 1111 checkInt<21>(Val, Type); 1112 updateAArch64Addr(Loc, Val & 0x1FFFFF); 1113 break; 1114 case R_AARCH64_ADR_PREL_PG_HI21: 1115 case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: 1116 checkInt<33>(Val, Type); 1117 updateAArch64Addr(Loc, (Val >> 12) & 0x1FFFFF); // X[32:12] 1118 break; 1119 case R_AARCH64_CALL26: 1120 case R_AARCH64_JUMP26: 1121 checkInt<28>(Val, Type); 1122 or32le(Loc, (Val & 0x0FFFFFFC) >> 2); 1123 break; 1124 case R_AARCH64_CONDBR19: 1125 checkInt<21>(Val, Type); 1126 or32le(Loc, (Val & 0x1FFFFC) << 3); 1127 break; 1128 case R_AARCH64_LD64_GOT_LO12_NC: 1129 case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: 1130 checkAlignment<8>(Val, Type); 1131 or32le(Loc, (Val & 0xFF8) << 7); 1132 break; 1133 case R_AARCH64_LDST128_ABS_LO12_NC: 1134 or32le(Loc, (Val & 0x0FF8) << 6); 1135 break; 1136 case R_AARCH64_LDST16_ABS_LO12_NC: 1137 or32le(Loc, (Val & 0x0FFC) << 9); 1138 break; 1139 case R_AARCH64_LDST8_ABS_LO12_NC: 1140 or32le(Loc, (Val & 0xFFF) << 10); 1141 break; 1142 case R_AARCH64_LDST32_ABS_LO12_NC: 1143 or32le(Loc, (Val & 0xFFC) << 8); 1144 break; 1145 case R_AARCH64_LDST64_ABS_LO12_NC: 1146 or32le(Loc, (Val & 0xFF8) << 7); 1147 break; 1148 case R_AARCH64_PREL16: 1149 checkIntUInt<16>(Val, Type); 1150 write16le(Loc, Val); 1151 break; 1152 case R_AARCH64_PREL32: 1153 checkIntUInt<32>(Val, Type); 1154 write32le(Loc, Val); 1155 break; 1156 case R_AARCH64_PREL64: 1157 write64le(Loc, Val); 1158 break; 1159 case R_AARCH64_TSTBR14: 1160 checkInt<16>(Val, Type); 1161 or32le(Loc, (Val & 0xFFFC) << 3); 1162 break; 1163 case R_AARCH64_TLSLE_ADD_TPREL_HI12: { 1164 uint64_t V = llvm::alignTo(TcbSize, Out<ELF64LE>::TlsPhdr->p_align) + Val; 1165 checkInt<24>(V, Type); 1166 updateAArch64Add(Loc, (V & 0xFFF000) >> 12); 1167 break; 1168 } 1169 case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: { 1170 uint64_t V = llvm::alignTo(TcbSize, Out<ELF64LE>::TlsPhdr->p_align) + Val; 1171 updateAArch64Add(Loc, V & 0xFFF); 1172 break; 1173 } 1174 default: 1175 fatal("unrecognized reloc " + Twine(Type)); 1176 } 1177 } 1178 1179 void AArch64TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, 1180 uint64_t Val) const { 1181 // TLSDESC Global-Dynamic relocation are in the form: 1182 // adrp x0, :tlsdesc:v [R_AARCH64_TLSDESC_ADR_PAGE21] 1183 // ldr x1, [x0, #:tlsdesc_lo12:v [R_AARCH64_TLSDESC_LD64_LO12_NC] 1184 // add x0, x0, :tlsdesc_los:v [_AARCH64_TLSDESC_ADD_LO12_NC] 1185 // .tlsdesccall [R_AARCH64_TLSDESC_CALL] 1186 // And it can optimized to: 1187 // movz x0, #0x0, lsl #16 1188 // movk x0, #0x10 1189 // nop 1190 // nop 1191 uint64_t TPOff = llvm::alignTo(TcbSize, Out<ELF64LE>::TlsPhdr->p_align); 1192 uint64_t X = Val + TPOff; 1193 checkUInt<32>(X, Type); 1194 1195 uint32_t NewInst; 1196 switch (Type) { 1197 case R_AARCH64_TLSDESC_ADD_LO12_NC: 1198 case R_AARCH64_TLSDESC_CALL: 1199 // nop 1200 NewInst = 0xd503201f; 1201 break; 1202 case R_AARCH64_TLSDESC_ADR_PAGE21: 1203 // movz 1204 NewInst = 0xd2a00000 | (((X >> 16) & 0xffff) << 5); 1205 break; 1206 case R_AARCH64_TLSDESC_LD64_LO12_NC: 1207 // movk 1208 NewInst = 0xf2800000 | ((X & 0xffff) << 5); 1209 break; 1210 default: 1211 llvm_unreachable("unsupported Relocation for TLS GD to LE relax"); 1212 } 1213 write32le(Loc, NewInst); 1214 } 1215 1216 void AArch64TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, 1217 uint64_t Val) const { 1218 uint64_t TPOff = llvm::alignTo(TcbSize, Out<ELF64LE>::TlsPhdr->p_align); 1219 uint64_t X = Val + TPOff; 1220 checkUInt<32>(X, Type); 1221 1222 uint32_t Inst = read32le(Loc); 1223 uint32_t NewInst; 1224 if (Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) { 1225 // Generate movz. 1226 unsigned RegNo = (Inst & 0x1f); 1227 NewInst = (0xd2a00000 | RegNo) | (((X >> 16) & 0xffff) << 5); 1228 } else if (Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) { 1229 // Generate movk 1230 unsigned RegNo = (Inst & 0x1f); 1231 NewInst = (0xf2800000 | RegNo) | ((X & 0xffff) << 5); 1232 } else { 1233 llvm_unreachable("invalid Relocation for TLS IE to LE Relax"); 1234 } 1235 write32le(Loc, NewInst); 1236 } 1237 1238 // Implementing relocations for AMDGPU is low priority since most 1239 // programs don't use relocations now. Thus, this function is not 1240 // actually called (relocateOne is called for each relocation). 1241 // That's why the AMDGPU port works without implementing this function. 1242 void AMDGPUTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, 1243 uint64_t Val) const { 1244 llvm_unreachable("not implemented"); 1245 } 1246 1247 RelExpr AMDGPUTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { 1248 llvm_unreachable("not implemented"); 1249 } 1250 1251 template <class ELFT> MipsTargetInfo<ELFT>::MipsTargetInfo() { 1252 GotPltHeaderEntriesNum = 2; 1253 PageSize = 65536; 1254 PltEntrySize = 16; 1255 PltZeroSize = 32; 1256 ThunkSize = 16; 1257 UseLazyBinding = true; 1258 CopyRel = R_MIPS_COPY; 1259 PltRel = R_MIPS_JUMP_SLOT; 1260 RelativeRel = R_MIPS_REL32; 1261 } 1262 1263 template <class ELFT> 1264 RelExpr MipsTargetInfo<ELFT>::getRelExpr(uint32_t Type, 1265 const SymbolBody &S) const { 1266 switch (Type) { 1267 default: 1268 return R_ABS; 1269 case R_MIPS_GPREL16: 1270 case R_MIPS_GPREL32: 1271 return R_GOTREL; 1272 case R_MIPS_26: 1273 return R_PLT; 1274 case R_MIPS_HI16: 1275 case R_MIPS_LO16: 1276 // MIPS _gp_disp designates offset between start of function and 'gp' 1277 // pointer into GOT. __gnu_local_gp is equal to the current value of 1278 // the 'gp'. Therefore any relocations against them do not require 1279 // dynamic relocation. 1280 if (&S == ElfSym<ELFT>::MipsGpDisp) 1281 return R_PC; 1282 return R_ABS; 1283 case R_MIPS_PC32: 1284 case R_MIPS_PC16: 1285 case R_MIPS_PC19_S2: 1286 case R_MIPS_PC21_S2: 1287 case R_MIPS_PC26_S2: 1288 case R_MIPS_PCHI16: 1289 case R_MIPS_PCLO16: 1290 return R_PC; 1291 case R_MIPS_GOT16: 1292 case R_MIPS_CALL16: 1293 if (S.isLocal()) 1294 return R_MIPS_GOT_LOCAL; 1295 if (!S.isPreemptible()) 1296 return R_MIPS_GOT; 1297 return R_GOT_OFF; 1298 } 1299 } 1300 1301 template <class ELFT> 1302 uint32_t MipsTargetInfo<ELFT>::getDynRel(uint32_t Type) const { 1303 if (Type == R_MIPS_32 || Type == R_MIPS_64) 1304 return R_MIPS_REL32; 1305 StringRef S = getELFRelocationTypeName(EM_MIPS, Type); 1306 error("relocation " + S + " cannot be used when making a shared object; " 1307 "recompile with -fPIC."); 1308 // Keep it going with a dummy value so that we can find more reloc errors. 1309 return R_MIPS_32; 1310 } 1311 1312 template <class ELFT> 1313 void MipsTargetInfo<ELFT>::writeGotPlt(uint8_t *Buf, uint64_t Plt) const { 1314 write32<ELFT::TargetEndianness>(Buf, Out<ELFT>::Plt->getVA()); 1315 } 1316 1317 static uint16_t mipsHigh(uint64_t V) { return (V + 0x8000) >> 16; } 1318 1319 template <endianness E, uint8_t BSIZE, uint8_t SHIFT> 1320 static int64_t getPcRelocAddend(const uint8_t *Loc) { 1321 uint32_t Instr = read32<E>(Loc); 1322 uint32_t Mask = 0xffffffff >> (32 - BSIZE); 1323 return SignExtend64<BSIZE + SHIFT>((Instr & Mask) << SHIFT); 1324 } 1325 1326 template <endianness E, uint8_t BSIZE, uint8_t SHIFT> 1327 static void applyMipsPcReloc(uint8_t *Loc, uint32_t Type, uint64_t V) { 1328 uint32_t Mask = 0xffffffff >> (32 - BSIZE); 1329 uint32_t Instr = read32<E>(Loc); 1330 if (SHIFT > 0) 1331 checkAlignment<(1 << SHIFT)>(V, Type); 1332 checkInt<BSIZE + SHIFT>(V, Type); 1333 write32<E>(Loc, (Instr & ~Mask) | ((V >> SHIFT) & Mask)); 1334 } 1335 1336 template <endianness E> 1337 static void writeMipsHi16(uint8_t *Loc, uint64_t V) { 1338 uint32_t Instr = read32<E>(Loc); 1339 write32<E>(Loc, (Instr & 0xffff0000) | mipsHigh(V)); 1340 } 1341 1342 template <endianness E> 1343 static void writeMipsLo16(uint8_t *Loc, uint64_t V) { 1344 uint32_t Instr = read32<E>(Loc); 1345 write32<E>(Loc, (Instr & 0xffff0000) | (V & 0xffff)); 1346 } 1347 1348 template <endianness E> static int16_t readSignedLo16(const uint8_t *Loc) { 1349 return SignExtend32<16>(read32<E>(Loc) & 0xffff); 1350 } 1351 1352 template <class ELFT> 1353 void MipsTargetInfo<ELFT>::writePltZero(uint8_t *Buf) const { 1354 const endianness E = ELFT::TargetEndianness; 1355 write32<E>(Buf, 0x3c1c0000); // lui $28, %hi(&GOTPLT[0]) 1356 write32<E>(Buf + 4, 0x8f990000); // lw $25, %lo(&GOTPLT[0])($28) 1357 write32<E>(Buf + 8, 0x279c0000); // addiu $28, $28, %lo(&GOTPLT[0]) 1358 write32<E>(Buf + 12, 0x031cc023); // subu $24, $24, $28 1359 write32<E>(Buf + 16, 0x03e07825); // move $15, $31 1360 write32<E>(Buf + 20, 0x0018c082); // srl $24, $24, 2 1361 write32<E>(Buf + 24, 0x0320f809); // jalr $25 1362 write32<E>(Buf + 28, 0x2718fffe); // subu $24, $24, 2 1363 uint64_t Got = Out<ELFT>::GotPlt->getVA(); 1364 writeMipsHi16<E>(Buf, Got); 1365 writeMipsLo16<E>(Buf + 4, Got); 1366 writeMipsLo16<E>(Buf + 8, Got); 1367 } 1368 1369 template <class ELFT> 1370 void MipsTargetInfo<ELFT>::writePlt(uint8_t *Buf, uint64_t GotEntryAddr, 1371 uint64_t PltEntryAddr, int32_t Index, 1372 unsigned RelOff) const { 1373 const endianness E = ELFT::TargetEndianness; 1374 write32<E>(Buf, 0x3c0f0000); // lui $15, %hi(.got.plt entry) 1375 write32<E>(Buf + 4, 0x8df90000); // l[wd] $25, %lo(.got.plt entry)($15) 1376 write32<E>(Buf + 8, 0x03200008); // jr $25 1377 write32<E>(Buf + 12, 0x25f80000); // addiu $24, $15, %lo(.got.plt entry) 1378 writeMipsHi16<E>(Buf, GotEntryAddr); 1379 writeMipsLo16<E>(Buf + 4, GotEntryAddr); 1380 writeMipsLo16<E>(Buf + 12, GotEntryAddr); 1381 } 1382 1383 template <class ELFT> 1384 void MipsTargetInfo<ELFT>::writeThunk(uint8_t *Buf, uint64_t S) const { 1385 // Write MIPS LA25 thunk code to call PIC function from the non-PIC one. 1386 // See MipsTargetInfo::writeThunk for details. 1387 const endianness E = ELFT::TargetEndianness; 1388 write32<E>(Buf, 0x3c190000); // lui $25, %hi(func) 1389 write32<E>(Buf + 4, 0x08000000); // j func 1390 write32<E>(Buf + 8, 0x27390000); // addiu $25, $25, %lo(func) 1391 write32<E>(Buf + 12, 0x00000000); // nop 1392 writeMipsHi16<E>(Buf, S); 1393 write32<E>(Buf + 4, 0x08000000 | (S >> 2)); 1394 writeMipsLo16<E>(Buf + 8, S); 1395 } 1396 1397 template <class ELFT> 1398 bool MipsTargetInfo<ELFT>::needsThunk(uint32_t Type, const InputFile &File, 1399 const SymbolBody &S) const { 1400 // Any MIPS PIC code function is invoked with its address in register $t9. 1401 // So if we have a branch instruction from non-PIC code to the PIC one 1402 // we cannot make the jump directly and need to create a small stubs 1403 // to save the target function address. 1404 // See page 3-38 ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 1405 if (Type != R_MIPS_26) 1406 return false; 1407 auto *F = dyn_cast<ELFFileBase<ELFT>>(&File); 1408 if (!F) 1409 return false; 1410 // If current file has PIC code, LA25 stub is not required. 1411 if (F->getObj().getHeader()->e_flags & EF_MIPS_PIC) 1412 return false; 1413 auto *D = dyn_cast<DefinedRegular<ELFT>>(&S); 1414 if (!D || !D->Section) 1415 return false; 1416 // LA25 is required if target file has PIC code 1417 // or target symbol is a PIC symbol. 1418 return (D->Section->getFile()->getObj().getHeader()->e_flags & EF_MIPS_PIC) || 1419 (D->StOther & STO_MIPS_MIPS16) == STO_MIPS_PIC; 1420 } 1421 1422 template <class ELFT> 1423 uint64_t MipsTargetInfo<ELFT>::getImplicitAddend(const uint8_t *Buf, 1424 uint32_t Type) const { 1425 const endianness E = ELFT::TargetEndianness; 1426 switch (Type) { 1427 default: 1428 return 0; 1429 case R_MIPS_32: 1430 case R_MIPS_GPREL32: 1431 return read32<E>(Buf); 1432 case R_MIPS_26: 1433 // FIXME (simon): If the relocation target symbol is not a PLT entry 1434 // we should use another expression for calculation: 1435 // ((A << 2) | (P & 0xf0000000)) >> 2 1436 return SignExtend64<28>((read32<E>(Buf) & 0x3ffffff) << 2); 1437 case R_MIPS_GPREL16: 1438 case R_MIPS_LO16: 1439 case R_MIPS_PCLO16: 1440 case R_MIPS_TLS_DTPREL_HI16: 1441 case R_MIPS_TLS_DTPREL_LO16: 1442 case R_MIPS_TLS_TPREL_HI16: 1443 case R_MIPS_TLS_TPREL_LO16: 1444 return readSignedLo16<E>(Buf); 1445 case R_MIPS_PC16: 1446 return getPcRelocAddend<E, 16, 2>(Buf); 1447 case R_MIPS_PC19_S2: 1448 return getPcRelocAddend<E, 19, 2>(Buf); 1449 case R_MIPS_PC21_S2: 1450 return getPcRelocAddend<E, 21, 2>(Buf); 1451 case R_MIPS_PC26_S2: 1452 return getPcRelocAddend<E, 26, 2>(Buf); 1453 case R_MIPS_PC32: 1454 return getPcRelocAddend<E, 32, 0>(Buf); 1455 } 1456 } 1457 1458 template <class ELFT> 1459 void MipsTargetInfo<ELFT>::relocateOne(uint8_t *Loc, uint32_t Type, 1460 uint64_t Val) const { 1461 const endianness E = ELFT::TargetEndianness; 1462 // Thread pointer and DRP offsets from the start of TLS data area. 1463 // https://www.linux-mips.org/wiki/NPTL 1464 const uint32_t TPOffset = 0x7000; 1465 const uint32_t DTPOffset = 0x8000; 1466 switch (Type) { 1467 case R_MIPS_32: 1468 write32<E>(Loc, Val); 1469 break; 1470 case R_MIPS_26: { 1471 uint32_t Instr = read32<E>(Loc); 1472 write32<E>(Loc, (Instr & ~0x3ffffff) | (Val >> 2)); 1473 break; 1474 } 1475 case R_MIPS_GOT16: 1476 checkInt<16>(Val, Type); 1477 // fallthrough 1478 case R_MIPS_CALL16: 1479 writeMipsLo16<E>(Loc, Val); 1480 break; 1481 case R_MIPS_GPREL16: { 1482 int64_t V = Val - MipsGPOffset; 1483 checkInt<16>(V, Type); 1484 writeMipsLo16<E>(Loc, V); 1485 break; 1486 } 1487 case R_MIPS_GPREL32: 1488 write32<E>(Loc, Val - MipsGPOffset); 1489 break; 1490 case R_MIPS_HI16: 1491 writeMipsHi16<E>(Loc, Val); 1492 break; 1493 case R_MIPS_JALR: 1494 // Ignore this optimization relocation for now 1495 break; 1496 case R_MIPS_LO16: 1497 writeMipsLo16<E>(Loc, Val); 1498 break; 1499 case R_MIPS_PC16: 1500 applyMipsPcReloc<E, 16, 2>(Loc, Type, Val); 1501 break; 1502 case R_MIPS_PC19_S2: 1503 applyMipsPcReloc<E, 19, 2>(Loc, Type, Val); 1504 break; 1505 case R_MIPS_PC21_S2: 1506 applyMipsPcReloc<E, 21, 2>(Loc, Type, Val); 1507 break; 1508 case R_MIPS_PC26_S2: 1509 applyMipsPcReloc<E, 26, 2>(Loc, Type, Val); 1510 break; 1511 case R_MIPS_PC32: 1512 applyMipsPcReloc<E, 32, 0>(Loc, Type, Val); 1513 break; 1514 case R_MIPS_PCHI16: 1515 writeMipsHi16<E>(Loc, Val); 1516 break; 1517 case R_MIPS_PCLO16: 1518 writeMipsLo16<E>(Loc, Val); 1519 break; 1520 case R_MIPS_TLS_DTPREL_HI16: 1521 writeMipsHi16<E>(Loc, Val - DTPOffset); 1522 break; 1523 case R_MIPS_TLS_DTPREL_LO16: 1524 writeMipsLo16<E>(Loc, Val - DTPOffset); 1525 break; 1526 case R_MIPS_TLS_TPREL_HI16: 1527 writeMipsHi16<E>(Loc, Val - TPOffset); 1528 break; 1529 case R_MIPS_TLS_TPREL_LO16: 1530 writeMipsLo16<E>(Loc, Val - TPOffset); 1531 break; 1532 default: 1533 fatal("unrecognized reloc " + Twine(Type)); 1534 } 1535 } 1536 1537 template <class ELFT> 1538 bool MipsTargetInfo<ELFT>::isHintRel(uint32_t Type) const { 1539 return Type == R_MIPS_JALR; 1540 } 1541 1542 template <class ELFT> 1543 bool MipsTargetInfo<ELFT>::usesOnlyLowPageBits(uint32_t Type) const { 1544 return Type == R_MIPS_LO16; 1545 } 1546 } 1547 } 1548