1 //===-- RuntimeDyld.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 the MC-JIT runtime dynamic linker. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/ExecutionEngine/RuntimeDyld.h" 15 #include "JITRegistrar.h" 16 #include "ObjectImageCommon.h" 17 #include "RuntimeDyldELF.h" 18 #include "RuntimeDyldImpl.h" 19 #include "RuntimeDyldMachO.h" 20 #include "llvm/Object/ELF.h" 21 #include "llvm/Support/MathExtras.h" 22 #include "llvm/Support/MutexGuard.h" 23 24 using namespace llvm; 25 using namespace llvm::object; 26 27 #define DEBUG_TYPE "dyld" 28 29 // Empty out-of-line virtual destructor as the key function. 30 RuntimeDyldImpl::~RuntimeDyldImpl() {} 31 32 // Pin the JITRegistrar's and ObjectImage*'s vtables to this file. 33 void JITRegistrar::anchor() {} 34 void ObjectImage::anchor() {} 35 void ObjectImageCommon::anchor() {} 36 37 namespace llvm { 38 39 void RuntimeDyldImpl::registerEHFrames() {} 40 41 void RuntimeDyldImpl::deregisterEHFrames() {} 42 43 // Resolve the relocations for all symbols we currently know about. 44 void RuntimeDyldImpl::resolveRelocations() { 45 MutexGuard locked(lock); 46 47 // First, resolve relocations associated with external symbols. 48 resolveExternalSymbols(); 49 50 // Just iterate over the sections we have and resolve all the relocations 51 // in them. Gross overkill, but it gets the job done. 52 for (int i = 0, e = Sections.size(); i != e; ++i) { 53 // The Section here (Sections[i]) refers to the section in which the 54 // symbol for the relocation is located. The SectionID in the relocation 55 // entry provides the section to which the relocation will be applied. 56 uint64_t Addr = Sections[i].LoadAddress; 57 DEBUG(dbgs() << "Resolving relocations Section #" << i << "\t" 58 << format("%p", (uint8_t *)Addr) << "\n"); 59 resolveRelocationList(Relocations[i], Addr); 60 Relocations.erase(i); 61 } 62 } 63 64 void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress, 65 uint64_t TargetAddress) { 66 MutexGuard locked(lock); 67 for (unsigned i = 0, e = Sections.size(); i != e; ++i) { 68 if (Sections[i].Address == LocalAddress) { 69 reassignSectionAddress(i, TargetAddress); 70 return; 71 } 72 } 73 llvm_unreachable("Attempting to remap address of unknown section!"); 74 } 75 76 static error_code getOffset(const SymbolRef &Sym, uint64_t &Result) { 77 uint64_t Address; 78 if (error_code EC = Sym.getAddress(Address)) 79 return EC; 80 81 if (Address == UnknownAddressOrSize) { 82 Result = UnknownAddressOrSize; 83 return object_error::success; 84 } 85 86 const ObjectFile *Obj = Sym.getObject(); 87 section_iterator SecI(Obj->section_begin()); 88 if (error_code EC = Sym.getSection(SecI)) 89 return EC; 90 91 if (SecI == Obj->section_end()) { 92 Result = UnknownAddressOrSize; 93 return object_error::success; 94 } 95 96 uint64_t SectionAddress; 97 if (error_code EC = SecI->getAddress(SectionAddress)) 98 return EC; 99 100 Result = Address - SectionAddress; 101 return object_error::success; 102 } 103 104 ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) { 105 MutexGuard locked(lock); 106 107 std::unique_ptr<ObjectImage> Obj(InputObject); 108 if (!Obj) 109 return NULL; 110 111 // Save information about our target 112 Arch = (Triple::ArchType)Obj->getArch(); 113 IsTargetLittleEndian = Obj->getObjectFile()->isLittleEndian(); 114 115 // Compute the memory size required to load all sections to be loaded 116 // and pass this information to the memory manager 117 if (MemMgr->needsToReserveAllocationSpace()) { 118 uint64_t CodeSize = 0, DataSizeRO = 0, DataSizeRW = 0; 119 computeTotalAllocSize(*Obj, CodeSize, DataSizeRO, DataSizeRW); 120 MemMgr->reserveAllocationSpace(CodeSize, DataSizeRO, DataSizeRW); 121 } 122 123 // Symbols found in this object 124 StringMap<SymbolLoc> LocalSymbols; 125 // Used sections from the object file 126 ObjSectionToIDMap LocalSections; 127 128 // Common symbols requiring allocation, with their sizes and alignments 129 CommonSymbolMap CommonSymbols; 130 // Maximum required total memory to allocate all common symbols 131 uint64_t CommonSize = 0; 132 133 // Parse symbols 134 DEBUG(dbgs() << "Parse symbols:\n"); 135 for (symbol_iterator I = Obj->begin_symbols(), E = Obj->end_symbols(); I != E; 136 ++I) { 137 object::SymbolRef::Type SymType; 138 StringRef Name; 139 Check(I->getType(SymType)); 140 Check(I->getName(Name)); 141 142 uint32_t Flags = I->getFlags(); 143 144 bool IsCommon = Flags & SymbolRef::SF_Common; 145 if (IsCommon) { 146 // Add the common symbols to a list. We'll allocate them all below. 147 uint32_t Align; 148 Check(I->getAlignment(Align)); 149 uint64_t Size = 0; 150 Check(I->getSize(Size)); 151 CommonSize += Size + Align; 152 CommonSymbols[*I] = CommonSymbolInfo(Size, Align); 153 } else { 154 if (SymType == object::SymbolRef::ST_Function || 155 SymType == object::SymbolRef::ST_Data || 156 SymType == object::SymbolRef::ST_Unknown) { 157 uint64_t SectOffset; 158 StringRef SectionData; 159 bool IsCode; 160 section_iterator SI = Obj->end_sections(); 161 Check(getOffset(*I, SectOffset)); 162 Check(I->getSection(SI)); 163 if (SI == Obj->end_sections()) 164 continue; 165 Check(SI->getContents(SectionData)); 166 Check(SI->isText(IsCode)); 167 unsigned SectionID = 168 findOrEmitSection(*Obj, *SI, IsCode, LocalSections); 169 LocalSymbols[Name.data()] = SymbolLoc(SectionID, SectOffset); 170 DEBUG(dbgs() << "\tOffset: " << format("%p", (uintptr_t)SectOffset) 171 << " flags: " << Flags << " SID: " << SectionID); 172 GlobalSymbolTable[Name] = SymbolLoc(SectionID, SectOffset); 173 } 174 } 175 DEBUG(dbgs() << "\tType: " << SymType << " Name: " << Name << "\n"); 176 } 177 178 // Allocate common symbols 179 if (CommonSize != 0) 180 emitCommonSymbols(*Obj, CommonSymbols, CommonSize, LocalSymbols); 181 182 // Parse and process relocations 183 DEBUG(dbgs() << "Parse relocations:\n"); 184 for (section_iterator SI = Obj->begin_sections(), SE = Obj->end_sections(); 185 SI != SE; ++SI) { 186 unsigned SectionID = 0; 187 StubMap Stubs; 188 section_iterator RelocatedSection = SI->getRelocatedSection(); 189 190 relocation_iterator I = SI->relocation_begin(); 191 relocation_iterator E = SI->relocation_end(); 192 193 if (I == E && !ProcessAllSections) 194 continue; 195 196 bool IsCode = false; 197 Check(RelocatedSection->isText(IsCode)); 198 SectionID = 199 findOrEmitSection(*Obj, *RelocatedSection, IsCode, LocalSections); 200 DEBUG(dbgs() << "\tSectionID: " << SectionID << "\n"); 201 202 for (; I != E;) 203 I = processRelocationRef(SectionID, I, *Obj, LocalSections, LocalSymbols, 204 Stubs); 205 } 206 207 // Give the subclasses a chance to tie-up any loose ends. 208 finalizeLoad(LocalSections); 209 210 return Obj.release(); 211 } 212 213 // A helper method for computeTotalAllocSize. 214 // Computes the memory size required to allocate sections with the given sizes, 215 // assuming that all sections are allocated with the given alignment 216 static uint64_t 217 computeAllocationSizeForSections(std::vector<uint64_t> &SectionSizes, 218 uint64_t Alignment) { 219 uint64_t TotalSize = 0; 220 for (size_t Idx = 0, Cnt = SectionSizes.size(); Idx < Cnt; Idx++) { 221 uint64_t AlignedSize = 222 (SectionSizes[Idx] + Alignment - 1) / Alignment * Alignment; 223 TotalSize += AlignedSize; 224 } 225 return TotalSize; 226 } 227 228 // Compute an upper bound of the memory size that is required to load all 229 // sections 230 void RuntimeDyldImpl::computeTotalAllocSize(ObjectImage &Obj, 231 uint64_t &CodeSize, 232 uint64_t &DataSizeRO, 233 uint64_t &DataSizeRW) { 234 // Compute the size of all sections required for execution 235 std::vector<uint64_t> CodeSectionSizes; 236 std::vector<uint64_t> ROSectionSizes; 237 std::vector<uint64_t> RWSectionSizes; 238 uint64_t MaxAlignment = sizeof(void *); 239 240 // Collect sizes of all sections to be loaded; 241 // also determine the max alignment of all sections 242 for (section_iterator SI = Obj.begin_sections(), SE = Obj.end_sections(); 243 SI != SE; ++SI) { 244 const SectionRef &Section = *SI; 245 246 bool IsRequired; 247 Check(Section.isRequiredForExecution(IsRequired)); 248 249 // Consider only the sections that are required to be loaded for execution 250 if (IsRequired) { 251 uint64_t DataSize = 0; 252 uint64_t Alignment64 = 0; 253 bool IsCode = false; 254 bool IsReadOnly = false; 255 StringRef Name; 256 Check(Section.getSize(DataSize)); 257 Check(Section.getAlignment(Alignment64)); 258 Check(Section.isText(IsCode)); 259 Check(Section.isReadOnlyData(IsReadOnly)); 260 Check(Section.getName(Name)); 261 unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL; 262 263 uint64_t StubBufSize = computeSectionStubBufSize(Obj, Section); 264 uint64_t SectionSize = DataSize + StubBufSize; 265 266 // The .eh_frame section (at least on Linux) needs an extra four bytes 267 // padded 268 // with zeroes added at the end. For MachO objects, this section has a 269 // slightly different name, so this won't have any effect for MachO 270 // objects. 271 if (Name == ".eh_frame") 272 SectionSize += 4; 273 274 if (SectionSize > 0) { 275 // save the total size of the section 276 if (IsCode) { 277 CodeSectionSizes.push_back(SectionSize); 278 } else if (IsReadOnly) { 279 ROSectionSizes.push_back(SectionSize); 280 } else { 281 RWSectionSizes.push_back(SectionSize); 282 } 283 // update the max alignment 284 if (Alignment > MaxAlignment) { 285 MaxAlignment = Alignment; 286 } 287 } 288 } 289 } 290 291 // Compute the size of all common symbols 292 uint64_t CommonSize = 0; 293 for (symbol_iterator I = Obj.begin_symbols(), E = Obj.end_symbols(); I != E; 294 ++I) { 295 uint32_t Flags = I->getFlags(); 296 if (Flags & SymbolRef::SF_Common) { 297 // Add the common symbols to a list. We'll allocate them all below. 298 uint64_t Size = 0; 299 Check(I->getSize(Size)); 300 CommonSize += Size; 301 } 302 } 303 if (CommonSize != 0) { 304 RWSectionSizes.push_back(CommonSize); 305 } 306 307 // Compute the required allocation space for each different type of sections 308 // (code, read-only data, read-write data) assuming that all sections are 309 // allocated with the max alignment. Note that we cannot compute with the 310 // individual alignments of the sections, because then the required size 311 // depends on the order, in which the sections are allocated. 312 CodeSize = computeAllocationSizeForSections(CodeSectionSizes, MaxAlignment); 313 DataSizeRO = computeAllocationSizeForSections(ROSectionSizes, MaxAlignment); 314 DataSizeRW = computeAllocationSizeForSections(RWSectionSizes, MaxAlignment); 315 } 316 317 // compute stub buffer size for the given section 318 unsigned RuntimeDyldImpl::computeSectionStubBufSize(ObjectImage &Obj, 319 const SectionRef &Section) { 320 unsigned StubSize = getMaxStubSize(); 321 if (StubSize == 0) { 322 return 0; 323 } 324 // FIXME: this is an inefficient way to handle this. We should computed the 325 // necessary section allocation size in loadObject by walking all the sections 326 // once. 327 unsigned StubBufSize = 0; 328 for (section_iterator SI = Obj.begin_sections(), SE = Obj.end_sections(); 329 SI != SE; ++SI) { 330 section_iterator RelSecI = SI->getRelocatedSection(); 331 if (!(RelSecI == Section)) 332 continue; 333 334 for (const RelocationRef &Reloc : SI->relocations()) { 335 (void)Reloc; 336 StubBufSize += StubSize; 337 } 338 } 339 340 // Get section data size and alignment 341 uint64_t Alignment64; 342 uint64_t DataSize; 343 Check(Section.getSize(DataSize)); 344 Check(Section.getAlignment(Alignment64)); 345 346 // Add stubbuf size alignment 347 unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL; 348 unsigned StubAlignment = getStubAlignment(); 349 unsigned EndAlignment = (DataSize | Alignment) & -(DataSize | Alignment); 350 if (StubAlignment > EndAlignment) 351 StubBufSize += StubAlignment - EndAlignment; 352 return StubBufSize; 353 } 354 355 void RuntimeDyldImpl::emitCommonSymbols(ObjectImage &Obj, 356 const CommonSymbolMap &CommonSymbols, 357 uint64_t TotalSize, 358 SymbolTableMap &SymbolTable) { 359 // Allocate memory for the section 360 unsigned SectionID = Sections.size(); 361 uint8_t *Addr = MemMgr->allocateDataSection(TotalSize, sizeof(void *), 362 SectionID, StringRef(), false); 363 if (!Addr) 364 report_fatal_error("Unable to allocate memory for common symbols!"); 365 uint64_t Offset = 0; 366 Sections.push_back(SectionEntry(StringRef(), Addr, TotalSize, 0)); 367 memset(Addr, 0, TotalSize); 368 369 DEBUG(dbgs() << "emitCommonSection SectionID: " << SectionID << " new addr: " 370 << format("%p", Addr) << " DataSize: " << TotalSize << "\n"); 371 372 // Assign the address of each symbol 373 for (CommonSymbolMap::const_iterator it = CommonSymbols.begin(), 374 itEnd = CommonSymbols.end(); it != itEnd; ++it) { 375 uint64_t Size = it->second.first; 376 uint64_t Align = it->second.second; 377 StringRef Name; 378 it->first.getName(Name); 379 if (Align) { 380 // This symbol has an alignment requirement. 381 uint64_t AlignOffset = OffsetToAlignment((uint64_t)Addr, Align); 382 Addr += AlignOffset; 383 Offset += AlignOffset; 384 DEBUG(dbgs() << "Allocating common symbol " << Name << " address " 385 << format("%p\n", Addr)); 386 } 387 Obj.updateSymbolAddress(it->first, (uint64_t)Addr); 388 SymbolTable[Name.data()] = SymbolLoc(SectionID, Offset); 389 Offset += Size; 390 Addr += Size; 391 } 392 } 393 394 unsigned RuntimeDyldImpl::emitSection(ObjectImage &Obj, 395 const SectionRef &Section, bool IsCode) { 396 397 StringRef data; 398 uint64_t Alignment64; 399 Check(Section.getContents(data)); 400 Check(Section.getAlignment(Alignment64)); 401 402 unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL; 403 bool IsRequired; 404 bool IsVirtual; 405 bool IsZeroInit; 406 bool IsReadOnly; 407 uint64_t DataSize; 408 unsigned PaddingSize = 0; 409 unsigned StubBufSize = 0; 410 StringRef Name; 411 Check(Section.isRequiredForExecution(IsRequired)); 412 Check(Section.isVirtual(IsVirtual)); 413 Check(Section.isZeroInit(IsZeroInit)); 414 Check(Section.isReadOnlyData(IsReadOnly)); 415 Check(Section.getSize(DataSize)); 416 Check(Section.getName(Name)); 417 418 StubBufSize = computeSectionStubBufSize(Obj, Section); 419 420 // The .eh_frame section (at least on Linux) needs an extra four bytes padded 421 // with zeroes added at the end. For MachO objects, this section has a 422 // slightly different name, so this won't have any effect for MachO objects. 423 if (Name == ".eh_frame") 424 PaddingSize = 4; 425 426 uintptr_t Allocate; 427 unsigned SectionID = Sections.size(); 428 uint8_t *Addr; 429 const char *pData = 0; 430 431 // Some sections, such as debug info, don't need to be loaded for execution. 432 // Leave those where they are. 433 if (IsRequired) { 434 Allocate = DataSize + PaddingSize + StubBufSize; 435 Addr = IsCode ? MemMgr->allocateCodeSection(Allocate, Alignment, SectionID, 436 Name) 437 : MemMgr->allocateDataSection(Allocate, Alignment, SectionID, 438 Name, IsReadOnly); 439 if (!Addr) 440 report_fatal_error("Unable to allocate section memory!"); 441 442 // Virtual sections have no data in the object image, so leave pData = 0 443 if (!IsVirtual) 444 pData = data.data(); 445 446 // Zero-initialize or copy the data from the image 447 if (IsZeroInit || IsVirtual) 448 memset(Addr, 0, DataSize); 449 else 450 memcpy(Addr, pData, DataSize); 451 452 // Fill in any extra bytes we allocated for padding 453 if (PaddingSize != 0) { 454 memset(Addr + DataSize, 0, PaddingSize); 455 // Update the DataSize variable so that the stub offset is set correctly. 456 DataSize += PaddingSize; 457 } 458 459 DEBUG(dbgs() << "emitSection SectionID: " << SectionID << " Name: " << Name 460 << " obj addr: " << format("%p", pData) 461 << " new addr: " << format("%p", Addr) 462 << " DataSize: " << DataSize << " StubBufSize: " << StubBufSize 463 << " Allocate: " << Allocate << "\n"); 464 Obj.updateSectionAddress(Section, (uint64_t)Addr); 465 } else { 466 // Even if we didn't load the section, we need to record an entry for it 467 // to handle later processing (and by 'handle' I mean don't do anything 468 // with these sections). 469 Allocate = 0; 470 Addr = 0; 471 DEBUG(dbgs() << "emitSection SectionID: " << SectionID << " Name: " << Name 472 << " obj addr: " << format("%p", data.data()) << " new addr: 0" 473 << " DataSize: " << DataSize << " StubBufSize: " << StubBufSize 474 << " Allocate: " << Allocate << "\n"); 475 } 476 477 Sections.push_back(SectionEntry(Name, Addr, DataSize, (uintptr_t)pData)); 478 return SectionID; 479 } 480 481 unsigned RuntimeDyldImpl::findOrEmitSection(ObjectImage &Obj, 482 const SectionRef &Section, 483 bool IsCode, 484 ObjSectionToIDMap &LocalSections) { 485 486 unsigned SectionID = 0; 487 ObjSectionToIDMap::iterator i = LocalSections.find(Section); 488 if (i != LocalSections.end()) 489 SectionID = i->second; 490 else { 491 SectionID = emitSection(Obj, Section, IsCode); 492 LocalSections[Section] = SectionID; 493 } 494 return SectionID; 495 } 496 497 void RuntimeDyldImpl::addRelocationForSection(const RelocationEntry &RE, 498 unsigned SectionID) { 499 Relocations[SectionID].push_back(RE); 500 } 501 502 void RuntimeDyldImpl::addRelocationForSymbol(const RelocationEntry &RE, 503 StringRef SymbolName) { 504 // Relocation by symbol. If the symbol is found in the global symbol table, 505 // create an appropriate section relocation. Otherwise, add it to 506 // ExternalSymbolRelocations. 507 SymbolTableMap::const_iterator Loc = GlobalSymbolTable.find(SymbolName); 508 if (Loc == GlobalSymbolTable.end()) { 509 ExternalSymbolRelocations[SymbolName].push_back(RE); 510 } else { 511 // Copy the RE since we want to modify its addend. 512 RelocationEntry RECopy = RE; 513 RECopy.Addend += Loc->second.second; 514 Relocations[Loc->second.first].push_back(RECopy); 515 } 516 } 517 518 uint8_t *RuntimeDyldImpl::createStubFunction(uint8_t *Addr) { 519 if (Arch == Triple::aarch64 || Arch == Triple::aarch64_be) { 520 // This stub has to be able to access the full address space, 521 // since symbol lookup won't necessarily find a handy, in-range, 522 // PLT stub for functions which could be anywhere. 523 uint32_t *StubAddr = (uint32_t *)Addr; 524 525 // Stub can use ip0 (== x16) to calculate address 526 *StubAddr = 0xd2e00010; // movz ip0, #:abs_g3:<addr> 527 StubAddr++; 528 *StubAddr = 0xf2c00010; // movk ip0, #:abs_g2_nc:<addr> 529 StubAddr++; 530 *StubAddr = 0xf2a00010; // movk ip0, #:abs_g1_nc:<addr> 531 StubAddr++; 532 *StubAddr = 0xf2800010; // movk ip0, #:abs_g0_nc:<addr> 533 StubAddr++; 534 *StubAddr = 0xd61f0200; // br ip0 535 536 return Addr; 537 } else if (Arch == Triple::arm || Arch == Triple::armeb) { 538 // TODO: There is only ARM far stub now. We should add the Thumb stub, 539 // and stubs for branches Thumb - ARM and ARM - Thumb. 540 uint32_t *StubAddr = (uint32_t *)Addr; 541 *StubAddr = 0xe51ff004; // ldr pc,<label> 542 return (uint8_t *)++StubAddr; 543 } else if (Arch == Triple::mipsel || Arch == Triple::mips) { 544 uint32_t *StubAddr = (uint32_t *)Addr; 545 // 0: 3c190000 lui t9,%hi(addr). 546 // 4: 27390000 addiu t9,t9,%lo(addr). 547 // 8: 03200008 jr t9. 548 // c: 00000000 nop. 549 const unsigned LuiT9Instr = 0x3c190000, AdduiT9Instr = 0x27390000; 550 const unsigned JrT9Instr = 0x03200008, NopInstr = 0x0; 551 552 *StubAddr = LuiT9Instr; 553 StubAddr++; 554 *StubAddr = AdduiT9Instr; 555 StubAddr++; 556 *StubAddr = JrT9Instr; 557 StubAddr++; 558 *StubAddr = NopInstr; 559 return Addr; 560 } else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le) { 561 // PowerPC64 stub: the address points to a function descriptor 562 // instead of the function itself. Load the function address 563 // on r11 and sets it to control register. Also loads the function 564 // TOC in r2 and environment pointer to r11. 565 writeInt32BE(Addr, 0x3D800000); // lis r12, highest(addr) 566 writeInt32BE(Addr+4, 0x618C0000); // ori r12, higher(addr) 567 writeInt32BE(Addr+8, 0x798C07C6); // sldi r12, r12, 32 568 writeInt32BE(Addr+12, 0x658C0000); // oris r12, r12, h(addr) 569 writeInt32BE(Addr+16, 0x618C0000); // ori r12, r12, l(addr) 570 writeInt32BE(Addr+20, 0xF8410028); // std r2, 40(r1) 571 writeInt32BE(Addr+24, 0xE96C0000); // ld r11, 0(r12) 572 writeInt32BE(Addr+28, 0xE84C0008); // ld r2, 0(r12) 573 writeInt32BE(Addr+32, 0x7D6903A6); // mtctr r11 574 writeInt32BE(Addr+36, 0xE96C0010); // ld r11, 16(r2) 575 writeInt32BE(Addr+40, 0x4E800420); // bctr 576 577 return Addr; 578 } else if (Arch == Triple::systemz) { 579 writeInt16BE(Addr, 0xC418); // lgrl %r1,.+8 580 writeInt16BE(Addr+2, 0x0000); 581 writeInt16BE(Addr+4, 0x0004); 582 writeInt16BE(Addr+6, 0x07F1); // brc 15,%r1 583 // 8-byte address stored at Addr + 8 584 return Addr; 585 } else if (Arch == Triple::x86_64) { 586 *Addr = 0xFF; // jmp 587 *(Addr+1) = 0x25; // rip 588 // 32-bit PC-relative address of the GOT entry will be stored at Addr+2 589 } 590 return Addr; 591 } 592 593 // Assign an address to a symbol name and resolve all the relocations 594 // associated with it. 595 void RuntimeDyldImpl::reassignSectionAddress(unsigned SectionID, 596 uint64_t Addr) { 597 // The address to use for relocation resolution is not 598 // the address of the local section buffer. We must be doing 599 // a remote execution environment of some sort. Relocations can't 600 // be applied until all the sections have been moved. The client must 601 // trigger this with a call to MCJIT::finalize() or 602 // RuntimeDyld::resolveRelocations(). 603 // 604 // Addr is a uint64_t because we can't assume the pointer width 605 // of the target is the same as that of the host. Just use a generic 606 // "big enough" type. 607 Sections[SectionID].LoadAddress = Addr; 608 } 609 610 void RuntimeDyldImpl::resolveRelocationList(const RelocationList &Relocs, 611 uint64_t Value) { 612 for (unsigned i = 0, e = Relocs.size(); i != e; ++i) { 613 const RelocationEntry &RE = Relocs[i]; 614 // Ignore relocations for sections that were not loaded 615 if (Sections[RE.SectionID].Address == 0) 616 continue; 617 resolveRelocation(RE, Value); 618 } 619 } 620 621 void RuntimeDyldImpl::resolveExternalSymbols() { 622 while (!ExternalSymbolRelocations.empty()) { 623 StringMap<RelocationList>::iterator i = ExternalSymbolRelocations.begin(); 624 625 StringRef Name = i->first(); 626 if (Name.size() == 0) { 627 // This is an absolute symbol, use an address of zero. 628 DEBUG(dbgs() << "Resolving absolute relocations." 629 << "\n"); 630 RelocationList &Relocs = i->second; 631 resolveRelocationList(Relocs, 0); 632 } else { 633 uint64_t Addr = 0; 634 SymbolTableMap::const_iterator Loc = GlobalSymbolTable.find(Name); 635 if (Loc == GlobalSymbolTable.end()) { 636 // This is an external symbol, try to get its address from 637 // MemoryManager. 638 Addr = MemMgr->getSymbolAddress(Name.data()); 639 // The call to getSymbolAddress may have caused additional modules to 640 // be loaded, which may have added new entries to the 641 // ExternalSymbolRelocations map. Consquently, we need to update our 642 // iterator. This is also why retrieval of the relocation list 643 // associated with this symbol is deferred until below this point. 644 // New entries may have been added to the relocation list. 645 i = ExternalSymbolRelocations.find(Name); 646 } else { 647 // We found the symbol in our global table. It was probably in a 648 // Module that we loaded previously. 649 SymbolLoc SymLoc = Loc->second; 650 Addr = getSectionLoadAddress(SymLoc.first) + SymLoc.second; 651 } 652 653 // FIXME: Implement error handling that doesn't kill the host program! 654 if (!Addr) 655 report_fatal_error("Program used external function '" + Name + 656 "' which could not be resolved!"); 657 658 updateGOTEntries(Name, Addr); 659 DEBUG(dbgs() << "Resolving relocations Name: " << Name << "\t" 660 << format("0x%lx", Addr) << "\n"); 661 // This list may have been updated when we called getSymbolAddress, so 662 // don't change this code to get the list earlier. 663 RelocationList &Relocs = i->second; 664 resolveRelocationList(Relocs, Addr); 665 } 666 667 ExternalSymbolRelocations.erase(i); 668 } 669 } 670 671 //===----------------------------------------------------------------------===// 672 // RuntimeDyld class implementation 673 RuntimeDyld::RuntimeDyld(RTDyldMemoryManager *mm) { 674 // FIXME: There's a potential issue lurking here if a single instance of 675 // RuntimeDyld is used to load multiple objects. The current implementation 676 // associates a single memory manager with a RuntimeDyld instance. Even 677 // though the public class spawns a new 'impl' instance for each load, 678 // they share a single memory manager. This can become a problem when page 679 // permissions are applied. 680 Dyld = 0; 681 MM = mm; 682 ProcessAllSections = false; 683 } 684 685 RuntimeDyld::~RuntimeDyld() { delete Dyld; } 686 687 static std::unique_ptr<RuntimeDyldELF> 688 createRuntimeDyldELF(RTDyldMemoryManager *MM, bool ProcessAllSections) { 689 std::unique_ptr<RuntimeDyldELF> Dyld(new RuntimeDyldELF(MM)); 690 Dyld->setProcessAllSections(ProcessAllSections); 691 return Dyld; 692 } 693 694 static std::unique_ptr<RuntimeDyldMachO> 695 createRuntimeDyldMachO(RTDyldMemoryManager *MM, bool ProcessAllSections) { 696 std::unique_ptr<RuntimeDyldMachO> Dyld(new RuntimeDyldMachO(MM)); 697 Dyld->setProcessAllSections(ProcessAllSections); 698 return Dyld; 699 } 700 701 ObjectImage *RuntimeDyld::loadObject(ObjectFile *InputObject) { 702 std::unique_ptr<ObjectImage> InputImage; 703 704 if (InputObject->isELF()) { 705 InputImage.reset(RuntimeDyldELF::createObjectImageFromFile(InputObject)); 706 if (!Dyld) 707 Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release(); 708 } else if (InputObject->isMachO()) { 709 InputImage.reset(RuntimeDyldMachO::createObjectImageFromFile(InputObject)); 710 if (!Dyld) 711 Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release(); 712 } else 713 report_fatal_error("Incompatible object format!"); 714 715 if (!Dyld->isCompatibleFile(InputObject)) 716 report_fatal_error("Incompatible object format!"); 717 718 Dyld->loadObject(InputImage.get()); 719 return InputImage.release(); 720 } 721 722 ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) { 723 std::unique_ptr<ObjectImage> InputImage; 724 sys::fs::file_magic Type = sys::fs::identify_magic(InputBuffer->getBuffer()); 725 726 switch (Type) { 727 case sys::fs::file_magic::elf_relocatable: 728 case sys::fs::file_magic::elf_executable: 729 case sys::fs::file_magic::elf_shared_object: 730 case sys::fs::file_magic::elf_core: 731 InputImage.reset(RuntimeDyldELF::createObjectImage(InputBuffer)); 732 if (!Dyld) 733 Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release(); 734 break; 735 case sys::fs::file_magic::macho_object: 736 case sys::fs::file_magic::macho_executable: 737 case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib: 738 case sys::fs::file_magic::macho_core: 739 case sys::fs::file_magic::macho_preload_executable: 740 case sys::fs::file_magic::macho_dynamically_linked_shared_lib: 741 case sys::fs::file_magic::macho_dynamic_linker: 742 case sys::fs::file_magic::macho_bundle: 743 case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: 744 case sys::fs::file_magic::macho_dsym_companion: 745 InputImage.reset(RuntimeDyldMachO::createObjectImage(InputBuffer)); 746 if (!Dyld) 747 Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release(); 748 break; 749 case sys::fs::file_magic::unknown: 750 case sys::fs::file_magic::bitcode: 751 case sys::fs::file_magic::archive: 752 case sys::fs::file_magic::coff_object: 753 case sys::fs::file_magic::coff_import_library: 754 case sys::fs::file_magic::pecoff_executable: 755 case sys::fs::file_magic::macho_universal_binary: 756 case sys::fs::file_magic::windows_resource: 757 report_fatal_error("Incompatible object format!"); 758 } 759 760 if (!Dyld->isCompatibleFormat(InputBuffer)) 761 report_fatal_error("Incompatible object format!"); 762 763 Dyld->loadObject(InputImage.get()); 764 return InputImage.release(); 765 } 766 767 void *RuntimeDyld::getSymbolAddress(StringRef Name) { 768 if (!Dyld) 769 return NULL; 770 return Dyld->getSymbolAddress(Name); 771 } 772 773 uint64_t RuntimeDyld::getSymbolLoadAddress(StringRef Name) { 774 if (!Dyld) 775 return 0; 776 return Dyld->getSymbolLoadAddress(Name); 777 } 778 779 void RuntimeDyld::resolveRelocations() { Dyld->resolveRelocations(); } 780 781 void RuntimeDyld::reassignSectionAddress(unsigned SectionID, uint64_t Addr) { 782 Dyld->reassignSectionAddress(SectionID, Addr); 783 } 784 785 void RuntimeDyld::mapSectionAddress(const void *LocalAddress, 786 uint64_t TargetAddress) { 787 Dyld->mapSectionAddress(LocalAddress, TargetAddress); 788 } 789 790 bool RuntimeDyld::hasError() { return Dyld->hasError(); } 791 792 StringRef RuntimeDyld::getErrorString() { return Dyld->getErrorString(); } 793 794 void RuntimeDyld::registerEHFrames() { 795 if (Dyld) 796 Dyld->registerEHFrames(); 797 } 798 799 void RuntimeDyld::deregisterEHFrames() { 800 if (Dyld) 801 Dyld->deregisterEHFrames(); 802 } 803 804 } // end namespace llvm 805