RuntimeDyldELF.cpp revision 0ff917e85472b98aec8f9d48647cde6941a5ea27
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#define DEBUG_TYPE "dyld" 15#include "RuntimeDyldELF.h" 16#include "JITRegistrar.h" 17#include "ObjectImageCommon.h" 18#include "llvm/ADT/IntervalMap.h" 19#include "llvm/ADT/OwningPtr.h" 20#include "llvm/ADT/STLExtras.h" 21#include "llvm/ADT/StringRef.h" 22#include "llvm/ADT/Triple.h" 23#include "llvm/ExecutionEngine/ObjectBuffer.h" 24#include "llvm/ExecutionEngine/ObjectImage.h" 25#include "llvm/Object/ELFObjectFile.h" 26#include "llvm/Object/ObjectFile.h" 27#include "llvm/Support/ELF.h" 28using namespace llvm; 29using namespace llvm::object; 30 31namespace { 32 33static inline 34error_code check(error_code Err) { 35 if (Err) { 36 report_fatal_error(Err.message()); 37 } 38 return Err; 39} 40 41template<class ELFT> 42class DyldELFObject 43 : public ELFObjectFile<ELFT> { 44 LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) 45 46 typedef Elf_Shdr_Impl<ELFT> Elf_Shdr; 47 typedef Elf_Sym_Impl<ELFT> Elf_Sym; 48 typedef 49 Elf_Rel_Impl<ELFT, false> Elf_Rel; 50 typedef 51 Elf_Rel_Impl<ELFT, true> Elf_Rela; 52 53 typedef Elf_Ehdr_Impl<ELFT> Elf_Ehdr; 54 55 typedef typename ELFDataTypeTypedefHelper< 56 ELFT>::value_type addr_type; 57 58public: 59 DyldELFObject(MemoryBuffer *Wrapper, error_code &ec); 60 61 void updateSectionAddress(const SectionRef &Sec, uint64_t Addr); 62 void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr); 63 64 // Methods for type inquiry through isa, cast and dyn_cast 65 static inline bool classof(const Binary *v) { 66 return (isa<ELFObjectFile<ELFT> >(v) 67 && classof(cast<ELFObjectFile 68 <ELFT> >(v))); 69 } 70 static inline bool classof( 71 const ELFObjectFile<ELFT> *v) { 72 return v->isDyldType(); 73 } 74}; 75 76template<class ELFT> 77class ELFObjectImage : public ObjectImageCommon { 78 protected: 79 DyldELFObject<ELFT> *DyldObj; 80 bool Registered; 81 82 public: 83 ELFObjectImage(ObjectBuffer *Input, 84 DyldELFObject<ELFT> *Obj) 85 : ObjectImageCommon(Input, Obj), 86 DyldObj(Obj), 87 Registered(false) {} 88 89 virtual ~ELFObjectImage() { 90 if (Registered) 91 deregisterWithDebugger(); 92 } 93 94 // Subclasses can override these methods to update the image with loaded 95 // addresses for sections and common symbols 96 virtual void updateSectionAddress(const SectionRef &Sec, uint64_t Addr) 97 { 98 DyldObj->updateSectionAddress(Sec, Addr); 99 } 100 101 virtual void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr) 102 { 103 DyldObj->updateSymbolAddress(Sym, Addr); 104 } 105 106 virtual void registerWithDebugger() 107 { 108 JITRegistrar::getGDBRegistrar().registerObject(*Buffer); 109 Registered = true; 110 } 111 virtual void deregisterWithDebugger() 112 { 113 JITRegistrar::getGDBRegistrar().deregisterObject(*Buffer); 114 } 115}; 116 117// The MemoryBuffer passed into this constructor is just a wrapper around the 118// actual memory. Ultimately, the Binary parent class will take ownership of 119// this MemoryBuffer object but not the underlying memory. 120template<class ELFT> 121DyldELFObject<ELFT>::DyldELFObject(MemoryBuffer *Wrapper, error_code &ec) 122 : ELFObjectFile<ELFT>(Wrapper, ec) { 123 this->isDyldELFObject = true; 124} 125 126template<class ELFT> 127void DyldELFObject<ELFT>::updateSectionAddress(const SectionRef &Sec, 128 uint64_t Addr) { 129 DataRefImpl ShdrRef = Sec.getRawDataRefImpl(); 130 Elf_Shdr *shdr = const_cast<Elf_Shdr*>( 131 reinterpret_cast<const Elf_Shdr *>(ShdrRef.p)); 132 133 // This assumes the address passed in matches the target address bitness 134 // The template-based type cast handles everything else. 135 shdr->sh_addr = static_cast<addr_type>(Addr); 136} 137 138template<class ELFT> 139void DyldELFObject<ELFT>::updateSymbolAddress(const SymbolRef &SymRef, 140 uint64_t Addr) { 141 142 Elf_Sym *sym = const_cast<Elf_Sym*>( 143 ELFObjectFile<ELFT>::getSymbol(SymRef.getRawDataRefImpl())); 144 145 // This assumes the address passed in matches the target address bitness 146 // The template-based type cast handles everything else. 147 sym->st_value = static_cast<addr_type>(Addr); 148} 149 150} // namespace 151 152namespace llvm { 153 154void RuntimeDyldELF::registerEHFrames() { 155 if (!MemMgr) 156 return; 157 for (int i = 0, e = UnregisteredEHFrameSections.size(); i != e; ++i) { 158 SID EHFrameSID = UnregisteredEHFrameSections[i]; 159 uint8_t *EHFrameAddr = Sections[EHFrameSID].Address; 160 uint64_t EHFrameLoadAddr = Sections[EHFrameSID].LoadAddress; 161 size_t EHFrameSize = Sections[EHFrameSID].Size; 162 MemMgr->registerEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize); 163 RegisteredEHFrameSections.push_back(EHFrameSID); 164 } 165 UnregisteredEHFrameSections.clear(); 166} 167 168void RuntimeDyldELF::deregisterEHFrames() { 169 if (!MemMgr) 170 return; 171 for (int i = 0, e = RegisteredEHFrameSections.size(); i != e; ++i) { 172 SID EHFrameSID = RegisteredEHFrameSections[i]; 173 uint8_t *EHFrameAddr = Sections[EHFrameSID].Address; 174 uint64_t EHFrameLoadAddr = Sections[EHFrameSID].LoadAddress; 175 size_t EHFrameSize = Sections[EHFrameSID].Size; 176 MemMgr->deregisterEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize); 177 } 178 RegisteredEHFrameSections.clear(); 179} 180 181ObjectImage *RuntimeDyldELF::createObjectImage(ObjectBuffer *Buffer) { 182 if (Buffer->getBufferSize() < ELF::EI_NIDENT) 183 llvm_unreachable("Unexpected ELF object size"); 184 std::pair<unsigned char, unsigned char> Ident = std::make_pair( 185 (uint8_t)Buffer->getBufferStart()[ELF::EI_CLASS], 186 (uint8_t)Buffer->getBufferStart()[ELF::EI_DATA]); 187 error_code ec; 188 189 if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) { 190 DyldELFObject<ELFType<support::little, 4, false> > *Obj = 191 new DyldELFObject<ELFType<support::little, 4, false> >( 192 Buffer->getMemBuffer(), ec); 193 return new ELFObjectImage<ELFType<support::little, 4, false> >(Buffer, Obj); 194 } 195 else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) { 196 DyldELFObject<ELFType<support::big, 4, false> > *Obj = 197 new DyldELFObject<ELFType<support::big, 4, false> >( 198 Buffer->getMemBuffer(), ec); 199 return new ELFObjectImage<ELFType<support::big, 4, false> >(Buffer, Obj); 200 } 201 else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) { 202 DyldELFObject<ELFType<support::big, 8, true> > *Obj = 203 new DyldELFObject<ELFType<support::big, 8, true> >( 204 Buffer->getMemBuffer(), ec); 205 return new ELFObjectImage<ELFType<support::big, 8, true> >(Buffer, Obj); 206 } 207 else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { 208 DyldELFObject<ELFType<support::little, 8, true> > *Obj = 209 new DyldELFObject<ELFType<support::little, 8, true> >( 210 Buffer->getMemBuffer(), ec); 211 return new ELFObjectImage<ELFType<support::little, 8, true> >(Buffer, Obj); 212 } 213 else 214 llvm_unreachable("Unexpected ELF format"); 215} 216 217RuntimeDyldELF::~RuntimeDyldELF() { 218} 219 220void RuntimeDyldELF::resolveX86_64Relocation(const SectionEntry &Section, 221 uint64_t Offset, 222 uint64_t Value, 223 uint32_t Type, 224 int64_t Addend, 225 uint64_t SymOffset) { 226 switch (Type) { 227 default: 228 llvm_unreachable("Relocation type not implemented yet!"); 229 break; 230 case ELF::R_X86_64_64: { 231 uint64_t *Target = reinterpret_cast<uint64_t*>(Section.Address + Offset); 232 *Target = Value + Addend; 233 DEBUG(dbgs() << "Writing " << format("%p", (Value + Addend)) 234 << " at " << format("%p\n",Target)); 235 break; 236 } 237 case ELF::R_X86_64_32: 238 case ELF::R_X86_64_32S: { 239 Value += Addend; 240 assert((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) || 241 (Type == ELF::R_X86_64_32S && 242 ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN))); 243 uint32_t TruncatedAddr = (Value & 0xFFFFFFFF); 244 uint32_t *Target = reinterpret_cast<uint32_t*>(Section.Address + Offset); 245 *Target = TruncatedAddr; 246 DEBUG(dbgs() << "Writing " << format("%p", TruncatedAddr) 247 << " at " << format("%p\n",Target)); 248 break; 249 } 250 case ELF::R_X86_64_GOTPCREL: { 251 // findGOTEntry returns the 'G + GOT' part of the relocation calculation 252 // based on the load/target address of the GOT (not the current/local addr). 253 uint64_t GOTAddr = findGOTEntry(Value, SymOffset); 254 uint32_t *Target = reinterpret_cast<uint32_t*>(Section.Address + Offset); 255 uint64_t FinalAddress = Section.LoadAddress + Offset; 256 // The processRelocationRef method combines the symbol offset and the addend 257 // and in most cases that's what we want. For this relocation type, we need 258 // the raw addend, so we subtract the symbol offset to get it. 259 int64_t RealOffset = GOTAddr + Addend - SymOffset - FinalAddress; 260 assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN); 261 int32_t TruncOffset = (RealOffset & 0xFFFFFFFF); 262 *Target = TruncOffset; 263 break; 264 } 265 case ELF::R_X86_64_PC32: { 266 // Get the placeholder value from the generated object since 267 // a previous relocation attempt may have overwritten the loaded version 268 uint32_t *Placeholder = reinterpret_cast<uint32_t*>(Section.ObjAddress 269 + Offset); 270 uint32_t *Target = reinterpret_cast<uint32_t*>(Section.Address + Offset); 271 uint64_t FinalAddress = Section.LoadAddress + Offset; 272 int64_t RealOffset = *Placeholder + Value + Addend - FinalAddress; 273 assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN); 274 int32_t TruncOffset = (RealOffset & 0xFFFFFFFF); 275 *Target = TruncOffset; 276 break; 277 } 278 case ELF::R_X86_64_PC64: { 279 // Get the placeholder value from the generated object since 280 // a previous relocation attempt may have overwritten the loaded version 281 uint64_t *Placeholder = reinterpret_cast<uint64_t*>(Section.ObjAddress 282 + Offset); 283 uint64_t *Target = reinterpret_cast<uint64_t*>(Section.Address + Offset); 284 uint64_t FinalAddress = Section.LoadAddress + Offset; 285 *Target = *Placeholder + Value + Addend - FinalAddress; 286 break; 287 } 288 } 289} 290 291void RuntimeDyldELF::resolveX86Relocation(const SectionEntry &Section, 292 uint64_t Offset, 293 uint32_t Value, 294 uint32_t Type, 295 int32_t Addend) { 296 switch (Type) { 297 case ELF::R_386_32: { 298 // Get the placeholder value from the generated object since 299 // a previous relocation attempt may have overwritten the loaded version 300 uint32_t *Placeholder = reinterpret_cast<uint32_t*>(Section.ObjAddress 301 + Offset); 302 uint32_t *Target = reinterpret_cast<uint32_t*>(Section.Address + Offset); 303 *Target = *Placeholder + Value + Addend; 304 break; 305 } 306 case ELF::R_386_PC32: { 307 // Get the placeholder value from the generated object since 308 // a previous relocation attempt may have overwritten the loaded version 309 uint32_t *Placeholder = reinterpret_cast<uint32_t*>(Section.ObjAddress 310 + Offset); 311 uint32_t *Target = reinterpret_cast<uint32_t*>(Section.Address + Offset); 312 uint32_t FinalAddress = ((Section.LoadAddress + Offset) & 0xFFFFFFFF); 313 uint32_t RealOffset = *Placeholder + Value + Addend - FinalAddress; 314 *Target = RealOffset; 315 break; 316 } 317 default: 318 // There are other relocation types, but it appears these are the 319 // only ones currently used by the LLVM ELF object writer 320 llvm_unreachable("Relocation type not implemented yet!"); 321 break; 322 } 323} 324 325void RuntimeDyldELF::resolveAArch64Relocation(const SectionEntry &Section, 326 uint64_t Offset, 327 uint64_t Value, 328 uint32_t Type, 329 int64_t Addend) { 330 uint32_t *TargetPtr = reinterpret_cast<uint32_t*>(Section.Address + Offset); 331 uint64_t FinalAddress = Section.LoadAddress + Offset; 332 333 DEBUG(dbgs() << "resolveAArch64Relocation, LocalAddress: 0x" 334 << format("%llx", Section.Address + Offset) 335 << " FinalAddress: 0x" << format("%llx",FinalAddress) 336 << " Value: 0x" << format("%llx",Value) 337 << " Type: 0x" << format("%x",Type) 338 << " Addend: 0x" << format("%llx",Addend) 339 << "\n"); 340 341 switch (Type) { 342 default: 343 llvm_unreachable("Relocation type not implemented yet!"); 344 break; 345 case ELF::R_AARCH64_ABS64: { 346 uint64_t *TargetPtr = reinterpret_cast<uint64_t*>(Section.Address + Offset); 347 *TargetPtr = Value + Addend; 348 break; 349 } 350 case ELF::R_AARCH64_PREL32: { 351 uint64_t Result = Value + Addend - FinalAddress; 352 assert(static_cast<int64_t>(Result) >= INT32_MIN && 353 static_cast<int64_t>(Result) <= UINT32_MAX); 354 *TargetPtr = static_cast<uint32_t>(Result & 0xffffffffU); 355 break; 356 } 357 case ELF::R_AARCH64_CALL26: // fallthrough 358 case ELF::R_AARCH64_JUMP26: { 359 // Operation: S+A-P. Set Call or B immediate value to bits fff_fffc of the 360 // calculation. 361 uint64_t BranchImm = Value + Addend - FinalAddress; 362 363 // "Check that -2^27 <= result < 2^27". 364 assert(-(1LL << 27) <= static_cast<int64_t>(BranchImm) && 365 static_cast<int64_t>(BranchImm) < (1LL << 27)); 366 367 // AArch64 code is emitted with .rela relocations. The data already in any 368 // bits affected by the relocation on entry is garbage. 369 *TargetPtr &= 0xfc000000U; 370 // Immediate goes in bits 25:0 of B and BL. 371 *TargetPtr |= static_cast<uint32_t>(BranchImm & 0xffffffcU) >> 2; 372 break; 373 } 374 case ELF::R_AARCH64_MOVW_UABS_G3: { 375 uint64_t Result = Value + Addend; 376 377 // AArch64 code is emitted with .rela relocations. The data already in any 378 // bits affected by the relocation on entry is garbage. 379 *TargetPtr &= 0xffe0001fU; 380 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 381 *TargetPtr |= Result >> (48 - 5); 382 // Shift must be "lsl #48", in bits 22:21 383 assert((*TargetPtr >> 21 & 0x3) == 3 && "invalid shift for relocation"); 384 break; 385 } 386 case ELF::R_AARCH64_MOVW_UABS_G2_NC: { 387 uint64_t Result = Value + Addend; 388 389 // AArch64 code is emitted with .rela relocations. The data already in any 390 // bits affected by the relocation on entry is garbage. 391 *TargetPtr &= 0xffe0001fU; 392 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 393 *TargetPtr |= ((Result & 0xffff00000000ULL) >> (32 - 5)); 394 // Shift must be "lsl #32", in bits 22:21 395 assert((*TargetPtr >> 21 & 0x3) == 2 && "invalid shift for relocation"); 396 break; 397 } 398 case ELF::R_AARCH64_MOVW_UABS_G1_NC: { 399 uint64_t Result = Value + Addend; 400 401 // AArch64 code is emitted with .rela relocations. The data already in any 402 // bits affected by the relocation on entry is garbage. 403 *TargetPtr &= 0xffe0001fU; 404 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 405 *TargetPtr |= ((Result & 0xffff0000U) >> (16 - 5)); 406 // Shift must be "lsl #16", in bits 22:2 407 assert((*TargetPtr >> 21 & 0x3) == 1 && "invalid shift for relocation"); 408 break; 409 } 410 case ELF::R_AARCH64_MOVW_UABS_G0_NC: { 411 uint64_t Result = Value + Addend; 412 413 // AArch64 code is emitted with .rela relocations. The data already in any 414 // bits affected by the relocation on entry is garbage. 415 *TargetPtr &= 0xffe0001fU; 416 // Immediate goes in bits 20:5 of MOVZ/MOVK instruction 417 *TargetPtr |= ((Result & 0xffffU) << 5); 418 // Shift must be "lsl #0", in bits 22:21. 419 assert((*TargetPtr >> 21 & 0x3) == 0 && "invalid shift for relocation"); 420 break; 421 } 422 } 423} 424 425void RuntimeDyldELF::resolveARMRelocation(const SectionEntry &Section, 426 uint64_t Offset, 427 uint32_t Value, 428 uint32_t Type, 429 int32_t Addend) { 430 // TODO: Add Thumb relocations. 431 uint32_t *Placeholder = reinterpret_cast<uint32_t*>(Section.ObjAddress + 432 Offset); 433 uint32_t* TargetPtr = (uint32_t*)(Section.Address + Offset); 434 uint32_t FinalAddress = ((Section.LoadAddress + Offset) & 0xFFFFFFFF); 435 Value += Addend; 436 437 DEBUG(dbgs() << "resolveARMRelocation, LocalAddress: " 438 << Section.Address + Offset 439 << " FinalAddress: " << format("%p",FinalAddress) 440 << " Value: " << format("%x",Value) 441 << " Type: " << format("%x",Type) 442 << " Addend: " << format("%x",Addend) 443 << "\n"); 444 445 switch(Type) { 446 default: 447 llvm_unreachable("Not implemented relocation type!"); 448 449 // Write a 32bit value to relocation address, taking into account the 450 // implicit addend encoded in the target. 451 case ELF::R_ARM_TARGET1: 452 case ELF::R_ARM_ABS32: 453 *TargetPtr = *Placeholder + Value; 454 break; 455 // Write first 16 bit of 32 bit value to the mov instruction. 456 // Last 4 bit should be shifted. 457 case ELF::R_ARM_MOVW_ABS_NC: 458 // We are not expecting any other addend in the relocation address. 459 // Using 0x000F0FFF because MOVW has its 16 bit immediate split into 2 460 // non-contiguous fields. 461 assert((*Placeholder & 0x000F0FFF) == 0); 462 Value = Value & 0xFFFF; 463 *TargetPtr = *Placeholder | (Value & 0xFFF); 464 *TargetPtr |= ((Value >> 12) & 0xF) << 16; 465 break; 466 // Write last 16 bit of 32 bit value to the mov instruction. 467 // Last 4 bit should be shifted. 468 case ELF::R_ARM_MOVT_ABS: 469 // We are not expecting any other addend in the relocation address. 470 // Use 0x000F0FFF for the same reason as R_ARM_MOVW_ABS_NC. 471 assert((*Placeholder & 0x000F0FFF) == 0); 472 473 Value = (Value >> 16) & 0xFFFF; 474 *TargetPtr = *Placeholder | (Value & 0xFFF); 475 *TargetPtr |= ((Value >> 12) & 0xF) << 16; 476 break; 477 // Write 24 bit relative value to the branch instruction. 478 case ELF::R_ARM_PC24 : // Fall through. 479 case ELF::R_ARM_CALL : // Fall through. 480 case ELF::R_ARM_JUMP24: { 481 int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8); 482 RelValue = (RelValue & 0x03FFFFFC) >> 2; 483 assert((*TargetPtr & 0xFFFFFF) == 0xFFFFFE); 484 *TargetPtr &= 0xFF000000; 485 *TargetPtr |= RelValue; 486 break; 487 } 488 case ELF::R_ARM_PRIVATE_0: 489 // This relocation is reserved by the ARM ELF ABI for internal use. We 490 // appropriate it here to act as an R_ARM_ABS32 without any addend for use 491 // in the stubs created during JIT (which can't put an addend into the 492 // original object file). 493 *TargetPtr = Value; 494 break; 495 } 496} 497 498void RuntimeDyldELF::resolveMIPSRelocation(const SectionEntry &Section, 499 uint64_t Offset, 500 uint32_t Value, 501 uint32_t Type, 502 int32_t Addend) { 503 uint32_t *Placeholder = reinterpret_cast<uint32_t*>(Section.ObjAddress + 504 Offset); 505 uint32_t* TargetPtr = (uint32_t*)(Section.Address + Offset); 506 Value += Addend; 507 508 DEBUG(dbgs() << "resolveMipselocation, LocalAddress: " 509 << Section.Address + Offset 510 << " FinalAddress: " 511 << format("%p",Section.LoadAddress + Offset) 512 << " Value: " << format("%x",Value) 513 << " Type: " << format("%x",Type) 514 << " Addend: " << format("%x",Addend) 515 << "\n"); 516 517 switch(Type) { 518 default: 519 llvm_unreachable("Not implemented relocation type!"); 520 break; 521 case ELF::R_MIPS_32: 522 *TargetPtr = Value + (*Placeholder); 523 break; 524 case ELF::R_MIPS_26: 525 *TargetPtr = ((*Placeholder) & 0xfc000000) | (( Value & 0x0fffffff) >> 2); 526 break; 527 case ELF::R_MIPS_HI16: 528 // Get the higher 16-bits. Also add 1 if bit 15 is 1. 529 Value += ((*Placeholder) & 0x0000ffff) << 16; 530 *TargetPtr = ((*Placeholder) & 0xffff0000) | 531 (((Value + 0x8000) >> 16) & 0xffff); 532 break; 533 case ELF::R_MIPS_LO16: 534 Value += ((*Placeholder) & 0x0000ffff); 535 *TargetPtr = ((*Placeholder) & 0xffff0000) | (Value & 0xffff); 536 break; 537 case ELF::R_MIPS_UNUSED1: 538 // Similar to ELF::R_ARM_PRIVATE_0, R_MIPS_UNUSED1 and R_MIPS_UNUSED2 539 // are used for internal JIT purpose. These relocations are similar to 540 // R_MIPS_HI16 and R_MIPS_LO16, but they do not take any addend into 541 // account. 542 *TargetPtr = ((*TargetPtr) & 0xffff0000) | 543 (((Value + 0x8000) >> 16) & 0xffff); 544 break; 545 case ELF::R_MIPS_UNUSED2: 546 *TargetPtr = ((*TargetPtr) & 0xffff0000) | (Value & 0xffff); 547 break; 548 } 549} 550 551// Return the .TOC. section address to R_PPC64_TOC relocations. 552uint64_t RuntimeDyldELF::findPPC64TOC() const { 553 // The TOC consists of sections .got, .toc, .tocbss, .plt in that 554 // order. The TOC starts where the first of these sections starts. 555 SectionList::const_iterator it = Sections.begin(); 556 SectionList::const_iterator ite = Sections.end(); 557 for (; it != ite; ++it) { 558 if (it->Name == ".got" || 559 it->Name == ".toc" || 560 it->Name == ".tocbss" || 561 it->Name == ".plt") 562 break; 563 } 564 if (it == ite) { 565 // This may happen for 566 // * references to TOC base base (sym@toc, .odp relocation) without 567 // a .toc directive. 568 // In this case just use the first section (which is usually 569 // the .odp) since the code won't reference the .toc base 570 // directly. 571 it = Sections.begin(); 572 } 573 assert (it != ite); 574 // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000 575 // thus permitting a full 64 Kbytes segment. 576 return it->LoadAddress + 0x8000; 577} 578 579// Returns the sections and offset associated with the ODP entry referenced 580// by Symbol. 581void RuntimeDyldELF::findOPDEntrySection(ObjectImage &Obj, 582 ObjSectionToIDMap &LocalSections, 583 RelocationValueRef &Rel) { 584 // Get the ELF symbol value (st_value) to compare with Relocation offset in 585 // .opd entries 586 587 error_code err; 588 for (section_iterator si = Obj.begin_sections(), 589 se = Obj.end_sections(); si != se; si.increment(err)) { 590 section_iterator RelSecI = si->getRelocatedSection(); 591 if (RelSecI == Obj.end_sections()) 592 continue; 593 594 StringRef RelSectionName; 595 check(RelSecI->getName(RelSectionName)); 596 if (RelSectionName != ".opd") 597 continue; 598 599 for (relocation_iterator i = si->begin_relocations(), 600 e = si->end_relocations(); i != e;) { 601 check(err); 602 603 // The R_PPC64_ADDR64 relocation indicates the first field 604 // of a .opd entry 605 uint64_t TypeFunc; 606 check(i->getType(TypeFunc)); 607 if (TypeFunc != ELF::R_PPC64_ADDR64) { 608 i.increment(err); 609 continue; 610 } 611 612 uint64_t TargetSymbolOffset; 613 symbol_iterator TargetSymbol = i->getSymbol(); 614 check(i->getOffset(TargetSymbolOffset)); 615 int64_t Addend; 616 check(getELFRelocationAddend(*i, Addend)); 617 618 i = i.increment(err); 619 if (i == e) 620 break; 621 check(err); 622 623 // Just check if following relocation is a R_PPC64_TOC 624 uint64_t TypeTOC; 625 check(i->getType(TypeTOC)); 626 if (TypeTOC != ELF::R_PPC64_TOC) 627 continue; 628 629 // Finally compares the Symbol value and the target symbol offset 630 // to check if this .opd entry refers to the symbol the relocation 631 // points to. 632 if (Rel.Addend != (int64_t)TargetSymbolOffset) 633 continue; 634 635 section_iterator tsi(Obj.end_sections()); 636 check(TargetSymbol->getSection(tsi)); 637 Rel.SectionID = findOrEmitSection(Obj, (*tsi), true, LocalSections); 638 Rel.Addend = (intptr_t)Addend; 639 return; 640 } 641 } 642 llvm_unreachable("Attempting to get address of ODP entry!"); 643} 644 645// Relocation masks following the #lo(value), #hi(value), #higher(value), 646// and #highest(value) macros defined in section 4.5.1. Relocation Types 647// in PPC-elf64abi document. 648// 649static inline 650uint16_t applyPPClo (uint64_t value) 651{ 652 return value & 0xffff; 653} 654 655static inline 656uint16_t applyPPChi (uint64_t value) 657{ 658 return (value >> 16) & 0xffff; 659} 660 661static inline 662uint16_t applyPPChigher (uint64_t value) 663{ 664 return (value >> 32) & 0xffff; 665} 666 667static inline 668uint16_t applyPPChighest (uint64_t value) 669{ 670 return (value >> 48) & 0xffff; 671} 672 673void RuntimeDyldELF::resolvePPC64Relocation(const SectionEntry &Section, 674 uint64_t Offset, 675 uint64_t Value, 676 uint32_t Type, 677 int64_t Addend) { 678 uint8_t* LocalAddress = Section.Address + Offset; 679 switch (Type) { 680 default: 681 llvm_unreachable("Relocation type not implemented yet!"); 682 break; 683 case ELF::R_PPC64_ADDR16_LO : 684 writeInt16BE(LocalAddress, applyPPClo (Value + Addend)); 685 break; 686 case ELF::R_PPC64_ADDR16_HI : 687 writeInt16BE(LocalAddress, applyPPChi (Value + Addend)); 688 break; 689 case ELF::R_PPC64_ADDR16_HIGHER : 690 writeInt16BE(LocalAddress, applyPPChigher (Value + Addend)); 691 break; 692 case ELF::R_PPC64_ADDR16_HIGHEST : 693 writeInt16BE(LocalAddress, applyPPChighest (Value + Addend)); 694 break; 695 case ELF::R_PPC64_ADDR14 : { 696 assert(((Value + Addend) & 3) == 0); 697 // Preserve the AA/LK bits in the branch instruction 698 uint8_t aalk = *(LocalAddress+3); 699 writeInt16BE(LocalAddress + 2, (aalk & 3) | ((Value + Addend) & 0xfffc)); 700 } break; 701 case ELF::R_PPC64_ADDR32 : { 702 int32_t Result = static_cast<int32_t>(Value + Addend); 703 if (SignExtend32<32>(Result) != Result) 704 llvm_unreachable("Relocation R_PPC64_ADDR32 overflow"); 705 writeInt32BE(LocalAddress, Result); 706 } break; 707 case ELF::R_PPC64_REL24 : { 708 uint64_t FinalAddress = (Section.LoadAddress + Offset); 709 int32_t delta = static_cast<int32_t>(Value - FinalAddress + Addend); 710 if (SignExtend32<24>(delta) != delta) 711 llvm_unreachable("Relocation R_PPC64_REL24 overflow"); 712 // Generates a 'bl <address>' instruction 713 writeInt32BE(LocalAddress, 0x48000001 | (delta & 0x03FFFFFC)); 714 } break; 715 case ELF::R_PPC64_REL32 : { 716 uint64_t FinalAddress = (Section.LoadAddress + Offset); 717 int32_t delta = static_cast<int32_t>(Value - FinalAddress + Addend); 718 if (SignExtend32<32>(delta) != delta) 719 llvm_unreachable("Relocation R_PPC64_REL32 overflow"); 720 writeInt32BE(LocalAddress, delta); 721 } break; 722 case ELF::R_PPC64_REL64: { 723 uint64_t FinalAddress = (Section.LoadAddress + Offset); 724 uint64_t Delta = Value - FinalAddress + Addend; 725 writeInt64BE(LocalAddress, Delta); 726 } break; 727 case ELF::R_PPC64_ADDR64 : 728 writeInt64BE(LocalAddress, Value + Addend); 729 break; 730 case ELF::R_PPC64_TOC : 731 writeInt64BE(LocalAddress, findPPC64TOC()); 732 break; 733 case ELF::R_PPC64_TOC16 : { 734 uint64_t TOCStart = findPPC64TOC(); 735 Value = applyPPClo((Value + Addend) - TOCStart); 736 writeInt16BE(LocalAddress, applyPPClo(Value)); 737 } break; 738 case ELF::R_PPC64_TOC16_DS : { 739 uint64_t TOCStart = findPPC64TOC(); 740 Value = ((Value + Addend) - TOCStart); 741 writeInt16BE(LocalAddress, applyPPClo(Value)); 742 } break; 743 } 744} 745 746void RuntimeDyldELF::resolveSystemZRelocation(const SectionEntry &Section, 747 uint64_t Offset, 748 uint64_t Value, 749 uint32_t Type, 750 int64_t Addend) { 751 uint8_t *LocalAddress = Section.Address + Offset; 752 switch (Type) { 753 default: 754 llvm_unreachable("Relocation type not implemented yet!"); 755 break; 756 case ELF::R_390_PC16DBL: 757 case ELF::R_390_PLT16DBL: { 758 int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset); 759 assert(int16_t(Delta / 2) * 2 == Delta && "R_390_PC16DBL overflow"); 760 writeInt16BE(LocalAddress, Delta / 2); 761 break; 762 } 763 case ELF::R_390_PC32DBL: 764 case ELF::R_390_PLT32DBL: { 765 int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset); 766 assert(int32_t(Delta / 2) * 2 == Delta && "R_390_PC32DBL overflow"); 767 writeInt32BE(LocalAddress, Delta / 2); 768 break; 769 } 770 case ELF::R_390_PC32: { 771 int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset); 772 assert(int32_t(Delta) == Delta && "R_390_PC32 overflow"); 773 writeInt32BE(LocalAddress, Delta); 774 break; 775 } 776 case ELF::R_390_64: 777 writeInt64BE(LocalAddress, Value + Addend); 778 break; 779 } 780} 781 782// The target location for the relocation is described by RE.SectionID and 783// RE.Offset. RE.SectionID can be used to find the SectionEntry. Each 784// SectionEntry has three members describing its location. 785// SectionEntry::Address is the address at which the section has been loaded 786// into memory in the current (host) process. SectionEntry::LoadAddress is the 787// address that the section will have in the target process. 788// SectionEntry::ObjAddress is the address of the bits for this section in the 789// original emitted object image (also in the current address space). 790// 791// Relocations will be applied as if the section were loaded at 792// SectionEntry::LoadAddress, but they will be applied at an address based 793// on SectionEntry::Address. SectionEntry::ObjAddress will be used to refer to 794// Target memory contents if they are required for value calculations. 795// 796// The Value parameter here is the load address of the symbol for the 797// relocation to be applied. For relocations which refer to symbols in the 798// current object Value will be the LoadAddress of the section in which 799// the symbol resides (RE.Addend provides additional information about the 800// symbol location). For external symbols, Value will be the address of the 801// symbol in the target address space. 802void RuntimeDyldELF::resolveRelocation(const RelocationEntry &RE, 803 uint64_t Value) { 804 const SectionEntry &Section = Sections[RE.SectionID]; 805 return resolveRelocation(Section, RE.Offset, Value, RE.RelType, RE.Addend, 806 RE.SymOffset); 807} 808 809void RuntimeDyldELF::resolveRelocation(const SectionEntry &Section, 810 uint64_t Offset, 811 uint64_t Value, 812 uint32_t Type, 813 int64_t Addend, 814 uint64_t SymOffset) { 815 switch (Arch) { 816 case Triple::x86_64: 817 resolveX86_64Relocation(Section, Offset, Value, Type, Addend, SymOffset); 818 break; 819 case Triple::x86: 820 resolveX86Relocation(Section, Offset, 821 (uint32_t)(Value & 0xffffffffL), Type, 822 (uint32_t)(Addend & 0xffffffffL)); 823 break; 824 case Triple::aarch64: 825 resolveAArch64Relocation(Section, Offset, Value, Type, Addend); 826 break; 827 case Triple::arm: // Fall through. 828 case Triple::thumb: 829 resolveARMRelocation(Section, Offset, 830 (uint32_t)(Value & 0xffffffffL), Type, 831 (uint32_t)(Addend & 0xffffffffL)); 832 break; 833 case Triple::mips: // Fall through. 834 case Triple::mipsel: 835 resolveMIPSRelocation(Section, Offset, 836 (uint32_t)(Value & 0xffffffffL), Type, 837 (uint32_t)(Addend & 0xffffffffL)); 838 break; 839 case Triple::ppc64: // Fall through. 840 case Triple::ppc64le: 841 resolvePPC64Relocation(Section, Offset, Value, Type, Addend); 842 break; 843 case Triple::systemz: 844 resolveSystemZRelocation(Section, Offset, Value, Type, Addend); 845 break; 846 default: llvm_unreachable("Unsupported CPU type!"); 847 } 848} 849 850void RuntimeDyldELF::processRelocationRef(unsigned SectionID, 851 RelocationRef RelI, 852 ObjectImage &Obj, 853 ObjSectionToIDMap &ObjSectionToID, 854 const SymbolTableMap &Symbols, 855 StubMap &Stubs) { 856 uint64_t RelType; 857 Check(RelI.getType(RelType)); 858 int64_t Addend; 859 Check(getELFRelocationAddend(RelI, Addend)); 860 symbol_iterator Symbol = RelI.getSymbol(); 861 862 // Obtain the symbol name which is referenced in the relocation 863 StringRef TargetName; 864 if (Symbol != Obj.end_symbols()) 865 Symbol->getName(TargetName); 866 DEBUG(dbgs() << "\t\tRelType: " << RelType 867 << " Addend: " << Addend 868 << " TargetName: " << TargetName 869 << "\n"); 870 RelocationValueRef Value; 871 // First search for the symbol in the local symbol table 872 SymbolTableMap::const_iterator lsi = Symbols.end(); 873 SymbolRef::Type SymType = SymbolRef::ST_Unknown; 874 if (Symbol != Obj.end_symbols()) { 875 lsi = Symbols.find(TargetName.data()); 876 Symbol->getType(SymType); 877 } 878 if (lsi != Symbols.end()) { 879 Value.SectionID = lsi->second.first; 880 Value.Offset = lsi->second.second; 881 Value.Addend = lsi->second.second + Addend; 882 } else { 883 // Search for the symbol in the global symbol table 884 SymbolTableMap::const_iterator gsi = GlobalSymbolTable.end(); 885 if (Symbol != Obj.end_symbols()) 886 gsi = GlobalSymbolTable.find(TargetName.data()); 887 if (gsi != GlobalSymbolTable.end()) { 888 Value.SectionID = gsi->second.first; 889 Value.Offset = gsi->second.second; 890 Value.Addend = gsi->second.second + Addend; 891 } else { 892 switch (SymType) { 893 case SymbolRef::ST_Debug: { 894 // TODO: Now ELF SymbolRef::ST_Debug = STT_SECTION, it's not obviously 895 // and can be changed by another developers. Maybe best way is add 896 // a new symbol type ST_Section to SymbolRef and use it. 897 section_iterator si(Obj.end_sections()); 898 Symbol->getSection(si); 899 if (si == Obj.end_sections()) 900 llvm_unreachable("Symbol section not found, bad object file format!"); 901 DEBUG(dbgs() << "\t\tThis is section symbol\n"); 902 // Default to 'true' in case isText fails (though it never does). 903 bool isCode = true; 904 si->isText(isCode); 905 Value.SectionID = findOrEmitSection(Obj, 906 (*si), 907 isCode, 908 ObjSectionToID); 909 Value.Addend = Addend; 910 break; 911 } 912 case SymbolRef::ST_Data: 913 case SymbolRef::ST_Unknown: { 914 Value.SymbolName = TargetName.data(); 915 Value.Addend = Addend; 916 917 // Absolute relocations will have a zero symbol ID (STN_UNDEF), which 918 // will manifest here as a NULL symbol name. 919 // We can set this as a valid (but empty) symbol name, and rely 920 // on addRelocationForSymbol to handle this. 921 if (!Value.SymbolName) 922 Value.SymbolName = ""; 923 break; 924 } 925 default: 926 llvm_unreachable("Unresolved symbol type!"); 927 break; 928 } 929 } 930 } 931 uint64_t Offset; 932 Check(RelI.getOffset(Offset)); 933 934 DEBUG(dbgs() << "\t\tSectionID: " << SectionID 935 << " Offset: " << Offset 936 << "\n"); 937 if (Arch == Triple::aarch64 && 938 (RelType == ELF::R_AARCH64_CALL26 || 939 RelType == ELF::R_AARCH64_JUMP26)) { 940 // This is an AArch64 branch relocation, need to use a stub function. 941 DEBUG(dbgs() << "\t\tThis is an AArch64 branch relocation."); 942 SectionEntry &Section = Sections[SectionID]; 943 944 // Look for an existing stub. 945 StubMap::const_iterator i = Stubs.find(Value); 946 if (i != Stubs.end()) { 947 resolveRelocation(Section, Offset, 948 (uint64_t)Section.Address + i->second, RelType, 0); 949 DEBUG(dbgs() << " Stub function found\n"); 950 } else { 951 // Create a new stub function. 952 DEBUG(dbgs() << " Create a new stub function\n"); 953 Stubs[Value] = Section.StubOffset; 954 uint8_t *StubTargetAddr = createStubFunction(Section.Address + 955 Section.StubOffset); 956 957 RelocationEntry REmovz_g3(SectionID, 958 StubTargetAddr - Section.Address, 959 ELF::R_AARCH64_MOVW_UABS_G3, Value.Addend); 960 RelocationEntry REmovk_g2(SectionID, 961 StubTargetAddr - Section.Address + 4, 962 ELF::R_AARCH64_MOVW_UABS_G2_NC, Value.Addend); 963 RelocationEntry REmovk_g1(SectionID, 964 StubTargetAddr - Section.Address + 8, 965 ELF::R_AARCH64_MOVW_UABS_G1_NC, Value.Addend); 966 RelocationEntry REmovk_g0(SectionID, 967 StubTargetAddr - Section.Address + 12, 968 ELF::R_AARCH64_MOVW_UABS_G0_NC, Value.Addend); 969 970 if (Value.SymbolName) { 971 addRelocationForSymbol(REmovz_g3, Value.SymbolName); 972 addRelocationForSymbol(REmovk_g2, Value.SymbolName); 973 addRelocationForSymbol(REmovk_g1, Value.SymbolName); 974 addRelocationForSymbol(REmovk_g0, Value.SymbolName); 975 } else { 976 addRelocationForSection(REmovz_g3, Value.SectionID); 977 addRelocationForSection(REmovk_g2, Value.SectionID); 978 addRelocationForSection(REmovk_g1, Value.SectionID); 979 addRelocationForSection(REmovk_g0, Value.SectionID); 980 } 981 resolveRelocation(Section, Offset, 982 (uint64_t)Section.Address + Section.StubOffset, 983 RelType, 0); 984 Section.StubOffset += getMaxStubSize(); 985 } 986 } else if (Arch == Triple::arm && 987 (RelType == ELF::R_ARM_PC24 || 988 RelType == ELF::R_ARM_CALL || 989 RelType == ELF::R_ARM_JUMP24)) { 990 // This is an ARM branch relocation, need to use a stub function. 991 DEBUG(dbgs() << "\t\tThis is an ARM branch relocation."); 992 SectionEntry &Section = Sections[SectionID]; 993 994 // Look for an existing stub. 995 StubMap::const_iterator i = Stubs.find(Value); 996 if (i != Stubs.end()) { 997 resolveRelocation(Section, Offset, 998 (uint64_t)Section.Address + i->second, RelType, 0); 999 DEBUG(dbgs() << " Stub function found\n"); 1000 } else { 1001 // Create a new stub function. 1002 DEBUG(dbgs() << " Create a new stub function\n"); 1003 Stubs[Value] = Section.StubOffset; 1004 uint8_t *StubTargetAddr = createStubFunction(Section.Address + 1005 Section.StubOffset); 1006 RelocationEntry RE(SectionID, StubTargetAddr - Section.Address, 1007 ELF::R_ARM_PRIVATE_0, Value.Addend); 1008 if (Value.SymbolName) 1009 addRelocationForSymbol(RE, Value.SymbolName); 1010 else 1011 addRelocationForSection(RE, Value.SectionID); 1012 1013 resolveRelocation(Section, Offset, 1014 (uint64_t)Section.Address + Section.StubOffset, 1015 RelType, 0); 1016 Section.StubOffset += getMaxStubSize(); 1017 } 1018 } else if ((Arch == Triple::mipsel || Arch == Triple::mips) && 1019 RelType == ELF::R_MIPS_26) { 1020 // This is an Mips branch relocation, need to use a stub function. 1021 DEBUG(dbgs() << "\t\tThis is a Mips branch relocation."); 1022 SectionEntry &Section = Sections[SectionID]; 1023 uint8_t *Target = Section.Address + Offset; 1024 uint32_t *TargetAddress = (uint32_t *)Target; 1025 1026 // Extract the addend from the instruction. 1027 uint32_t Addend = ((*TargetAddress) & 0x03ffffff) << 2; 1028 1029 Value.Addend += Addend; 1030 1031 // Look up for existing stub. 1032 StubMap::const_iterator i = Stubs.find(Value); 1033 if (i != Stubs.end()) { 1034 RelocationEntry RE(SectionID, Offset, RelType, i->second); 1035 addRelocationForSection(RE, SectionID); 1036 DEBUG(dbgs() << " Stub function found\n"); 1037 } else { 1038 // Create a new stub function. 1039 DEBUG(dbgs() << " Create a new stub function\n"); 1040 Stubs[Value] = Section.StubOffset; 1041 uint8_t *StubTargetAddr = createStubFunction(Section.Address + 1042 Section.StubOffset); 1043 1044 // Creating Hi and Lo relocations for the filled stub instructions. 1045 RelocationEntry REHi(SectionID, 1046 StubTargetAddr - Section.Address, 1047 ELF::R_MIPS_UNUSED1, Value.Addend); 1048 RelocationEntry RELo(SectionID, 1049 StubTargetAddr - Section.Address + 4, 1050 ELF::R_MIPS_UNUSED2, Value.Addend); 1051 1052 if (Value.SymbolName) { 1053 addRelocationForSymbol(REHi, Value.SymbolName); 1054 addRelocationForSymbol(RELo, Value.SymbolName); 1055 } else { 1056 addRelocationForSection(REHi, Value.SectionID); 1057 addRelocationForSection(RELo, Value.SectionID); 1058 } 1059 1060 RelocationEntry RE(SectionID, Offset, RelType, Section.StubOffset); 1061 addRelocationForSection(RE, SectionID); 1062 Section.StubOffset += getMaxStubSize(); 1063 } 1064 } else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le) { 1065 if (RelType == ELF::R_PPC64_REL24) { 1066 // A PPC branch relocation will need a stub function if the target is 1067 // an external symbol (Symbol::ST_Unknown) or if the target address 1068 // is not within the signed 24-bits branch address. 1069 SectionEntry &Section = Sections[SectionID]; 1070 uint8_t *Target = Section.Address + Offset; 1071 bool RangeOverflow = false; 1072 if (SymType != SymbolRef::ST_Unknown) { 1073 // A function call may points to the .opd entry, so the final symbol value 1074 // in calculated based in the relocation values in .opd section. 1075 findOPDEntrySection(Obj, ObjSectionToID, Value); 1076 uint8_t *RelocTarget = Sections[Value.SectionID].Address + Value.Addend; 1077 int32_t delta = static_cast<int32_t>(Target - RelocTarget); 1078 // If it is within 24-bits branch range, just set the branch target 1079 if (SignExtend32<24>(delta) == delta) { 1080 RelocationEntry RE(SectionID, Offset, RelType, Value.Addend); 1081 if (Value.SymbolName) 1082 addRelocationForSymbol(RE, Value.SymbolName); 1083 else 1084 addRelocationForSection(RE, Value.SectionID); 1085 } else { 1086 RangeOverflow = true; 1087 } 1088 } 1089 if (SymType == SymbolRef::ST_Unknown || RangeOverflow == true) { 1090 // It is an external symbol (SymbolRef::ST_Unknown) or within a range 1091 // larger than 24-bits. 1092 StubMap::const_iterator i = Stubs.find(Value); 1093 if (i != Stubs.end()) { 1094 // Symbol function stub already created, just relocate to it 1095 resolveRelocation(Section, Offset, 1096 (uint64_t)Section.Address + i->second, RelType, 0); 1097 DEBUG(dbgs() << " Stub function found\n"); 1098 } else { 1099 // Create a new stub function. 1100 DEBUG(dbgs() << " Create a new stub function\n"); 1101 Stubs[Value] = Section.StubOffset; 1102 uint8_t *StubTargetAddr = createStubFunction(Section.Address + 1103 Section.StubOffset); 1104 RelocationEntry RE(SectionID, StubTargetAddr - Section.Address, 1105 ELF::R_PPC64_ADDR64, Value.Addend); 1106 1107 // Generates the 64-bits address loads as exemplified in section 1108 // 4.5.1 in PPC64 ELF ABI. 1109 RelocationEntry REhst(SectionID, 1110 StubTargetAddr - Section.Address + 2, 1111 ELF::R_PPC64_ADDR16_HIGHEST, Value.Addend); 1112 RelocationEntry REhr(SectionID, 1113 StubTargetAddr - Section.Address + 6, 1114 ELF::R_PPC64_ADDR16_HIGHER, Value.Addend); 1115 RelocationEntry REh(SectionID, 1116 StubTargetAddr - Section.Address + 14, 1117 ELF::R_PPC64_ADDR16_HI, Value.Addend); 1118 RelocationEntry REl(SectionID, 1119 StubTargetAddr - Section.Address + 18, 1120 ELF::R_PPC64_ADDR16_LO, Value.Addend); 1121 1122 if (Value.SymbolName) { 1123 addRelocationForSymbol(REhst, Value.SymbolName); 1124 addRelocationForSymbol(REhr, Value.SymbolName); 1125 addRelocationForSymbol(REh, Value.SymbolName); 1126 addRelocationForSymbol(REl, Value.SymbolName); 1127 } else { 1128 addRelocationForSection(REhst, Value.SectionID); 1129 addRelocationForSection(REhr, Value.SectionID); 1130 addRelocationForSection(REh, Value.SectionID); 1131 addRelocationForSection(REl, Value.SectionID); 1132 } 1133 1134 resolveRelocation(Section, Offset, 1135 (uint64_t)Section.Address + Section.StubOffset, 1136 RelType, 0); 1137 if (SymType == SymbolRef::ST_Unknown) 1138 // Restore the TOC for external calls 1139 writeInt32BE(Target+4, 0xE8410028); // ld r2,40(r1) 1140 Section.StubOffset += getMaxStubSize(); 1141 } 1142 } 1143 } else { 1144 RelocationEntry RE(SectionID, Offset, RelType, Value.Addend); 1145 // Extra check to avoid relocation againt empty symbols (usually 1146 // the R_PPC64_TOC). 1147 if (SymType != SymbolRef::ST_Unknown && TargetName.empty()) 1148 Value.SymbolName = NULL; 1149 1150 if (Value.SymbolName) 1151 addRelocationForSymbol(RE, Value.SymbolName); 1152 else 1153 addRelocationForSection(RE, Value.SectionID); 1154 } 1155 } else if (Arch == Triple::systemz && 1156 (RelType == ELF::R_390_PLT32DBL || 1157 RelType == ELF::R_390_GOTENT)) { 1158 // Create function stubs for both PLT and GOT references, regardless of 1159 // whether the GOT reference is to data or code. The stub contains the 1160 // full address of the symbol, as needed by GOT references, and the 1161 // executable part only adds an overhead of 8 bytes. 1162 // 1163 // We could try to conserve space by allocating the code and data 1164 // parts of the stub separately. However, as things stand, we allocate 1165 // a stub for every relocation, so using a GOT in JIT code should be 1166 // no less space efficient than using an explicit constant pool. 1167 DEBUG(dbgs() << "\t\tThis is a SystemZ indirect relocation."); 1168 SectionEntry &Section = Sections[SectionID]; 1169 1170 // Look for an existing stub. 1171 StubMap::const_iterator i = Stubs.find(Value); 1172 uintptr_t StubAddress; 1173 if (i != Stubs.end()) { 1174 StubAddress = uintptr_t(Section.Address) + i->second; 1175 DEBUG(dbgs() << " Stub function found\n"); 1176 } else { 1177 // Create a new stub function. 1178 DEBUG(dbgs() << " Create a new stub function\n"); 1179 1180 uintptr_t BaseAddress = uintptr_t(Section.Address); 1181 uintptr_t StubAlignment = getStubAlignment(); 1182 StubAddress = (BaseAddress + Section.StubOffset + 1183 StubAlignment - 1) & -StubAlignment; 1184 unsigned StubOffset = StubAddress - BaseAddress; 1185 1186 Stubs[Value] = StubOffset; 1187 createStubFunction((uint8_t *)StubAddress); 1188 RelocationEntry RE(SectionID, StubOffset + 8, 1189 ELF::R_390_64, Value.Addend - Addend); 1190 if (Value.SymbolName) 1191 addRelocationForSymbol(RE, Value.SymbolName); 1192 else 1193 addRelocationForSection(RE, Value.SectionID); 1194 Section.StubOffset = StubOffset + getMaxStubSize(); 1195 } 1196 1197 if (RelType == ELF::R_390_GOTENT) 1198 resolveRelocation(Section, Offset, StubAddress + 8, 1199 ELF::R_390_PC32DBL, Addend); 1200 else 1201 resolveRelocation(Section, Offset, StubAddress, RelType, Addend); 1202 } else if (Arch == Triple::x86_64 && RelType == ELF::R_X86_64_PLT32) { 1203 // The way the PLT relocations normally work is that the linker allocates the 1204 // PLT and this relocation makes a PC-relative call into the PLT. The PLT 1205 // entry will then jump to an address provided by the GOT. On first call, the 1206 // GOT address will point back into PLT code that resolves the symbol. After 1207 // the first call, the GOT entry points to the actual function. 1208 // 1209 // For local functions we're ignoring all of that here and just replacing 1210 // the PLT32 relocation type with PC32, which will translate the relocation 1211 // into a PC-relative call directly to the function. For external symbols we 1212 // can't be sure the function will be within 2^32 bytes of the call site, so 1213 // we need to create a stub, which calls into the GOT. This case is 1214 // equivalent to the usual PLT implementation except that we use the stub 1215 // mechanism in RuntimeDyld (which puts stubs at the end of the section) 1216 // rather than allocating a PLT section. 1217 if (Value.SymbolName) { 1218 // This is a call to an external function. 1219 // Look for an existing stub. 1220 SectionEntry &Section = Sections[SectionID]; 1221 StubMap::const_iterator i = Stubs.find(Value); 1222 uintptr_t StubAddress; 1223 if (i != Stubs.end()) { 1224 StubAddress = uintptr_t(Section.Address) + i->second; 1225 DEBUG(dbgs() << " Stub function found\n"); 1226 } else { 1227 // Create a new stub function (equivalent to a PLT entry). 1228 DEBUG(dbgs() << " Create a new stub function\n"); 1229 1230 uintptr_t BaseAddress = uintptr_t(Section.Address); 1231 uintptr_t StubAlignment = getStubAlignment(); 1232 StubAddress = (BaseAddress + Section.StubOffset + 1233 StubAlignment - 1) & -StubAlignment; 1234 unsigned StubOffset = StubAddress - BaseAddress; 1235 Stubs[Value] = StubOffset; 1236 createStubFunction((uint8_t *)StubAddress); 1237 1238 // Create a GOT entry for the external function. 1239 GOTEntries.push_back(Value); 1240 1241 // Make our stub function a relative call to the GOT entry. 1242 RelocationEntry RE(SectionID, StubOffset + 2, 1243 ELF::R_X86_64_GOTPCREL, -4); 1244 addRelocationForSymbol(RE, Value.SymbolName); 1245 1246 // Bump our stub offset counter 1247 Section.StubOffset = StubOffset + getMaxStubSize(); 1248 } 1249 1250 // Make the target call a call into the stub table. 1251 resolveRelocation(Section, Offset, StubAddress, 1252 ELF::R_X86_64_PC32, Addend); 1253 } else { 1254 RelocationEntry RE(SectionID, Offset, ELF::R_X86_64_PC32, Value.Addend, 1255 Value.Offset); 1256 addRelocationForSection(RE, Value.SectionID); 1257 } 1258 } else { 1259 if (Arch == Triple::x86_64 && RelType == ELF::R_X86_64_GOTPCREL) { 1260 GOTEntries.push_back(Value); 1261 } 1262 RelocationEntry RE(SectionID, Offset, RelType, Value.Addend, Value.Offset); 1263 if (Value.SymbolName) 1264 addRelocationForSymbol(RE, Value.SymbolName); 1265 else 1266 addRelocationForSection(RE, Value.SectionID); 1267 } 1268} 1269 1270void RuntimeDyldELF::updateGOTEntries(StringRef Name, uint64_t Addr) { 1271 1272 SmallVectorImpl<std::pair<SID, GOTRelocations> >::iterator it; 1273 SmallVectorImpl<std::pair<SID, GOTRelocations> >::iterator end = GOTs.end(); 1274 1275 for (it = GOTs.begin(); it != end; ++it) { 1276 GOTRelocations &GOTEntries = it->second; 1277 for (int i = 0, e = GOTEntries.size(); i != e; ++i) { 1278 if (GOTEntries[i].SymbolName != 0 && GOTEntries[i].SymbolName == Name) { 1279 GOTEntries[i].Offset = Addr; 1280 } 1281 } 1282 } 1283} 1284 1285size_t RuntimeDyldELF::getGOTEntrySize() { 1286 // We don't use the GOT in all of these cases, but it's essentially free 1287 // to put them all here. 1288 size_t Result = 0; 1289 switch (Arch) { 1290 case Triple::x86_64: 1291 case Triple::aarch64: 1292 case Triple::ppc64: 1293 case Triple::ppc64le: 1294 case Triple::systemz: 1295 Result = sizeof(uint64_t); 1296 break; 1297 case Triple::x86: 1298 case Triple::arm: 1299 case Triple::thumb: 1300 case Triple::mips: 1301 case Triple::mipsel: 1302 Result = sizeof(uint32_t); 1303 break; 1304 default: llvm_unreachable("Unsupported CPU type!"); 1305 } 1306 return Result; 1307} 1308 1309uint64_t RuntimeDyldELF::findGOTEntry(uint64_t LoadAddress, 1310 uint64_t Offset) { 1311 1312 const size_t GOTEntrySize = getGOTEntrySize(); 1313 1314 SmallVectorImpl<std::pair<SID, GOTRelocations> >::const_iterator it; 1315 SmallVectorImpl<std::pair<SID, GOTRelocations> >::const_iterator end = GOTs.end(); 1316 1317 int GOTIndex = -1; 1318 for (it = GOTs.begin(); it != end; ++it) { 1319 SID GOTSectionID = it->first; 1320 const GOTRelocations &GOTEntries = it->second; 1321 1322 // Find the matching entry in our vector. 1323 uint64_t SymbolOffset = 0; 1324 for (int i = 0, e = GOTEntries.size(); i != e; ++i) { 1325 if (GOTEntries[i].SymbolName == 0) { 1326 if (getSectionLoadAddress(GOTEntries[i].SectionID) == LoadAddress && 1327 GOTEntries[i].Offset == Offset) { 1328 GOTIndex = i; 1329 SymbolOffset = GOTEntries[i].Offset; 1330 break; 1331 } 1332 } else { 1333 // GOT entries for external symbols use the addend as the address when 1334 // the external symbol has been resolved. 1335 if (GOTEntries[i].Offset == LoadAddress) { 1336 GOTIndex = i; 1337 // Don't use the Addend here. The relocation handler will use it. 1338 break; 1339 } 1340 } 1341 } 1342 1343 if (GOTIndex != -1) { 1344 if (GOTEntrySize == sizeof(uint64_t)) { 1345 uint64_t *LocalGOTAddr = (uint64_t*)getSectionAddress(GOTSectionID); 1346 // Fill in this entry with the address of the symbol being referenced. 1347 LocalGOTAddr[GOTIndex] = LoadAddress + SymbolOffset; 1348 } else { 1349 uint32_t *LocalGOTAddr = (uint32_t*)getSectionAddress(GOTSectionID); 1350 // Fill in this entry with the address of the symbol being referenced. 1351 LocalGOTAddr[GOTIndex] = (uint32_t)(LoadAddress + SymbolOffset); 1352 } 1353 1354 // Calculate the load address of this entry 1355 return getSectionLoadAddress(GOTSectionID) + (GOTIndex * GOTEntrySize); 1356 } 1357 } 1358 1359 assert(GOTIndex != -1 && "Unable to find requested GOT entry."); 1360 return 0; 1361} 1362 1363void RuntimeDyldELF::finalizeLoad(ObjSectionToIDMap &SectionMap) { 1364 // If necessary, allocate the global offset table 1365 if (MemMgr) { 1366 // Allocate the GOT if necessary 1367 size_t numGOTEntries = GOTEntries.size(); 1368 if (numGOTEntries != 0) { 1369 // Allocate memory for the section 1370 unsigned SectionID = Sections.size(); 1371 size_t TotalSize = numGOTEntries * getGOTEntrySize(); 1372 uint8_t *Addr = MemMgr->allocateDataSection(TotalSize, getGOTEntrySize(), 1373 SectionID, ".got", false); 1374 if (!Addr) 1375 report_fatal_error("Unable to allocate memory for GOT!"); 1376 1377 GOTs.push_back(std::make_pair(SectionID, GOTEntries)); 1378 Sections.push_back(SectionEntry(".got", Addr, TotalSize, 0)); 1379 // For now, initialize all GOT entries to zero. We'll fill them in as 1380 // needed when GOT-based relocations are applied. 1381 memset(Addr, 0, TotalSize); 1382 } 1383 } 1384 else { 1385 report_fatal_error("Unable to allocate memory for GOT!"); 1386 } 1387 1388 // Look for and record the EH frame section. 1389 ObjSectionToIDMap::iterator i, e; 1390 for (i = SectionMap.begin(), e = SectionMap.end(); i != e; ++i) { 1391 const SectionRef &Section = i->first; 1392 StringRef Name; 1393 Section.getName(Name); 1394 if (Name == ".eh_frame") { 1395 UnregisteredEHFrameSections.push_back(i->second); 1396 break; 1397 } 1398 } 1399} 1400 1401bool RuntimeDyldELF::isCompatibleFormat(const ObjectBuffer *Buffer) const { 1402 if (Buffer->getBufferSize() < strlen(ELF::ElfMagic)) 1403 return false; 1404 return (memcmp(Buffer->getBufferStart(), ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0; 1405} 1406} // namespace llvm 1407