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