1 //===-- RuntimeDyldELF.cpp - Run-time dynamic linker for MC-JIT -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Implementation of ELF support for the MC-JIT runtime dynamic linker. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "RuntimeDyldELF.h" 15 #include "RuntimeDyldCheckerImpl.h" 16 #include "llvm/ADT/IntervalMap.h" 17 #include "llvm/ADT/STLExtras.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/ADT/Triple.h" 20 #include "llvm/MC/MCStreamer.h" 21 #include "llvm/Object/ELFObjectFile.h" 22 #include "llvm/Object/ObjectFile.h" 23 #include "llvm/Support/ELF.h" 24 #include "llvm/Support/Endian.h" 25 #include "llvm/Support/MemoryBuffer.h" 26 #include "llvm/Support/TargetRegistry.h" 27 28 using namespace llvm; 29 using namespace llvm::object; 30 31 #define DEBUG_TYPE "dyld" 32 33 static inline std::error_code check(std::error_code Err) { 34 if (Err) { 35 report_fatal_error(Err.message()); 36 } 37 return Err; 38 } 39 40 namespace { 41 42 template <class ELFT> class DyldELFObject : public ELFObjectFile<ELFT> { 43 LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 44 45 typedef Elf_Shdr_Impl<ELFT> Elf_Shdr; 46 typedef Elf_Sym_Impl<ELFT> Elf_Sym; 47 typedef Elf_Rel_Impl<ELFT, false> Elf_Rel; 48 typedef Elf_Rel_Impl<ELFT, true> Elf_Rela; 49 50 typedef Elf_Ehdr_Impl<ELFT> Elf_Ehdr; 51 52 typedef typename ELFDataTypeTypedefHelper<ELFT>::value_type addr_type; 53 54 public: 55 DyldELFObject(MemoryBufferRef Wrapper, std::error_code &ec); 56 57 void updateSectionAddress(const SectionRef &Sec, uint64_t Addr); 58 59 void updateSymbolAddress(const SymbolRef &SymRef, uint64_t Addr); 60 61 // Methods for type inquiry through isa, cast and dyn_cast 62 static inline bool classof(const Binary *v) { 63 return (isa<ELFObjectFile<ELFT>>(v) && 64 classof(cast<ELFObjectFile<ELFT>>(v))); 65 } 66 static inline bool classof(const ELFObjectFile<ELFT> *v) { 67 return v->isDyldType(); 68 } 69 70 }; 71 72 73 74 // The MemoryBuffer passed into this constructor is just a wrapper around the 75 // actual memory. Ultimately, the Binary parent class will take ownership of 76 // this MemoryBuffer object but not the underlying memory. 77 template <class ELFT> 78 DyldELFObject<ELFT>::DyldELFObject(MemoryBufferRef Wrapper, std::error_code &EC) 79 : ELFObjectFile<ELFT>(Wrapper, EC) { 80 this->isDyldELFObject = true; 81 } 82 83 template <class ELFT> 84 void DyldELFObject<ELFT>::updateSectionAddress(const SectionRef &Sec, 85 uint64_t Addr) { 86 DataRefImpl ShdrRef = Sec.getRawDataRefImpl(); 87 Elf_Shdr *shdr = 88 const_cast<Elf_Shdr *>(reinterpret_cast<const Elf_Shdr *>(ShdrRef.p)); 89 90 // This assumes the address passed in matches the target address bitness 91 // The template-based type cast handles everything else. 92 shdr->sh_addr = static_cast<addr_type>(Addr); 93 } 94 95 template <class ELFT> 96 void DyldELFObject<ELFT>::updateSymbolAddress(const SymbolRef &SymRef, 97 uint64_t Addr) { 98 99 Elf_Sym *sym = const_cast<Elf_Sym *>( 100 ELFObjectFile<ELFT>::getSymbol(SymRef.getRawDataRefImpl())); 101 102 // This assumes the address passed in matches the target address bitness 103 // The template-based type cast handles everything else. 104 sym->st_value = static_cast<addr_type>(Addr); 105 } 106 107 class LoadedELFObjectInfo 108 : public RuntimeDyld::LoadedObjectInfoHelper<LoadedELFObjectInfo> { 109 public: 110 LoadedELFObjectInfo(RuntimeDyldImpl &RTDyld, unsigned BeginIdx, 111 unsigned EndIdx) 112 : LoadedObjectInfoHelper(RTDyld, BeginIdx, EndIdx) {} 113 114 OwningBinary<ObjectFile> 115 getObjectForDebug(const ObjectFile &Obj) const override; 116 }; 117 118 template <typename ELFT> 119 std::unique_ptr<DyldELFObject<ELFT>> 120 createRTDyldELFObject(MemoryBufferRef Buffer, 121 const LoadedELFObjectInfo &L, 122 std::error_code &ec) { 123 typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr; 124 typedef typename ELFDataTypeTypedefHelper<ELFT>::value_type addr_type; 125 126 std::unique_ptr<DyldELFObject<ELFT>> Obj = 127 llvm::make_unique<DyldELFObject<ELFT>>(Buffer, ec); 128 129 // Iterate over all sections in the object. 130 for (const auto &Sec : Obj->sections()) { 131 StringRef SectionName; 132 Sec.getName(SectionName); 133 if (SectionName != "") { 134 DataRefImpl ShdrRef = Sec.getRawDataRefImpl(); 135 Elf_Shdr *shdr = const_cast<Elf_Shdr *>( 136 reinterpret_cast<const Elf_Shdr *>(ShdrRef.p)); 137 138 if (uint64_t SecLoadAddr = L.getSectionLoadAddress(SectionName)) { 139 // This assumes that the address passed in matches the target address 140 // bitness. The template-based type cast handles everything else. 141 shdr->sh_addr = static_cast<addr_type>(SecLoadAddr); 142 } 143 } 144 } 145 146 return Obj; 147 } 148 149 OwningBinary<ObjectFile> createELFDebugObject(const ObjectFile &Obj, 150 const LoadedELFObjectInfo &L) { 151 assert(Obj.isELF() && "Not an ELF object file."); 152 153 std::unique_ptr<MemoryBuffer> Buffer = 154 MemoryBuffer::getMemBufferCopy(Obj.getData(), Obj.getFileName()); 155 156 std::error_code ec; 157 158 std::unique_ptr<ObjectFile> DebugObj; 159 if (Obj.getBytesInAddress() == 4 && Obj.isLittleEndian()) { 160 typedef ELFType<support::little, false> ELF32LE; 161 DebugObj = createRTDyldELFObject<ELF32LE>(Buffer->getMemBufferRef(), L, ec); 162 } else if (Obj.getBytesInAddress() == 4 && !Obj.isLittleEndian()) { 163 typedef ELFType<support::big, false> ELF32BE; 164 DebugObj = createRTDyldELFObject<ELF32BE>(Buffer->getMemBufferRef(), L, ec); 165 } else if (Obj.getBytesInAddress() == 8 && !Obj.isLittleEndian()) { 166 typedef ELFType<support::big, true> ELF64BE; 167 DebugObj = createRTDyldELFObject<ELF64BE>(Buffer->getMemBufferRef(), L, ec); 168 } else if (Obj.getBytesInAddress() == 8 && Obj.isLittleEndian()) { 169 typedef ELFType<support::little, true> ELF64LE; 170 DebugObj = createRTDyldELFObject<ELF64LE>(Buffer->getMemBufferRef(), L, ec); 171 } else 172 llvm_unreachable("Unexpected ELF format"); 173 174 assert(!ec && "Could not construct copy ELF object file"); 175 176 return OwningBinary<ObjectFile>(std::move(DebugObj), std::move(Buffer)); 177 } 178 179 OwningBinary<ObjectFile> 180 LoadedELFObjectInfo::getObjectForDebug(const ObjectFile &Obj) const { 181 return createELFDebugObject(Obj, *this); 182 } 183 184 } // namespace 185 186 namespace llvm { 187 188 RuntimeDyldELF::RuntimeDyldELF(RuntimeDyld::MemoryManager &MemMgr, 189 RuntimeDyld::SymbolResolver &Resolver) 190 : RuntimeDyldImpl(MemMgr, Resolver), GOTSectionID(0), CurrentGOTIndex(0) {} 191 RuntimeDyldELF::~RuntimeDyldELF() {} 192 193 void RuntimeDyldELF::registerEHFrames() { 194 for (int i = 0, e = UnregisteredEHFrameSections.size(); i != e; ++i) { 195 SID EHFrameSID = UnregisteredEHFrameSections[i]; 196 uint8_t *EHFrameAddr = Sections[EHFrameSID].Address; 197 uint64_t EHFrameLoadAddr = Sections[EHFrameSID].LoadAddress; 198 size_t EHFrameSize = Sections[EHFrameSID].Size; 199 MemMgr.registerEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize); 200 RegisteredEHFrameSections.push_back(EHFrameSID); 201 } 202 UnregisteredEHFrameSections.clear(); 203 } 204 205 void RuntimeDyldELF::deregisterEHFrames() { 206 for (int i = 0, e = RegisteredEHFrameSections.size(); i != e; ++i) { 207 SID EHFrameSID = RegisteredEHFrameSections[i]; 208 uint8_t *EHFrameAddr = Sections[EHFrameSID].Address; 209 uint64_t EHFrameLoadAddr = Sections[EHFrameSID].LoadAddress; 210 size_t EHFrameSize = Sections[EHFrameSID].Size; 211 MemMgr.deregisterEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize); 212 } 213 RegisteredEHFrameSections.clear(); 214 } 215 216 std::unique_ptr<RuntimeDyld::LoadedObjectInfo> 217 RuntimeDyldELF::loadObject(const object::ObjectFile &O) { 218 unsigned SectionStartIdx, SectionEndIdx; 219 std::tie(SectionStartIdx, SectionEndIdx) = loadObjectImpl(O); 220 return llvm::make_unique<LoadedELFObjectInfo>(*this, SectionStartIdx, 221 SectionEndIdx); 222 } 223 224 void RuntimeDyldELF::resolveX86_64Relocation(const SectionEntry &Section, 225 uint64_t Offset, uint64_t Value, 226 uint32_t Type, int64_t Addend, 227 uint64_t SymOffset) { 228 switch (Type) { 229 default: 230 llvm_unreachable("Relocation type not implemented yet!"); 231 break; 232 case ELF::R_X86_64_64: { 233 support::ulittle64_t::ref(Section.Address + Offset) = Value + Addend; 234 DEBUG(dbgs() << "Writing " << format("%p", (Value + Addend)) << " at " 235 << format("%p\n", Section.Address + Offset)); 236 break; 237 } 238 case ELF::R_X86_64_32: 239 case ELF::R_X86_64_32S: { 240 Value += Addend; 241 assert((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) || 242 (Type == ELF::R_X86_64_32S && 243 ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN))); 244 uint32_t TruncatedAddr = (Value & 0xFFFFFFFF); 245 support::ulittle32_t::ref(Section.Address + Offset) = TruncatedAddr; 246 DEBUG(dbgs() << "Writing " << format("%p", TruncatedAddr) << " at " 247 << format("%p\n", Section.Address + Offset)); 248 break; 249 } 250 case ELF::R_X86_64_PC32: { 251 uint64_t FinalAddress = Section.LoadAddress + Offset; 252 int64_t RealOffset = Value + Addend - FinalAddress; 253 assert(isInt<32>(RealOffset)); 254 int32_t TruncOffset = (RealOffset & 0xFFFFFFFF); 255 support::ulittle32_t::ref(Section.Address + Offset) = TruncOffset; 256 break; 257 } 258 case ELF::R_X86_64_PC64: { 259 uint64_t FinalAddress = Section.LoadAddress + Offset; 260 int64_t RealOffset = Value + Addend - FinalAddress; 261 support::ulittle64_t::ref(Section.Address + Offset) = RealOffset; 262 break; 263 } 264 } 265 } 266 267 void RuntimeDyldELF::resolveX86Relocation(const SectionEntry &Section, 268 uint64_t Offset, uint32_t Value, 269 uint32_t Type, int32_t Addend) { 270 switch (Type) { 271 case ELF::R_386_32: { 272 support::ulittle32_t::ref(Section.Address + Offset) = Value + Addend; 273 break; 274 } 275 case ELF::R_386_PC32: { 276 uint32_t FinalAddress = ((Section.LoadAddress + Offset) & 0xFFFFFFFF); 277 uint32_t RealOffset = Value + Addend - FinalAddress; 278 support::ulittle32_t::ref(Section.Address + Offset) = RealOffset; 279 break; 280 } 281 default: 282 // There are other relocation types, but it appears these are the 283 // only ones currently used by the LLVM ELF object writer 284 llvm_unreachable("Relocation type not implemented yet!"); 285 break; 286 } 287 } 288 289 void RuntimeDyldELF::resolveAArch64Relocation(const SectionEntry &Section, 290 uint64_t Offset, uint64_t Value, 291 uint32_t Type, int64_t Addend) { 292 uint32_t *TargetPtr = reinterpret_cast<uint32_t *>(Section.Address + Offset); 293 uint64_t FinalAddress = Section.LoadAddress + Offset; 294 295 DEBUG(dbgs() << "resolveAArch64Relocation, LocalAddress: 0x" 296 << format("%llx", Section.Address + Offset) 297 << " FinalAddress: 0x" << format("%llx", FinalAddress) 298 << " Value: 0x" << format("%llx", Value) << " Type: 0x" 299 << format("%x", Type) << " Addend: 0x" << format("%llx", Addend) 300 << "\n"); 301 302 switch (Type) { 303 default: 304 llvm_unreachable("Relocation type not implemented yet!"); 305 break; 306 case ELF::R_AARCH64_ABS64: { 307 uint64_t *TargetPtr = 308 reinterpret_cast<uint64_t *>(Section.Address + Offset); 309 *TargetPtr = Value + Addend; 310 break; 311 } 312 case ELF::R_AARCH64_PREL32: { 313 uint64_t Result = Value + Addend - FinalAddress; 314 assert(static_cast<int64_t>(Result) >= INT32_MIN && 315 static_cast<int64_t>(Result) <= UINT32_MAX); 316 *TargetPtr = static_cast<uint32_t>(Result & 0xffffffffU); 317 break; 318 } 319 case ELF::R_AARCH64_CALL26: // fallthrough 320 case ELF::R_AARCH64_JUMP26: { 321 // Operation: S+A-P. Set Call or B immediate value to bits fff_fffc of the 322 // calculation. 323 uint64_t BranchImm = Value + Addend - FinalAddress; 324 325 // "Check that -2^27 <= result < 2^27". 326 assert(isInt<28>(BranchImm)); 327 328 // AArch64 code is emitted with .rela relocations. The data already in any 329 // bits affected by the relocation on entry is garbage. 330 *TargetPtr &= 0xfc000000U; 331 // Immediate goes in bits 25:0 of B and BL. 332 *TargetPtr |= static_cast<uint32_t>(BranchImm & 0xffffffcU) >> 2; 333 break; 334 } 335 case ELF::R_AARCH64_MOVW_UABS_G3: { 336 uint64_t Result = Value + Addend; 337 338 // AArch64 code is emitted with .rela relocations. The data already in any 339 // bits affected by the relocation on entry is garbage. 340 *TargetPtr &= 0xffe0001fU; 341 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 342 *TargetPtr |= Result >> (48 - 5); 343 // Shift must be "lsl #48", in bits 22:21 344 assert((*TargetPtr >> 21 & 0x3) == 3 && "invalid shift for relocation"); 345 break; 346 } 347 case ELF::R_AARCH64_MOVW_UABS_G2_NC: { 348 uint64_t Result = Value + Addend; 349 350 // AArch64 code is emitted with .rela relocations. The data already in any 351 // bits affected by the relocation on entry is garbage. 352 *TargetPtr &= 0xffe0001fU; 353 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 354 *TargetPtr |= ((Result & 0xffff00000000ULL) >> (32 - 5)); 355 // Shift must be "lsl #32", in bits 22:21 356 assert((*TargetPtr >> 21 & 0x3) == 2 && "invalid shift for relocation"); 357 break; 358 } 359 case ELF::R_AARCH64_MOVW_UABS_G1_NC: { 360 uint64_t Result = Value + Addend; 361 362 // AArch64 code is emitted with .rela relocations. The data already in any 363 // bits affected by the relocation on entry is garbage. 364 *TargetPtr &= 0xffe0001fU; 365 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 366 *TargetPtr |= ((Result & 0xffff0000U) >> (16 - 5)); 367 // Shift must be "lsl #16", in bits 22:2 368 assert((*TargetPtr >> 21 & 0x3) == 1 && "invalid shift for relocation"); 369 break; 370 } 371 case ELF::R_AARCH64_MOVW_UABS_G0_NC: { 372 uint64_t Result = Value + Addend; 373 374 // AArch64 code is emitted with .rela relocations. The data already in any 375 // bits affected by the relocation on entry is garbage. 376 *TargetPtr &= 0xffe0001fU; 377 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 378 *TargetPtr |= ((Result & 0xffffU) << 5); 379 // Shift must be "lsl #0", in bits 22:21. 380 assert((*TargetPtr >> 21 & 0x3) == 0 && "invalid shift for relocation"); 381 break; 382 } 383 case ELF::R_AARCH64_ADR_PREL_PG_HI21: { 384 // Operation: Page(S+A) - Page(P) 385 uint64_t Result = 386 ((Value + Addend) & ~0xfffULL) - (FinalAddress & ~0xfffULL); 387 388 // Check that -2^32 <= X < 2^32 389 assert(isInt<33>(Result) && "overflow check failed for relocation"); 390 391 // AArch64 code is emitted with .rela relocations. The data already in any 392 // bits affected by the relocation on entry is garbage. 393 *TargetPtr &= 0x9f00001fU; 394 // Immediate goes in bits 30:29 + 5:23 of ADRP instruction, taken 395 // from bits 32:12 of X. 396 *TargetPtr |= ((Result & 0x3000U) << (29 - 12)); 397 *TargetPtr |= ((Result & 0x1ffffc000ULL) >> (14 - 5)); 398 break; 399 } 400 case ELF::R_AARCH64_LDST32_ABS_LO12_NC: { 401 // Operation: S + A 402 uint64_t Result = Value + Addend; 403 404 // AArch64 code is emitted with .rela relocations. The data already in any 405 // bits affected by the relocation on entry is garbage. 406 *TargetPtr &= 0xffc003ffU; 407 // Immediate goes in bits 21:10 of LD/ST instruction, taken 408 // from bits 11:2 of X 409 *TargetPtr |= ((Result & 0xffc) << (10 - 2)); 410 break; 411 } 412 case ELF::R_AARCH64_LDST64_ABS_LO12_NC: { 413 // Operation: S + A 414 uint64_t Result = Value + Addend; 415 416 // AArch64 code is emitted with .rela relocations. The data already in any 417 // bits affected by the relocation on entry is garbage. 418 *TargetPtr &= 0xffc003ffU; 419 // Immediate goes in bits 21:10 of LD/ST instruction, taken 420 // from bits 11:3 of X 421 *TargetPtr |= ((Result & 0xff8) << (10 - 3)); 422 break; 423 } 424 } 425 } 426 427 void RuntimeDyldELF::resolveARMRelocation(const SectionEntry &Section, 428 uint64_t Offset, uint32_t Value, 429 uint32_t Type, int32_t Addend) { 430 // TODO: Add Thumb relocations. 431 uint32_t *TargetPtr = (uint32_t *)(Section.Address + Offset); 432 uint32_t FinalAddress = ((Section.LoadAddress + Offset) & 0xFFFFFFFF); 433 Value += Addend; 434 435 DEBUG(dbgs() << "resolveARMRelocation, LocalAddress: " 436 << Section.Address + Offset 437 << " FinalAddress: " << format("%p", FinalAddress) << " Value: " 438 << format("%x", Value) << " Type: " << format("%x", Type) 439 << " Addend: " << format("%x", Addend) << "\n"); 440 441 switch (Type) { 442 default: 443 llvm_unreachable("Not implemented relocation type!"); 444 445 case ELF::R_ARM_NONE: 446 break; 447 case ELF::R_ARM_PREL31: 448 case ELF::R_ARM_TARGET1: 449 case ELF::R_ARM_ABS32: 450 *TargetPtr = Value; 451 break; 452 // Write first 16 bit of 32 bit value to the mov instruction. 453 // Last 4 bit should be shifted. 454 case ELF::R_ARM_MOVW_ABS_NC: 455 case ELF::R_ARM_MOVT_ABS: 456 if (Type == ELF::R_ARM_MOVW_ABS_NC) 457 Value = Value & 0xFFFF; 458 else if (Type == ELF::R_ARM_MOVT_ABS) 459 Value = (Value >> 16) & 0xFFFF; 460 *TargetPtr &= ~0x000F0FFF; 461 *TargetPtr |= Value & 0xFFF; 462 *TargetPtr |= ((Value >> 12) & 0xF) << 16; 463 break; 464 // Write 24 bit relative value to the branch instruction. 465 case ELF::R_ARM_PC24: // Fall through. 466 case ELF::R_ARM_CALL: // Fall through. 467 case ELF::R_ARM_JUMP24: 468 int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8); 469 RelValue = (RelValue & 0x03FFFFFC) >> 2; 470 assert((*TargetPtr & 0xFFFFFF) == 0xFFFFFE); 471 *TargetPtr &= 0xFF000000; 472 *TargetPtr |= RelValue; 473 break; 474 } 475 } 476 477 void RuntimeDyldELF::resolveMIPSRelocation(const SectionEntry &Section, 478 uint64_t Offset, uint32_t Value, 479 uint32_t Type, int32_t Addend) { 480 uint8_t *TargetPtr = Section.Address + Offset; 481 Value += Addend; 482 483 DEBUG(dbgs() << "resolveMIPSRelocation, LocalAddress: " 484 << Section.Address + Offset << " FinalAddress: " 485 << format("%p", Section.LoadAddress + Offset) << " Value: " 486 << format("%x", Value) << " Type: " << format("%x", Type) 487 << " Addend: " << format("%x", Addend) << "\n"); 488 489 uint32_t Insn = readBytesUnaligned(TargetPtr, 4); 490 491 switch (Type) { 492 default: 493 llvm_unreachable("Not implemented relocation type!"); 494 break; 495 case ELF::R_MIPS_32: 496 writeBytesUnaligned(Value, TargetPtr, 4); 497 break; 498 case ELF::R_MIPS_26: 499 Insn &= 0xfc000000; 500 Insn |= (Value & 0x0fffffff) >> 2; 501 writeBytesUnaligned(Insn, TargetPtr, 4); 502 break; 503 case ELF::R_MIPS_HI16: 504 // Get the higher 16-bits. Also add 1 if bit 15 is 1. 505 Insn &= 0xffff0000; 506 Insn |= ((Value + 0x8000) >> 16) & 0xffff; 507 writeBytesUnaligned(Insn, TargetPtr, 4); 508 break; 509 case ELF::R_MIPS_LO16: 510 Insn &= 0xffff0000; 511 Insn |= Value & 0xffff; 512 writeBytesUnaligned(Insn, TargetPtr, 4); 513 break; 514 case ELF::R_MIPS_PC32: 515 uint32_t FinalAddress = (Section.LoadAddress + Offset); 516 writeBytesUnaligned(Value + Addend - FinalAddress, (uint8_t *)TargetPtr, 4); 517 break; 518 } 519 } 520 521 void RuntimeDyldELF::setMipsABI(const ObjectFile &Obj) { 522 if (Arch == Triple::UnknownArch || 523 !StringRef(Triple::getArchTypePrefix(Arch)).equals("mips")) { 524 IsMipsO32ABI = false; 525 IsMipsN64ABI = false; 526 return; 527 } 528 unsigned AbiVariant; 529 Obj.getPlatformFlags(AbiVariant); 530 IsMipsO32ABI = AbiVariant & ELF::EF_MIPS_ABI_O32; 531 IsMipsN64ABI = Obj.getFileFormatName().equals("ELF64-mips"); 532 if (AbiVariant & ELF::EF_MIPS_ABI2) 533 llvm_unreachable("Mips N32 ABI is not supported yet"); 534 } 535 536 void RuntimeDyldELF::resolveMIPS64Relocation(const SectionEntry &Section, 537 uint64_t Offset, uint64_t Value, 538 uint32_t Type, int64_t Addend, 539 uint64_t SymOffset, 540 SID SectionID) { 541 uint32_t r_type = Type & 0xff; 542 uint32_t r_type2 = (Type >> 8) & 0xff; 543 uint32_t r_type3 = (Type >> 16) & 0xff; 544 545 // RelType is used to keep information for which relocation type we are 546 // applying relocation. 547 uint32_t RelType = r_type; 548 int64_t CalculatedValue = evaluateMIPS64Relocation(Section, Offset, Value, 549 RelType, Addend, 550 SymOffset, SectionID); 551 if (r_type2 != ELF::R_MIPS_NONE) { 552 RelType = r_type2; 553 CalculatedValue = evaluateMIPS64Relocation(Section, Offset, 0, RelType, 554 CalculatedValue, SymOffset, 555 SectionID); 556 } 557 if (r_type3 != ELF::R_MIPS_NONE) { 558 RelType = r_type3; 559 CalculatedValue = evaluateMIPS64Relocation(Section, Offset, 0, RelType, 560 CalculatedValue, SymOffset, 561 SectionID); 562 } 563 applyMIPS64Relocation(Section.Address + Offset, CalculatedValue, RelType); 564 } 565 566 int64_t 567 RuntimeDyldELF::evaluateMIPS64Relocation(const SectionEntry &Section, 568 uint64_t Offset, uint64_t Value, 569 uint32_t Type, int64_t Addend, 570 uint64_t SymOffset, SID SectionID) { 571 572 DEBUG(dbgs() << "evaluateMIPS64Relocation, LocalAddress: 0x" 573 << format("%llx", Section.Address + Offset) 574 << " FinalAddress: 0x" 575 << format("%llx", Section.LoadAddress + Offset) 576 << " Value: 0x" << format("%llx", Value) << " Type: 0x" 577 << format("%x", Type) << " Addend: 0x" << format("%llx", Addend) 578 << " SymOffset: " << format("%x", SymOffset) 579 << "\n"); 580 581 switch (Type) { 582 default: 583 llvm_unreachable("Not implemented relocation type!"); 584 break; 585 case ELF::R_MIPS_JALR: 586 case ELF::R_MIPS_NONE: 587 break; 588 case ELF::R_MIPS_32: 589 case ELF::R_MIPS_64: 590 return Value + Addend; 591 case ELF::R_MIPS_26: 592 return ((Value + Addend) >> 2) & 0x3ffffff; 593 case ELF::R_MIPS_GPREL16: { 594 uint64_t GOTAddr = getSectionLoadAddress(SectionToGOTMap[SectionID]); 595 return Value + Addend - (GOTAddr + 0x7ff0); 596 } 597 case ELF::R_MIPS_SUB: 598 return Value - Addend; 599 case ELF::R_MIPS_HI16: 600 // Get the higher 16-bits. Also add 1 if bit 15 is 1. 601 return ((Value + Addend + 0x8000) >> 16) & 0xffff; 602 case ELF::R_MIPS_LO16: 603 return (Value + Addend) & 0xffff; 604 case ELF::R_MIPS_CALL16: 605 case ELF::R_MIPS_GOT_DISP: 606 case ELF::R_MIPS_GOT_PAGE: { 607 uint8_t *LocalGOTAddr = 608 getSectionAddress(SectionToGOTMap[SectionID]) + SymOffset; 609 uint64_t GOTEntry = readBytesUnaligned(LocalGOTAddr, 8); 610 611 Value += Addend; 612 if (Type == ELF::R_MIPS_GOT_PAGE) 613 Value = (Value + 0x8000) & ~0xffff; 614 615 if (GOTEntry) 616 assert(GOTEntry == Value && 617 "GOT entry has two different addresses."); 618 else 619 writeBytesUnaligned(Value, LocalGOTAddr, 8); 620 621 return (SymOffset - 0x7ff0) & 0xffff; 622 } 623 case ELF::R_MIPS_GOT_OFST: { 624 int64_t page = (Value + Addend + 0x8000) & ~0xffff; 625 return (Value + Addend - page) & 0xffff; 626 } 627 case ELF::R_MIPS_GPREL32: { 628 uint64_t GOTAddr = getSectionLoadAddress(SectionToGOTMap[SectionID]); 629 return Value + Addend - (GOTAddr + 0x7ff0); 630 } 631 case ELF::R_MIPS_PC16: { 632 uint64_t FinalAddress = (Section.LoadAddress + Offset); 633 return ((Value + Addend - FinalAddress - 4) >> 2) & 0xffff; 634 } 635 case ELF::R_MIPS_PC32: { 636 uint64_t FinalAddress = (Section.LoadAddress + Offset); 637 return Value + Addend - FinalAddress; 638 } 639 case ELF::R_MIPS_PC18_S3: { 640 uint64_t FinalAddress = (Section.LoadAddress + Offset); 641 return ((Value + Addend - ((FinalAddress | 7) ^ 7)) >> 3) & 0x3ffff; 642 } 643 case ELF::R_MIPS_PC19_S2: { 644 uint64_t FinalAddress = (Section.LoadAddress + Offset); 645 return ((Value + Addend - FinalAddress) >> 2) & 0x7ffff; 646 } 647 case ELF::R_MIPS_PC21_S2: { 648 uint64_t FinalAddress = (Section.LoadAddress + Offset); 649 return ((Value + Addend - FinalAddress) >> 2) & 0x1fffff; 650 } 651 case ELF::R_MIPS_PC26_S2: { 652 uint64_t FinalAddress = (Section.LoadAddress + Offset); 653 return ((Value + Addend - FinalAddress) >> 2) & 0x3ffffff; 654 } 655 case ELF::R_MIPS_PCHI16: { 656 uint64_t FinalAddress = (Section.LoadAddress + Offset); 657 return ((Value + Addend - FinalAddress + 0x8000) >> 16) & 0xffff; 658 } 659 case ELF::R_MIPS_PCLO16: { 660 uint64_t FinalAddress = (Section.LoadAddress + Offset); 661 return (Value + Addend - FinalAddress) & 0xffff; 662 } 663 } 664 return 0; 665 } 666 667 void RuntimeDyldELF::applyMIPS64Relocation(uint8_t *TargetPtr, 668 int64_t CalculatedValue, 669 uint32_t Type) { 670 uint32_t Insn = readBytesUnaligned(TargetPtr, 4); 671 672 switch (Type) { 673 default: 674 break; 675 case ELF::R_MIPS_32: 676 case ELF::R_MIPS_GPREL32: 677 case ELF::R_MIPS_PC32: 678 writeBytesUnaligned(CalculatedValue & 0xffffffff, TargetPtr, 4); 679 break; 680 case ELF::R_MIPS_64: 681 case ELF::R_MIPS_SUB: 682 writeBytesUnaligned(CalculatedValue, TargetPtr, 8); 683 break; 684 case ELF::R_MIPS_26: 685 case ELF::R_MIPS_PC26_S2: 686 Insn = (Insn & 0xfc000000) | CalculatedValue; 687 writeBytesUnaligned(Insn, TargetPtr, 4); 688 break; 689 case ELF::R_MIPS_GPREL16: 690 Insn = (Insn & 0xffff0000) | (CalculatedValue & 0xffff); 691 writeBytesUnaligned(Insn, TargetPtr, 4); 692 break; 693 case ELF::R_MIPS_HI16: 694 case ELF::R_MIPS_LO16: 695 case ELF::R_MIPS_PCHI16: 696 case ELF::R_MIPS_PCLO16: 697 case ELF::R_MIPS_PC16: 698 case ELF::R_MIPS_CALL16: 699 case ELF::R_MIPS_GOT_DISP: 700 case ELF::R_MIPS_GOT_PAGE: 701 case ELF::R_MIPS_GOT_OFST: 702 Insn = (Insn & 0xffff0000) | CalculatedValue; 703 writeBytesUnaligned(Insn, TargetPtr, 4); 704 break; 705 case ELF::R_MIPS_PC18_S3: 706 Insn = (Insn & 0xfffc0000) | CalculatedValue; 707 writeBytesUnaligned(Insn, TargetPtr, 4); 708 break; 709 case ELF::R_MIPS_PC19_S2: 710 Insn = (Insn & 0xfff80000) | CalculatedValue; 711 writeBytesUnaligned(Insn, TargetPtr, 4); 712 break; 713 case ELF::R_MIPS_PC21_S2: 714 Insn = (Insn & 0xffe00000) | CalculatedValue; 715 writeBytesUnaligned(Insn, TargetPtr, 4); 716 break; 717 } 718 } 719 720 // Return the .TOC. section and offset. 721 void RuntimeDyldELF::findPPC64TOCSection(const ObjectFile &Obj, 722 ObjSectionToIDMap &LocalSections, 723 RelocationValueRef &Rel) { 724 // Set a default SectionID in case we do not find a TOC section below. 725 // This may happen for references to TOC base base (sym@toc, .odp 726 // relocation) without a .toc directive. In this case just use the 727 // first section (which is usually the .odp) since the code won't 728 // reference the .toc base directly. 729 Rel.SymbolName = NULL; 730 Rel.SectionID = 0; 731 732 // The TOC consists of sections .got, .toc, .tocbss, .plt in that 733 // order. The TOC starts where the first of these sections starts. 734 for (auto &Section: Obj.sections()) { 735 StringRef SectionName; 736 check(Section.getName(SectionName)); 737 738 if (SectionName == ".got" 739 || SectionName == ".toc" 740 || SectionName == ".tocbss" 741 || SectionName == ".plt") { 742 Rel.SectionID = findOrEmitSection(Obj, Section, false, LocalSections); 743 break; 744 } 745 } 746 747 // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000 748 // thus permitting a full 64 Kbytes segment. 749 Rel.Addend = 0x8000; 750 } 751 752 // Returns the sections and offset associated with the ODP entry referenced 753 // by Symbol. 754 void RuntimeDyldELF::findOPDEntrySection(const ObjectFile &Obj, 755 ObjSectionToIDMap &LocalSections, 756 RelocationValueRef &Rel) { 757 // Get the ELF symbol value (st_value) to compare with Relocation offset in 758 // .opd entries 759 for (section_iterator si = Obj.section_begin(), se = Obj.section_end(); 760 si != se; ++si) { 761 section_iterator RelSecI = si->getRelocatedSection(); 762 if (RelSecI == Obj.section_end()) 763 continue; 764 765 StringRef RelSectionName; 766 check(RelSecI->getName(RelSectionName)); 767 if (RelSectionName != ".opd") 768 continue; 769 770 for (relocation_iterator i = si->relocation_begin(), 771 e = si->relocation_end(); 772 i != e;) { 773 // The R_PPC64_ADDR64 relocation indicates the first field 774 // of a .opd entry 775 uint64_t TypeFunc; 776 check(i->getType(TypeFunc)); 777 if (TypeFunc != ELF::R_PPC64_ADDR64) { 778 ++i; 779 continue; 780 } 781 782 uint64_t TargetSymbolOffset; 783 symbol_iterator TargetSymbol = i->getSymbol(); 784 check(i->getOffset(TargetSymbolOffset)); 785 int64_t Addend; 786 check(getELFRelocationAddend(*i, Addend)); 787 788 ++i; 789 if (i == e) 790 break; 791 792 // Just check if following relocation is a R_PPC64_TOC 793 uint64_t TypeTOC; 794 check(i->getType(TypeTOC)); 795 if (TypeTOC != ELF::R_PPC64_TOC) 796 continue; 797 798 // Finally compares the Symbol value and the target symbol offset 799 // to check if this .opd entry refers to the symbol the relocation 800 // points to. 801 if (Rel.Addend != (int64_t)TargetSymbolOffset) 802 continue; 803 804 section_iterator tsi(Obj.section_end()); 805 check(TargetSymbol->getSection(tsi)); 806 bool IsCode = tsi->isText(); 807 Rel.SectionID = findOrEmitSection(Obj, (*tsi), IsCode, LocalSections); 808 Rel.Addend = (intptr_t)Addend; 809 return; 810 } 811 } 812 llvm_unreachable("Attempting to get address of ODP entry!"); 813 } 814 815 // Relocation masks following the #lo(value), #hi(value), #ha(value), 816 // #higher(value), #highera(value), #highest(value), and #highesta(value) 817 // macros defined in section 4.5.1. Relocation Types of the PPC-elf64abi 818 // document. 819 820 static inline uint16_t applyPPClo(uint64_t value) { return value & 0xffff; } 821 822 static inline uint16_t applyPPChi(uint64_t value) { 823 return (value >> 16) & 0xffff; 824 } 825 826 static inline uint16_t applyPPCha (uint64_t value) { 827 return ((value + 0x8000) >> 16) & 0xffff; 828 } 829 830 static inline uint16_t applyPPChigher(uint64_t value) { 831 return (value >> 32) & 0xffff; 832 } 833 834 static inline uint16_t applyPPChighera (uint64_t value) { 835 return ((value + 0x8000) >> 32) & 0xffff; 836 } 837 838 static inline uint16_t applyPPChighest(uint64_t value) { 839 return (value >> 48) & 0xffff; 840 } 841 842 static inline uint16_t applyPPChighesta (uint64_t value) { 843 return ((value + 0x8000) >> 48) & 0xffff; 844 } 845 846 void RuntimeDyldELF::resolvePPC64Relocation(const SectionEntry &Section, 847 uint64_t Offset, uint64_t Value, 848 uint32_t Type, int64_t Addend) { 849 uint8_t *LocalAddress = Section.Address + Offset; 850 switch (Type) { 851 default: 852 llvm_unreachable("Relocation type not implemented yet!"); 853 break; 854 case ELF::R_PPC64_ADDR16: 855 writeInt16BE(LocalAddress, applyPPClo(Value + Addend)); 856 break; 857 case ELF::R_PPC64_ADDR16_DS: 858 writeInt16BE(LocalAddress, applyPPClo(Value + Addend) & ~3); 859 break; 860 case ELF::R_PPC64_ADDR16_LO: 861 writeInt16BE(LocalAddress, applyPPClo(Value + Addend)); 862 break; 863 case ELF::R_PPC64_ADDR16_LO_DS: 864 writeInt16BE(LocalAddress, applyPPClo(Value + Addend) & ~3); 865 break; 866 case ELF::R_PPC64_ADDR16_HI: 867 writeInt16BE(LocalAddress, applyPPChi(Value + Addend)); 868 break; 869 case ELF::R_PPC64_ADDR16_HA: 870 writeInt16BE(LocalAddress, applyPPCha(Value + Addend)); 871 break; 872 case ELF::R_PPC64_ADDR16_HIGHER: 873 writeInt16BE(LocalAddress, applyPPChigher(Value + Addend)); 874 break; 875 case ELF::R_PPC64_ADDR16_HIGHERA: 876 writeInt16BE(LocalAddress, applyPPChighera(Value + Addend)); 877 break; 878 case ELF::R_PPC64_ADDR16_HIGHEST: 879 writeInt16BE(LocalAddress, applyPPChighest(Value + Addend)); 880 break; 881 case ELF::R_PPC64_ADDR16_HIGHESTA: 882 writeInt16BE(LocalAddress, applyPPChighesta(Value + Addend)); 883 break; 884 case ELF::R_PPC64_ADDR14: { 885 assert(((Value + Addend) & 3) == 0); 886 // Preserve the AA/LK bits in the branch instruction 887 uint8_t aalk = *(LocalAddress + 3); 888 writeInt16BE(LocalAddress + 2, (aalk & 3) | ((Value + Addend) & 0xfffc)); 889 } break; 890 case ELF::R_PPC64_REL16_LO: { 891 uint64_t FinalAddress = (Section.LoadAddress + Offset); 892 uint64_t Delta = Value - FinalAddress + Addend; 893 writeInt16BE(LocalAddress, applyPPClo(Delta)); 894 } break; 895 case ELF::R_PPC64_REL16_HI: { 896 uint64_t FinalAddress = (Section.LoadAddress + Offset); 897 uint64_t Delta = Value - FinalAddress + Addend; 898 writeInt16BE(LocalAddress, applyPPChi(Delta)); 899 } break; 900 case ELF::R_PPC64_REL16_HA: { 901 uint64_t FinalAddress = (Section.LoadAddress + Offset); 902 uint64_t Delta = Value - FinalAddress + Addend; 903 writeInt16BE(LocalAddress, applyPPCha(Delta)); 904 } break; 905 case ELF::R_PPC64_ADDR32: { 906 int32_t Result = static_cast<int32_t>(Value + Addend); 907 if (SignExtend32<32>(Result) != Result) 908 llvm_unreachable("Relocation R_PPC64_ADDR32 overflow"); 909 writeInt32BE(LocalAddress, Result); 910 } break; 911 case ELF::R_PPC64_REL24: { 912 uint64_t FinalAddress = (Section.LoadAddress + Offset); 913 int32_t delta = static_cast<int32_t>(Value - FinalAddress + Addend); 914 if (SignExtend32<24>(delta) != delta) 915 llvm_unreachable("Relocation R_PPC64_REL24 overflow"); 916 // Generates a 'bl <address>' instruction 917 writeInt32BE(LocalAddress, 0x48000001 | (delta & 0x03FFFFFC)); 918 } break; 919 case ELF::R_PPC64_REL32: { 920 uint64_t FinalAddress = (Section.LoadAddress + Offset); 921 int32_t delta = static_cast<int32_t>(Value - FinalAddress + Addend); 922 if (SignExtend32<32>(delta) != delta) 923 llvm_unreachable("Relocation R_PPC64_REL32 overflow"); 924 writeInt32BE(LocalAddress, delta); 925 } break; 926 case ELF::R_PPC64_REL64: { 927 uint64_t FinalAddress = (Section.LoadAddress + Offset); 928 uint64_t Delta = Value - FinalAddress + Addend; 929 writeInt64BE(LocalAddress, Delta); 930 } break; 931 case ELF::R_PPC64_ADDR64: 932 writeInt64BE(LocalAddress, Value + Addend); 933 break; 934 } 935 } 936 937 void RuntimeDyldELF::resolveSystemZRelocation(const SectionEntry &Section, 938 uint64_t Offset, uint64_t Value, 939 uint32_t Type, int64_t Addend) { 940 uint8_t *LocalAddress = Section.Address + Offset; 941 switch (Type) { 942 default: 943 llvm_unreachable("Relocation type not implemented yet!"); 944 break; 945 case ELF::R_390_PC16DBL: 946 case ELF::R_390_PLT16DBL: { 947 int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset); 948 assert(int16_t(Delta / 2) * 2 == Delta && "R_390_PC16DBL overflow"); 949 writeInt16BE(LocalAddress, Delta / 2); 950 break; 951 } 952 case ELF::R_390_PC32DBL: 953 case ELF::R_390_PLT32DBL: { 954 int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset); 955 assert(int32_t(Delta / 2) * 2 == Delta && "R_390_PC32DBL overflow"); 956 writeInt32BE(LocalAddress, Delta / 2); 957 break; 958 } 959 case ELF::R_390_PC32: { 960 int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset); 961 assert(int32_t(Delta) == Delta && "R_390_PC32 overflow"); 962 writeInt32BE(LocalAddress, Delta); 963 break; 964 } 965 case ELF::R_390_64: 966 writeInt64BE(LocalAddress, Value + Addend); 967 break; 968 } 969 } 970 971 // The target location for the relocation is described by RE.SectionID and 972 // RE.Offset. RE.SectionID can be used to find the SectionEntry. Each 973 // SectionEntry has three members describing its location. 974 // SectionEntry::Address is the address at which the section has been loaded 975 // into memory in the current (host) process. SectionEntry::LoadAddress is the 976 // address that the section will have in the target process. 977 // SectionEntry::ObjAddress is the address of the bits for this section in the 978 // original emitted object image (also in the current address space). 979 // 980 // Relocations will be applied as if the section were loaded at 981 // SectionEntry::LoadAddress, but they will be applied at an address based 982 // on SectionEntry::Address. SectionEntry::ObjAddress will be used to refer to 983 // Target memory contents if they are required for value calculations. 984 // 985 // The Value parameter here is the load address of the symbol for the 986 // relocation to be applied. For relocations which refer to symbols in the 987 // current object Value will be the LoadAddress of the section in which 988 // the symbol resides (RE.Addend provides additional information about the 989 // symbol location). For external symbols, Value will be the address of the 990 // symbol in the target address space. 991 void RuntimeDyldELF::resolveRelocation(const RelocationEntry &RE, 992 uint64_t Value) { 993 const SectionEntry &Section = Sections[RE.SectionID]; 994 return resolveRelocation(Section, RE.Offset, Value, RE.RelType, RE.Addend, 995 RE.SymOffset, RE.SectionID); 996 } 997 998 void RuntimeDyldELF::resolveRelocation(const SectionEntry &Section, 999 uint64_t Offset, uint64_t Value, 1000 uint32_t Type, int64_t Addend, 1001 uint64_t SymOffset, SID SectionID) { 1002 switch (Arch) { 1003 case Triple::x86_64: 1004 resolveX86_64Relocation(Section, Offset, Value, Type, Addend, SymOffset); 1005 break; 1006 case Triple::x86: 1007 resolveX86Relocation(Section, Offset, (uint32_t)(Value & 0xffffffffL), Type, 1008 (uint32_t)(Addend & 0xffffffffL)); 1009 break; 1010 case Triple::aarch64: 1011 case Triple::aarch64_be: 1012 resolveAArch64Relocation(Section, Offset, Value, Type, Addend); 1013 break; 1014 case Triple::arm: // Fall through. 1015 case Triple::armeb: 1016 case Triple::thumb: 1017 case Triple::thumbeb: 1018 resolveARMRelocation(Section, Offset, (uint32_t)(Value & 0xffffffffL), Type, 1019 (uint32_t)(Addend & 0xffffffffL)); 1020 break; 1021 case Triple::mips: // Fall through. 1022 case Triple::mipsel: 1023 case Triple::mips64: 1024 case Triple::mips64el: 1025 if (IsMipsO32ABI) 1026 resolveMIPSRelocation(Section, Offset, (uint32_t)(Value & 0xffffffffL), 1027 Type, (uint32_t)(Addend & 0xffffffffL)); 1028 else if (IsMipsN64ABI) 1029 resolveMIPS64Relocation(Section, Offset, Value, Type, Addend, SymOffset, 1030 SectionID); 1031 else 1032 llvm_unreachable("Mips ABI not handled"); 1033 break; 1034 case Triple::ppc64: // Fall through. 1035 case Triple::ppc64le: 1036 resolvePPC64Relocation(Section, Offset, Value, Type, Addend); 1037 break; 1038 case Triple::systemz: 1039 resolveSystemZRelocation(Section, Offset, Value, Type, Addend); 1040 break; 1041 default: 1042 llvm_unreachable("Unsupported CPU type!"); 1043 } 1044 } 1045 1046 void *RuntimeDyldELF::computePlaceholderAddress(unsigned SectionID, uint64_t Offset) const { 1047 return (void*)(Sections[SectionID].ObjAddress + Offset); 1048 } 1049 1050 void RuntimeDyldELF::processSimpleRelocation(unsigned SectionID, uint64_t Offset, unsigned RelType, RelocationValueRef Value) { 1051 RelocationEntry RE(SectionID, Offset, RelType, Value.Addend, Value.Offset); 1052 if (Value.SymbolName) 1053 addRelocationForSymbol(RE, Value.SymbolName); 1054 else 1055 addRelocationForSection(RE, Value.SectionID); 1056 } 1057 1058 relocation_iterator RuntimeDyldELF::processRelocationRef( 1059 unsigned SectionID, relocation_iterator RelI, 1060 const ObjectFile &Obj, 1061 ObjSectionToIDMap &ObjSectionToID, 1062 StubMap &Stubs) { 1063 uint64_t RelType; 1064 Check(RelI->getType(RelType)); 1065 int64_t Addend; 1066 Check(getELFRelocationAddend(*RelI, Addend)); 1067 symbol_iterator Symbol = RelI->getSymbol(); 1068 1069 // Obtain the symbol name which is referenced in the relocation 1070 StringRef TargetName; 1071 if (Symbol != Obj.symbol_end()) 1072 Symbol->getName(TargetName); 1073 DEBUG(dbgs() << "\t\tRelType: " << RelType << " Addend: " << Addend 1074 << " TargetName: " << TargetName << "\n"); 1075 RelocationValueRef Value; 1076 // First search for the symbol in the local symbol table 1077 SymbolRef::Type SymType = SymbolRef::ST_Unknown; 1078 1079 // Search for the symbol in the global symbol table 1080 RTDyldSymbolTable::const_iterator gsi = GlobalSymbolTable.end(); 1081 if (Symbol != Obj.symbol_end()) { 1082 gsi = GlobalSymbolTable.find(TargetName.data()); 1083 Symbol->getType(SymType); 1084 } 1085 if (gsi != GlobalSymbolTable.end()) { 1086 const auto &SymInfo = gsi->second; 1087 Value.SectionID = SymInfo.getSectionID(); 1088 Value.Offset = SymInfo.getOffset(); 1089 Value.Addend = SymInfo.getOffset() + Addend; 1090 } else { 1091 switch (SymType) { 1092 case SymbolRef::ST_Debug: { 1093 // TODO: Now ELF SymbolRef::ST_Debug = STT_SECTION, it's not obviously 1094 // and can be changed by another developers. Maybe best way is add 1095 // a new symbol type ST_Section to SymbolRef and use it. 1096 section_iterator si(Obj.section_end()); 1097 Symbol->getSection(si); 1098 if (si == Obj.section_end()) 1099 llvm_unreachable("Symbol section not found, bad object file format!"); 1100 DEBUG(dbgs() << "\t\tThis is section symbol\n"); 1101 bool isCode = si->isText(); 1102 Value.SectionID = findOrEmitSection(Obj, (*si), isCode, ObjSectionToID); 1103 Value.Addend = Addend; 1104 break; 1105 } 1106 case SymbolRef::ST_Data: 1107 case SymbolRef::ST_Unknown: { 1108 Value.SymbolName = TargetName.data(); 1109 Value.Addend = Addend; 1110 1111 // Absolute relocations will have a zero symbol ID (STN_UNDEF), which 1112 // will manifest here as a NULL symbol name. 1113 // We can set this as a valid (but empty) symbol name, and rely 1114 // on addRelocationForSymbol to handle this. 1115 if (!Value.SymbolName) 1116 Value.SymbolName = ""; 1117 break; 1118 } 1119 default: 1120 llvm_unreachable("Unresolved symbol type!"); 1121 break; 1122 } 1123 } 1124 1125 uint64_t Offset; 1126 Check(RelI->getOffset(Offset)); 1127 1128 DEBUG(dbgs() << "\t\tSectionID: " << SectionID << " Offset: " << Offset 1129 << "\n"); 1130 if ((Arch == Triple::aarch64 || Arch == Triple::aarch64_be) && 1131 (RelType == ELF::R_AARCH64_CALL26 || RelType == ELF::R_AARCH64_JUMP26)) { 1132 // This is an AArch64 branch relocation, need to use a stub function. 1133 DEBUG(dbgs() << "\t\tThis is an AArch64 branch relocation."); 1134 SectionEntry &Section = Sections[SectionID]; 1135 1136 // Look for an existing stub. 1137 StubMap::const_iterator i = Stubs.find(Value); 1138 if (i != Stubs.end()) { 1139 resolveRelocation(Section, Offset, (uint64_t)Section.Address + i->second, 1140 RelType, 0); 1141 DEBUG(dbgs() << " Stub function found\n"); 1142 } else { 1143 // Create a new stub function. 1144 DEBUG(dbgs() << " Create a new stub function\n"); 1145 Stubs[Value] = Section.StubOffset; 1146 uint8_t *StubTargetAddr = 1147 createStubFunction(Section.Address + Section.StubOffset); 1148 1149 RelocationEntry REmovz_g3(SectionID, StubTargetAddr - Section.Address, 1150 ELF::R_AARCH64_MOVW_UABS_G3, Value.Addend); 1151 RelocationEntry REmovk_g2(SectionID, StubTargetAddr - Section.Address + 4, 1152 ELF::R_AARCH64_MOVW_UABS_G2_NC, Value.Addend); 1153 RelocationEntry REmovk_g1(SectionID, StubTargetAddr - Section.Address + 8, 1154 ELF::R_AARCH64_MOVW_UABS_G1_NC, Value.Addend); 1155 RelocationEntry REmovk_g0(SectionID, 1156 StubTargetAddr - Section.Address + 12, 1157 ELF::R_AARCH64_MOVW_UABS_G0_NC, Value.Addend); 1158 1159 if (Value.SymbolName) { 1160 addRelocationForSymbol(REmovz_g3, Value.SymbolName); 1161 addRelocationForSymbol(REmovk_g2, Value.SymbolName); 1162 addRelocationForSymbol(REmovk_g1, Value.SymbolName); 1163 addRelocationForSymbol(REmovk_g0, Value.SymbolName); 1164 } else { 1165 addRelocationForSection(REmovz_g3, Value.SectionID); 1166 addRelocationForSection(REmovk_g2, Value.SectionID); 1167 addRelocationForSection(REmovk_g1, Value.SectionID); 1168 addRelocationForSection(REmovk_g0, Value.SectionID); 1169 } 1170 resolveRelocation(Section, Offset, 1171 (uint64_t)Section.Address + Section.StubOffset, RelType, 1172 0); 1173 Section.StubOffset += getMaxStubSize(); 1174 } 1175 } else if (Arch == Triple::arm) { 1176 if (RelType == ELF::R_ARM_PC24 || RelType == ELF::R_ARM_CALL || 1177 RelType == ELF::R_ARM_JUMP24) { 1178 // This is an ARM branch relocation, need to use a stub function. 1179 DEBUG(dbgs() << "\t\tThis is an ARM branch relocation."); 1180 SectionEntry &Section = Sections[SectionID]; 1181 1182 // Look for an existing stub. 1183 StubMap::const_iterator i = Stubs.find(Value); 1184 if (i != Stubs.end()) { 1185 resolveRelocation(Section, Offset, (uint64_t)Section.Address + i->second, 1186 RelType, 0); 1187 DEBUG(dbgs() << " Stub function found\n"); 1188 } else { 1189 // Create a new stub function. 1190 DEBUG(dbgs() << " Create a new stub function\n"); 1191 Stubs[Value] = Section.StubOffset; 1192 uint8_t *StubTargetAddr = 1193 createStubFunction(Section.Address + Section.StubOffset); 1194 RelocationEntry RE(SectionID, StubTargetAddr - Section.Address, 1195 ELF::R_ARM_ABS32, Value.Addend); 1196 if (Value.SymbolName) 1197 addRelocationForSymbol(RE, Value.SymbolName); 1198 else 1199 addRelocationForSection(RE, Value.SectionID); 1200 1201 resolveRelocation(Section, Offset, 1202 (uint64_t)Section.Address + Section.StubOffset, RelType, 1203 0); 1204 Section.StubOffset += getMaxStubSize(); 1205 } 1206 } else { 1207 uint32_t *Placeholder = 1208 reinterpret_cast<uint32_t*>(computePlaceholderAddress(SectionID, Offset)); 1209 if (RelType == ELF::R_ARM_PREL31 || RelType == ELF::R_ARM_TARGET1 || 1210 RelType == ELF::R_ARM_ABS32) { 1211 Value.Addend += *Placeholder; 1212 } else if (RelType == ELF::R_ARM_MOVW_ABS_NC || RelType == ELF::R_ARM_MOVT_ABS) { 1213 // See ELF for ARM documentation 1214 Value.Addend += (int16_t)((*Placeholder & 0xFFF) | (((*Placeholder >> 16) & 0xF) << 12)); 1215 } 1216 processSimpleRelocation(SectionID, Offset, RelType, Value); 1217 } 1218 } else if (IsMipsO32ABI) { 1219 uint8_t *Placeholder = reinterpret_cast<uint8_t *>( 1220 computePlaceholderAddress(SectionID, Offset)); 1221 uint32_t Opcode = readBytesUnaligned(Placeholder, 4); 1222 if (RelType == ELF::R_MIPS_26) { 1223 // This is an Mips branch relocation, need to use a stub function. 1224 DEBUG(dbgs() << "\t\tThis is a Mips branch relocation."); 1225 SectionEntry &Section = Sections[SectionID]; 1226 1227 // Extract the addend from the instruction. 1228 // We shift up by two since the Value will be down shifted again 1229 // when applying the relocation. 1230 uint32_t Addend = (Opcode & 0x03ffffff) << 2; 1231 1232 Value.Addend += Addend; 1233 1234 // Look up for existing stub. 1235 StubMap::const_iterator i = Stubs.find(Value); 1236 if (i != Stubs.end()) { 1237 RelocationEntry RE(SectionID, Offset, RelType, i->second); 1238 addRelocationForSection(RE, SectionID); 1239 DEBUG(dbgs() << " Stub function found\n"); 1240 } else { 1241 // Create a new stub function. 1242 DEBUG(dbgs() << " Create a new stub function\n"); 1243 Stubs[Value] = Section.StubOffset; 1244 uint8_t *StubTargetAddr = 1245 createStubFunction(Section.Address + Section.StubOffset); 1246 1247 // Creating Hi and Lo relocations for the filled stub instructions. 1248 RelocationEntry REHi(SectionID, StubTargetAddr - Section.Address, 1249 ELF::R_MIPS_HI16, Value.Addend); 1250 RelocationEntry RELo(SectionID, StubTargetAddr - Section.Address + 4, 1251 ELF::R_MIPS_LO16, Value.Addend); 1252 1253 if (Value.SymbolName) { 1254 addRelocationForSymbol(REHi, Value.SymbolName); 1255 addRelocationForSymbol(RELo, Value.SymbolName); 1256 } 1257 else { 1258 addRelocationForSection(REHi, Value.SectionID); 1259 addRelocationForSection(RELo, Value.SectionID); 1260 } 1261 1262 RelocationEntry RE(SectionID, Offset, RelType, Section.StubOffset); 1263 addRelocationForSection(RE, SectionID); 1264 Section.StubOffset += getMaxStubSize(); 1265 } 1266 } else { 1267 if (RelType == ELF::R_MIPS_HI16) 1268 Value.Addend += (Opcode & 0x0000ffff) << 16; 1269 else if (RelType == ELF::R_MIPS_LO16) 1270 Value.Addend += (Opcode & 0x0000ffff); 1271 else if (RelType == ELF::R_MIPS_32) 1272 Value.Addend += Opcode; 1273 processSimpleRelocation(SectionID, Offset, RelType, Value); 1274 } 1275 } else if (IsMipsN64ABI) { 1276 uint32_t r_type = RelType & 0xff; 1277 RelocationEntry RE(SectionID, Offset, RelType, Value.Addend); 1278 if (r_type == ELF::R_MIPS_CALL16 || r_type == ELF::R_MIPS_GOT_PAGE 1279 || r_type == ELF::R_MIPS_GOT_DISP) { 1280 StringMap<uint64_t>::iterator i = GOTSymbolOffsets.find(TargetName); 1281 if (i != GOTSymbolOffsets.end()) 1282 RE.SymOffset = i->second; 1283 else { 1284 RE.SymOffset = allocateGOTEntries(SectionID, 1); 1285 GOTSymbolOffsets[TargetName] = RE.SymOffset; 1286 } 1287 } 1288 if (Value.SymbolName) 1289 addRelocationForSymbol(RE, Value.SymbolName); 1290 else 1291 addRelocationForSection(RE, Value.SectionID); 1292 } else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le) { 1293 if (RelType == ELF::R_PPC64_REL24) { 1294 // Determine ABI variant in use for this object. 1295 unsigned AbiVariant; 1296 Obj.getPlatformFlags(AbiVariant); 1297 AbiVariant &= ELF::EF_PPC64_ABI; 1298 // A PPC branch relocation will need a stub function if the target is 1299 // an external symbol (Symbol::ST_Unknown) or if the target address 1300 // is not within the signed 24-bits branch address. 1301 SectionEntry &Section = Sections[SectionID]; 1302 uint8_t *Target = Section.Address + Offset; 1303 bool RangeOverflow = false; 1304 if (SymType != SymbolRef::ST_Unknown) { 1305 if (AbiVariant != 2) { 1306 // In the ELFv1 ABI, a function call may point to the .opd entry, 1307 // so the final symbol value is calculated based on the relocation 1308 // values in the .opd section. 1309 findOPDEntrySection(Obj, ObjSectionToID, Value); 1310 } else { 1311 // In the ELFv2 ABI, a function symbol may provide a local entry 1312 // point, which must be used for direct calls. 1313 uint8_t SymOther; 1314 Symbol->getOther(SymOther); 1315 Value.Addend += ELF::decodePPC64LocalEntryOffset(SymOther); 1316 } 1317 uint8_t *RelocTarget = Sections[Value.SectionID].Address + Value.Addend; 1318 int32_t delta = static_cast<int32_t>(Target - RelocTarget); 1319 // If it is within 24-bits branch range, just set the branch target 1320 if (SignExtend32<24>(delta) == delta) { 1321 RelocationEntry RE(SectionID, Offset, RelType, Value.Addend); 1322 if (Value.SymbolName) 1323 addRelocationForSymbol(RE, Value.SymbolName); 1324 else 1325 addRelocationForSection(RE, Value.SectionID); 1326 } else { 1327 RangeOverflow = true; 1328 } 1329 } 1330 if (SymType == SymbolRef::ST_Unknown || RangeOverflow) { 1331 // It is an external symbol (SymbolRef::ST_Unknown) or within a range 1332 // larger than 24-bits. 1333 StubMap::const_iterator i = Stubs.find(Value); 1334 if (i != Stubs.end()) { 1335 // Symbol function stub already created, just relocate to it 1336 resolveRelocation(Section, Offset, 1337 (uint64_t)Section.Address + i->second, RelType, 0); 1338 DEBUG(dbgs() << " Stub function found\n"); 1339 } else { 1340 // Create a new stub function. 1341 DEBUG(dbgs() << " Create a new stub function\n"); 1342 Stubs[Value] = Section.StubOffset; 1343 uint8_t *StubTargetAddr = 1344 createStubFunction(Section.Address + Section.StubOffset, 1345 AbiVariant); 1346 RelocationEntry RE(SectionID, StubTargetAddr - Section.Address, 1347 ELF::R_PPC64_ADDR64, Value.Addend); 1348 1349 // Generates the 64-bits address loads as exemplified in section 1350 // 4.5.1 in PPC64 ELF ABI. Note that the relocations need to 1351 // apply to the low part of the instructions, so we have to update 1352 // the offset according to the target endianness. 1353 uint64_t StubRelocOffset = StubTargetAddr - Section.Address; 1354 if (!IsTargetLittleEndian) 1355 StubRelocOffset += 2; 1356 1357 RelocationEntry REhst(SectionID, StubRelocOffset + 0, 1358 ELF::R_PPC64_ADDR16_HIGHEST, Value.Addend); 1359 RelocationEntry REhr(SectionID, StubRelocOffset + 4, 1360 ELF::R_PPC64_ADDR16_HIGHER, Value.Addend); 1361 RelocationEntry REh(SectionID, StubRelocOffset + 12, 1362 ELF::R_PPC64_ADDR16_HI, Value.Addend); 1363 RelocationEntry REl(SectionID, StubRelocOffset + 16, 1364 ELF::R_PPC64_ADDR16_LO, Value.Addend); 1365 1366 if (Value.SymbolName) { 1367 addRelocationForSymbol(REhst, Value.SymbolName); 1368 addRelocationForSymbol(REhr, Value.SymbolName); 1369 addRelocationForSymbol(REh, Value.SymbolName); 1370 addRelocationForSymbol(REl, Value.SymbolName); 1371 } else { 1372 addRelocationForSection(REhst, Value.SectionID); 1373 addRelocationForSection(REhr, Value.SectionID); 1374 addRelocationForSection(REh, Value.SectionID); 1375 addRelocationForSection(REl, Value.SectionID); 1376 } 1377 1378 resolveRelocation(Section, Offset, 1379 (uint64_t)Section.Address + Section.StubOffset, 1380 RelType, 0); 1381 Section.StubOffset += getMaxStubSize(); 1382 } 1383 if (SymType == SymbolRef::ST_Unknown) { 1384 // Restore the TOC for external calls 1385 if (AbiVariant == 2) 1386 writeInt32BE(Target + 4, 0xE8410018); // ld r2,28(r1) 1387 else 1388 writeInt32BE(Target + 4, 0xE8410028); // ld r2,40(r1) 1389 } 1390 } 1391 } else if (RelType == ELF::R_PPC64_TOC16 || 1392 RelType == ELF::R_PPC64_TOC16_DS || 1393 RelType == ELF::R_PPC64_TOC16_LO || 1394 RelType == ELF::R_PPC64_TOC16_LO_DS || 1395 RelType == ELF::R_PPC64_TOC16_HI || 1396 RelType == ELF::R_PPC64_TOC16_HA) { 1397 // These relocations are supposed to subtract the TOC address from 1398 // the final value. This does not fit cleanly into the RuntimeDyld 1399 // scheme, since there may be *two* sections involved in determining 1400 // the relocation value (the section of the symbol refered to by the 1401 // relocation, and the TOC section associated with the current module). 1402 // 1403 // Fortunately, these relocations are currently only ever generated 1404 // refering to symbols that themselves reside in the TOC, which means 1405 // that the two sections are actually the same. Thus they cancel out 1406 // and we can immediately resolve the relocation right now. 1407 switch (RelType) { 1408 case ELF::R_PPC64_TOC16: RelType = ELF::R_PPC64_ADDR16; break; 1409 case ELF::R_PPC64_TOC16_DS: RelType = ELF::R_PPC64_ADDR16_DS; break; 1410 case ELF::R_PPC64_TOC16_LO: RelType = ELF::R_PPC64_ADDR16_LO; break; 1411 case ELF::R_PPC64_TOC16_LO_DS: RelType = ELF::R_PPC64_ADDR16_LO_DS; break; 1412 case ELF::R_PPC64_TOC16_HI: RelType = ELF::R_PPC64_ADDR16_HI; break; 1413 case ELF::R_PPC64_TOC16_HA: RelType = ELF::R_PPC64_ADDR16_HA; break; 1414 default: llvm_unreachable("Wrong relocation type."); 1415 } 1416 1417 RelocationValueRef TOCValue; 1418 findPPC64TOCSection(Obj, ObjSectionToID, TOCValue); 1419 if (Value.SymbolName || Value.SectionID != TOCValue.SectionID) 1420 llvm_unreachable("Unsupported TOC relocation."); 1421 Value.Addend -= TOCValue.Addend; 1422 resolveRelocation(Sections[SectionID], Offset, Value.Addend, RelType, 0); 1423 } else { 1424 // There are two ways to refer to the TOC address directly: either 1425 // via a ELF::R_PPC64_TOC relocation (where both symbol and addend are 1426 // ignored), or via any relocation that refers to the magic ".TOC." 1427 // symbols (in which case the addend is respected). 1428 if (RelType == ELF::R_PPC64_TOC) { 1429 RelType = ELF::R_PPC64_ADDR64; 1430 findPPC64TOCSection(Obj, ObjSectionToID, Value); 1431 } else if (TargetName == ".TOC.") { 1432 findPPC64TOCSection(Obj, ObjSectionToID, Value); 1433 Value.Addend += Addend; 1434 } 1435 1436 RelocationEntry RE(SectionID, Offset, RelType, Value.Addend); 1437 1438 if (Value.SymbolName) 1439 addRelocationForSymbol(RE, Value.SymbolName); 1440 else 1441 addRelocationForSection(RE, Value.SectionID); 1442 } 1443 } else if (Arch == Triple::systemz && 1444 (RelType == ELF::R_390_PLT32DBL || RelType == ELF::R_390_GOTENT)) { 1445 // Create function stubs for both PLT and GOT references, regardless of 1446 // whether the GOT reference is to data or code. The stub contains the 1447 // full address of the symbol, as needed by GOT references, and the 1448 // executable part only adds an overhead of 8 bytes. 1449 // 1450 // We could try to conserve space by allocating the code and data 1451 // parts of the stub separately. However, as things stand, we allocate 1452 // a stub for every relocation, so using a GOT in JIT code should be 1453 // no less space efficient than using an explicit constant pool. 1454 DEBUG(dbgs() << "\t\tThis is a SystemZ indirect relocation."); 1455 SectionEntry &Section = Sections[SectionID]; 1456 1457 // Look for an existing stub. 1458 StubMap::const_iterator i = Stubs.find(Value); 1459 uintptr_t StubAddress; 1460 if (i != Stubs.end()) { 1461 StubAddress = uintptr_t(Section.Address) + i->second; 1462 DEBUG(dbgs() << " Stub function found\n"); 1463 } else { 1464 // Create a new stub function. 1465 DEBUG(dbgs() << " Create a new stub function\n"); 1466 1467 uintptr_t BaseAddress = uintptr_t(Section.Address); 1468 uintptr_t StubAlignment = getStubAlignment(); 1469 StubAddress = (BaseAddress + Section.StubOffset + StubAlignment - 1) & 1470 -StubAlignment; 1471 unsigned StubOffset = StubAddress - BaseAddress; 1472 1473 Stubs[Value] = StubOffset; 1474 createStubFunction((uint8_t *)StubAddress); 1475 RelocationEntry RE(SectionID, StubOffset + 8, ELF::R_390_64, 1476 Value.Offset); 1477 if (Value.SymbolName) 1478 addRelocationForSymbol(RE, Value.SymbolName); 1479 else 1480 addRelocationForSection(RE, Value.SectionID); 1481 Section.StubOffset = StubOffset + getMaxStubSize(); 1482 } 1483 1484 if (RelType == ELF::R_390_GOTENT) 1485 resolveRelocation(Section, Offset, StubAddress + 8, ELF::R_390_PC32DBL, 1486 Addend); 1487 else 1488 resolveRelocation(Section, Offset, StubAddress, RelType, Addend); 1489 } else if (Arch == Triple::x86_64) { 1490 if (RelType == ELF::R_X86_64_PLT32) { 1491 // The way the PLT relocations normally work is that the linker allocates 1492 // the 1493 // PLT and this relocation makes a PC-relative call into the PLT. The PLT 1494 // entry will then jump to an address provided by the GOT. On first call, 1495 // the 1496 // GOT address will point back into PLT code that resolves the symbol. After 1497 // the first call, the GOT entry points to the actual function. 1498 // 1499 // For local functions we're ignoring all of that here and just replacing 1500 // the PLT32 relocation type with PC32, which will translate the relocation 1501 // into a PC-relative call directly to the function. For external symbols we 1502 // can't be sure the function will be within 2^32 bytes of the call site, so 1503 // we need to create a stub, which calls into the GOT. This case is 1504 // equivalent to the usual PLT implementation except that we use the stub 1505 // mechanism in RuntimeDyld (which puts stubs at the end of the section) 1506 // rather than allocating a PLT section. 1507 if (Value.SymbolName) { 1508 // This is a call to an external function. 1509 // Look for an existing stub. 1510 SectionEntry &Section = Sections[SectionID]; 1511 StubMap::const_iterator i = Stubs.find(Value); 1512 uintptr_t StubAddress; 1513 if (i != Stubs.end()) { 1514 StubAddress = uintptr_t(Section.Address) + i->second; 1515 DEBUG(dbgs() << " Stub function found\n"); 1516 } else { 1517 // Create a new stub function (equivalent to a PLT entry). 1518 DEBUG(dbgs() << " Create a new stub function\n"); 1519 1520 uintptr_t BaseAddress = uintptr_t(Section.Address); 1521 uintptr_t StubAlignment = getStubAlignment(); 1522 StubAddress = (BaseAddress + Section.StubOffset + StubAlignment - 1) & 1523 -StubAlignment; 1524 unsigned StubOffset = StubAddress - BaseAddress; 1525 Stubs[Value] = StubOffset; 1526 createStubFunction((uint8_t *)StubAddress); 1527 1528 // Bump our stub offset counter 1529 Section.StubOffset = StubOffset + getMaxStubSize(); 1530 1531 // Allocate a GOT Entry 1532 uint64_t GOTOffset = allocateGOTEntries(SectionID, 1); 1533 1534 // The load of the GOT address has an addend of -4 1535 resolveGOTOffsetRelocation(SectionID, StubOffset + 2, GOTOffset - 4); 1536 1537 // Fill in the value of the symbol we're targeting into the GOT 1538 addRelocationForSymbol(computeGOTOffsetRE(SectionID,GOTOffset,0,ELF::R_X86_64_64), 1539 Value.SymbolName); 1540 } 1541 1542 // Make the target call a call into the stub table. 1543 resolveRelocation(Section, Offset, StubAddress, ELF::R_X86_64_PC32, 1544 Addend); 1545 } else { 1546 RelocationEntry RE(SectionID, Offset, ELF::R_X86_64_PC32, Value.Addend, 1547 Value.Offset); 1548 addRelocationForSection(RE, Value.SectionID); 1549 } 1550 } else if (RelType == ELF::R_X86_64_GOTPCREL) { 1551 uint64_t GOTOffset = allocateGOTEntries(SectionID, 1); 1552 resolveGOTOffsetRelocation(SectionID, Offset, GOTOffset + Addend); 1553 1554 // Fill in the value of the symbol we're targeting into the GOT 1555 RelocationEntry RE = computeGOTOffsetRE(SectionID, GOTOffset, Value.Offset, ELF::R_X86_64_64); 1556 if (Value.SymbolName) 1557 addRelocationForSymbol(RE, Value.SymbolName); 1558 else 1559 addRelocationForSection(RE, Value.SectionID); 1560 } else if (RelType == ELF::R_X86_64_PC32) { 1561 Value.Addend += support::ulittle32_t::ref(computePlaceholderAddress(SectionID, Offset)); 1562 processSimpleRelocation(SectionID, Offset, RelType, Value); 1563 } else if (RelType == ELF::R_X86_64_PC64) { 1564 Value.Addend += support::ulittle64_t::ref(computePlaceholderAddress(SectionID, Offset)); 1565 processSimpleRelocation(SectionID, Offset, RelType, Value); 1566 } else { 1567 processSimpleRelocation(SectionID, Offset, RelType, Value); 1568 } 1569 } else { 1570 if (Arch == Triple::x86) { 1571 Value.Addend += support::ulittle32_t::ref(computePlaceholderAddress(SectionID, Offset)); 1572 } 1573 processSimpleRelocation(SectionID, Offset, RelType, Value); 1574 } 1575 return ++RelI; 1576 } 1577 1578 size_t RuntimeDyldELF::getGOTEntrySize() { 1579 // We don't use the GOT in all of these cases, but it's essentially free 1580 // to put them all here. 1581 size_t Result = 0; 1582 switch (Arch) { 1583 case Triple::x86_64: 1584 case Triple::aarch64: 1585 case Triple::aarch64_be: 1586 case Triple::ppc64: 1587 case Triple::ppc64le: 1588 case Triple::systemz: 1589 Result = sizeof(uint64_t); 1590 break; 1591 case Triple::x86: 1592 case Triple::arm: 1593 case Triple::thumb: 1594 Result = sizeof(uint32_t); 1595 break; 1596 case Triple::mips: 1597 case Triple::mipsel: 1598 case Triple::mips64: 1599 case Triple::mips64el: 1600 if (IsMipsO32ABI) 1601 Result = sizeof(uint32_t); 1602 else if (IsMipsN64ABI) 1603 Result = sizeof(uint64_t); 1604 else 1605 llvm_unreachable("Mips ABI not handled"); 1606 break; 1607 default: 1608 llvm_unreachable("Unsupported CPU type!"); 1609 } 1610 return Result; 1611 } 1612 1613 uint64_t RuntimeDyldELF::allocateGOTEntries(unsigned SectionID, unsigned no) 1614 { 1615 (void)SectionID; // The GOT Section is the same for all section in the object file 1616 if (GOTSectionID == 0) { 1617 GOTSectionID = Sections.size(); 1618 // Reserve a section id. We'll allocate the section later 1619 // once we know the total size 1620 Sections.push_back(SectionEntry(".got", 0, 0, 0)); 1621 } 1622 uint64_t StartOffset = CurrentGOTIndex * getGOTEntrySize(); 1623 CurrentGOTIndex += no; 1624 return StartOffset; 1625 } 1626 1627 void RuntimeDyldELF::resolveGOTOffsetRelocation(unsigned SectionID, uint64_t Offset, uint64_t GOTOffset) 1628 { 1629 // Fill in the relative address of the GOT Entry into the stub 1630 RelocationEntry GOTRE(SectionID, Offset, ELF::R_X86_64_PC32, GOTOffset); 1631 addRelocationForSection(GOTRE, GOTSectionID); 1632 } 1633 1634 RelocationEntry RuntimeDyldELF::computeGOTOffsetRE(unsigned SectionID, uint64_t GOTOffset, uint64_t SymbolOffset, 1635 uint32_t Type) 1636 { 1637 (void)SectionID; // The GOT Section is the same for all section in the object file 1638 return RelocationEntry(GOTSectionID, GOTOffset, Type, SymbolOffset); 1639 } 1640 1641 void RuntimeDyldELF::finalizeLoad(const ObjectFile &Obj, 1642 ObjSectionToIDMap &SectionMap) { 1643 // If necessary, allocate the global offset table 1644 if (GOTSectionID != 0) { 1645 // Allocate memory for the section 1646 size_t TotalSize = CurrentGOTIndex * getGOTEntrySize(); 1647 uint8_t *Addr = MemMgr.allocateDataSection(TotalSize, getGOTEntrySize(), 1648 GOTSectionID, ".got", false); 1649 if (!Addr) 1650 report_fatal_error("Unable to allocate memory for GOT!"); 1651 1652 Sections[GOTSectionID] = SectionEntry(".got", Addr, TotalSize, 0); 1653 1654 if (Checker) 1655 Checker->registerSection(Obj.getFileName(), GOTSectionID); 1656 1657 // For now, initialize all GOT entries to zero. We'll fill them in as 1658 // needed when GOT-based relocations are applied. 1659 memset(Addr, 0, TotalSize); 1660 if (IsMipsN64ABI) { 1661 // To correctly resolve Mips GOT relocations, we need a mapping from 1662 // object's sections to GOTs. 1663 for (section_iterator SI = Obj.section_begin(), SE = Obj.section_end(); 1664 SI != SE; ++SI) { 1665 if (SI->relocation_begin() != SI->relocation_end()) { 1666 section_iterator RelocatedSection = SI->getRelocatedSection(); 1667 ObjSectionToIDMap::iterator i = SectionMap.find(*RelocatedSection); 1668 assert (i != SectionMap.end()); 1669 SectionToGOTMap[i->second] = GOTSectionID; 1670 } 1671 } 1672 GOTSymbolOffsets.clear(); 1673 } 1674 } 1675 1676 // Look for and record the EH frame section. 1677 ObjSectionToIDMap::iterator i, e; 1678 for (i = SectionMap.begin(), e = SectionMap.end(); i != e; ++i) { 1679 const SectionRef &Section = i->first; 1680 StringRef Name; 1681 Section.getName(Name); 1682 if (Name == ".eh_frame") { 1683 UnregisteredEHFrameSections.push_back(i->second); 1684 break; 1685 } 1686 } 1687 1688 GOTSectionID = 0; 1689 CurrentGOTIndex = 0; 1690 } 1691 1692 bool RuntimeDyldELF::isCompatibleFile(const object::ObjectFile &Obj) const { 1693 return Obj.isELF(); 1694 } 1695 1696 } // namespace llvm 1697