1 //===- lib/MC/MachObjectWriter.cpp - Mach-O File Writer -------------------===// 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 #include "llvm/MC/MachObjectWriter.h" 11 #include "llvm/ADT/StringMap.h" 12 #include "llvm/ADT/Twine.h" 13 #include "llvm/MC/MCAssembler.h" 14 #include "llvm/MC/MCAsmLayout.h" 15 #include "llvm/MC/MCExpr.h" 16 #include "llvm/MC/MCObjectWriter.h" 17 #include "llvm/MC/MCSectionMachO.h" 18 #include "llvm/MC/MCSymbol.h" 19 #include "llvm/MC/MCMachOSymbolFlags.h" 20 #include "llvm/MC/MCValue.h" 21 #include "llvm/Support/ErrorHandling.h" 22 #include "llvm/Support/MachO.h" 23 #include "llvm/Target/TargetAsmBackend.h" 24 25 // FIXME: Gross. 26 #include "../Target/X86/X86FixupKinds.h" 27 28 #include <vector> 29 using namespace llvm; 30 31 static unsigned getFixupKindLog2Size(unsigned Kind) { 32 switch (Kind) { 33 default: llvm_unreachable("invalid fixup kind!"); 34 case X86::reloc_pcrel_1byte: 35 case FK_Data_1: return 0; 36 case FK_Data_2: return 1; 37 case X86::reloc_pcrel_4byte: 38 case X86::reloc_riprel_4byte: 39 case X86::reloc_riprel_4byte_movq_load: 40 case FK_Data_4: return 2; 41 case FK_Data_8: return 3; 42 } 43 } 44 45 static bool isFixupKindPCRel(unsigned Kind) { 46 switch (Kind) { 47 default: 48 return false; 49 case X86::reloc_pcrel_1byte: 50 case X86::reloc_pcrel_4byte: 51 case X86::reloc_riprel_4byte: 52 case X86::reloc_riprel_4byte_movq_load: 53 return true; 54 } 55 } 56 57 static bool isFixupKindRIPRel(unsigned Kind) { 58 return Kind == X86::reloc_riprel_4byte || 59 Kind == X86::reloc_riprel_4byte_movq_load; 60 } 61 62 static bool doesSymbolRequireExternRelocation(MCSymbolData *SD) { 63 // Undefined symbols are always extern. 64 if (SD->Symbol->isUndefined()) 65 return true; 66 67 // References to weak definitions require external relocation entries; the 68 // definition may not always be the one in the same object file. 69 if (SD->getFlags() & SF_WeakDefinition) 70 return true; 71 72 // Otherwise, we can use an internal relocation. 73 return false; 74 } 75 76 namespace { 77 78 class MachObjectWriterImpl { 79 // See <mach-o/loader.h>. 80 enum { 81 Header_Magic32 = 0xFEEDFACE, 82 Header_Magic64 = 0xFEEDFACF 83 }; 84 85 enum { 86 Header32Size = 28, 87 Header64Size = 32, 88 SegmentLoadCommand32Size = 56, 89 SegmentLoadCommand64Size = 72, 90 Section32Size = 68, 91 Section64Size = 80, 92 SymtabLoadCommandSize = 24, 93 DysymtabLoadCommandSize = 80, 94 Nlist32Size = 12, 95 Nlist64Size = 16, 96 RelocationInfoSize = 8 97 }; 98 99 enum HeaderFileType { 100 HFT_Object = 0x1 101 }; 102 103 enum HeaderFlags { 104 HF_SubsectionsViaSymbols = 0x2000 105 }; 106 107 enum LoadCommandType { 108 LCT_Segment = 0x1, 109 LCT_Symtab = 0x2, 110 LCT_Dysymtab = 0xb, 111 LCT_Segment64 = 0x19 112 }; 113 114 // See <mach-o/nlist.h>. 115 enum SymbolTypeType { 116 STT_Undefined = 0x00, 117 STT_Absolute = 0x02, 118 STT_Section = 0x0e 119 }; 120 121 enum SymbolTypeFlags { 122 // If any of these bits are set, then the entry is a stab entry number (see 123 // <mach-o/stab.h>. Otherwise the other masks apply. 124 STF_StabsEntryMask = 0xe0, 125 126 STF_TypeMask = 0x0e, 127 STF_External = 0x01, 128 STF_PrivateExtern = 0x10 129 }; 130 131 /// IndirectSymbolFlags - Flags for encoding special values in the indirect 132 /// symbol entry. 133 enum IndirectSymbolFlags { 134 ISF_Local = 0x80000000, 135 ISF_Absolute = 0x40000000 136 }; 137 138 /// RelocationFlags - Special flags for addresses. 139 enum RelocationFlags { 140 RF_Scattered = 0x80000000 141 }; 142 143 enum RelocationInfoType { 144 RIT_Vanilla = 0, 145 RIT_Pair = 1, 146 RIT_Difference = 2, 147 RIT_PreboundLazyPointer = 3, 148 RIT_LocalDifference = 4, 149 RIT_TLV = 5 150 }; 151 152 /// X86_64 uses its own relocation types. 153 enum RelocationInfoTypeX86_64 { 154 RIT_X86_64_Unsigned = 0, 155 RIT_X86_64_Signed = 1, 156 RIT_X86_64_Branch = 2, 157 RIT_X86_64_GOTLoad = 3, 158 RIT_X86_64_GOT = 4, 159 RIT_X86_64_Subtractor = 5, 160 RIT_X86_64_Signed1 = 6, 161 RIT_X86_64_Signed2 = 7, 162 RIT_X86_64_Signed4 = 8, 163 RIT_X86_64_TLV = 9 164 }; 165 166 /// MachSymbolData - Helper struct for containing some precomputed information 167 /// on symbols. 168 struct MachSymbolData { 169 MCSymbolData *SymbolData; 170 uint64_t StringIndex; 171 uint8_t SectionIndex; 172 173 // Support lexicographic sorting. 174 bool operator<(const MachSymbolData &RHS) const { 175 return SymbolData->getSymbol().getName() < 176 RHS.SymbolData->getSymbol().getName(); 177 } 178 }; 179 180 /// @name Relocation Data 181 /// @{ 182 183 struct MachRelocationEntry { 184 uint32_t Word0; 185 uint32_t Word1; 186 }; 187 188 llvm::DenseMap<const MCSectionData*, 189 std::vector<MachRelocationEntry> > Relocations; 190 llvm::DenseMap<const MCSectionData*, unsigned> IndirectSymBase; 191 192 /// @} 193 /// @name Symbol Table Data 194 /// @{ 195 196 SmallString<256> StringTable; 197 std::vector<MachSymbolData> LocalSymbolData; 198 std::vector<MachSymbolData> ExternalSymbolData; 199 std::vector<MachSymbolData> UndefinedSymbolData; 200 201 /// @} 202 203 MachObjectWriter *Writer; 204 205 raw_ostream &OS; 206 207 unsigned Is64Bit : 1; 208 209 public: 210 MachObjectWriterImpl(MachObjectWriter *_Writer, bool _Is64Bit) 211 : Writer(_Writer), OS(Writer->getStream()), Is64Bit(_Is64Bit) { 212 } 213 214 void Write8(uint8_t Value) { Writer->Write8(Value); } 215 void Write16(uint16_t Value) { Writer->Write16(Value); } 216 void Write32(uint32_t Value) { Writer->Write32(Value); } 217 void Write64(uint64_t Value) { Writer->Write64(Value); } 218 void WriteZeros(unsigned N) { Writer->WriteZeros(N); } 219 void WriteBytes(StringRef Str, unsigned ZeroFillSize = 0) { 220 Writer->WriteBytes(Str, ZeroFillSize); 221 } 222 223 void WriteHeader(unsigned NumLoadCommands, unsigned LoadCommandsSize, 224 bool SubsectionsViaSymbols) { 225 uint32_t Flags = 0; 226 227 if (SubsectionsViaSymbols) 228 Flags |= HF_SubsectionsViaSymbols; 229 230 // struct mach_header (28 bytes) or 231 // struct mach_header_64 (32 bytes) 232 233 uint64_t Start = OS.tell(); 234 (void) Start; 235 236 Write32(Is64Bit ? Header_Magic64 : Header_Magic32); 237 238 // FIXME: Support cputype. 239 Write32(Is64Bit ? MachO::CPUTypeX86_64 : MachO::CPUTypeI386); 240 // FIXME: Support cpusubtype. 241 Write32(MachO::CPUSubType_I386_ALL); 242 Write32(HFT_Object); 243 Write32(NumLoadCommands); // Object files have a single load command, the 244 // segment. 245 Write32(LoadCommandsSize); 246 Write32(Flags); 247 if (Is64Bit) 248 Write32(0); // reserved 249 250 assert(OS.tell() - Start == Is64Bit ? Header64Size : Header32Size); 251 } 252 253 /// WriteSegmentLoadCommand - Write a segment load command. 254 /// 255 /// \arg NumSections - The number of sections in this segment. 256 /// \arg SectionDataSize - The total size of the sections. 257 void WriteSegmentLoadCommand(unsigned NumSections, 258 uint64_t VMSize, 259 uint64_t SectionDataStartOffset, 260 uint64_t SectionDataSize) { 261 // struct segment_command (56 bytes) or 262 // struct segment_command_64 (72 bytes) 263 264 uint64_t Start = OS.tell(); 265 (void) Start; 266 267 unsigned SegmentLoadCommandSize = Is64Bit ? SegmentLoadCommand64Size : 268 SegmentLoadCommand32Size; 269 Write32(Is64Bit ? LCT_Segment64 : LCT_Segment); 270 Write32(SegmentLoadCommandSize + 271 NumSections * (Is64Bit ? Section64Size : Section32Size)); 272 273 WriteBytes("", 16); 274 if (Is64Bit) { 275 Write64(0); // vmaddr 276 Write64(VMSize); // vmsize 277 Write64(SectionDataStartOffset); // file offset 278 Write64(SectionDataSize); // file size 279 } else { 280 Write32(0); // vmaddr 281 Write32(VMSize); // vmsize 282 Write32(SectionDataStartOffset); // file offset 283 Write32(SectionDataSize); // file size 284 } 285 Write32(0x7); // maxprot 286 Write32(0x7); // initprot 287 Write32(NumSections); 288 Write32(0); // flags 289 290 assert(OS.tell() - Start == SegmentLoadCommandSize); 291 } 292 293 void WriteSection(const MCAssembler &Asm, const MCAsmLayout &Layout, 294 const MCSectionData &SD, uint64_t FileOffset, 295 uint64_t RelocationsStart, unsigned NumRelocations) { 296 uint64_t SectionSize = Layout.getSectionSize(&SD); 297 298 // The offset is unused for virtual sections. 299 if (Asm.getBackend().isVirtualSection(SD.getSection())) { 300 assert(Layout.getSectionFileSize(&SD) == 0 && "Invalid file size!"); 301 FileOffset = 0; 302 } 303 304 // struct section (68 bytes) or 305 // struct section_64 (80 bytes) 306 307 uint64_t Start = OS.tell(); 308 (void) Start; 309 310 const MCSectionMachO &Section = cast<MCSectionMachO>(SD.getSection()); 311 WriteBytes(Section.getSectionName(), 16); 312 WriteBytes(Section.getSegmentName(), 16); 313 if (Is64Bit) { 314 Write64(Layout.getSectionAddress(&SD)); // address 315 Write64(SectionSize); // size 316 } else { 317 Write32(Layout.getSectionAddress(&SD)); // address 318 Write32(SectionSize); // size 319 } 320 Write32(FileOffset); 321 322 unsigned Flags = Section.getTypeAndAttributes(); 323 if (SD.hasInstructions()) 324 Flags |= MCSectionMachO::S_ATTR_SOME_INSTRUCTIONS; 325 326 assert(isPowerOf2_32(SD.getAlignment()) && "Invalid alignment!"); 327 Write32(Log2_32(SD.getAlignment())); 328 Write32(NumRelocations ? RelocationsStart : 0); 329 Write32(NumRelocations); 330 Write32(Flags); 331 Write32(IndirectSymBase.lookup(&SD)); // reserved1 332 Write32(Section.getStubSize()); // reserved2 333 if (Is64Bit) 334 Write32(0); // reserved3 335 336 assert(OS.tell() - Start == Is64Bit ? Section64Size : Section32Size); 337 } 338 339 void WriteSymtabLoadCommand(uint32_t SymbolOffset, uint32_t NumSymbols, 340 uint32_t StringTableOffset, 341 uint32_t StringTableSize) { 342 // struct symtab_command (24 bytes) 343 344 uint64_t Start = OS.tell(); 345 (void) Start; 346 347 Write32(LCT_Symtab); 348 Write32(SymtabLoadCommandSize); 349 Write32(SymbolOffset); 350 Write32(NumSymbols); 351 Write32(StringTableOffset); 352 Write32(StringTableSize); 353 354 assert(OS.tell() - Start == SymtabLoadCommandSize); 355 } 356 357 void WriteDysymtabLoadCommand(uint32_t FirstLocalSymbol, 358 uint32_t NumLocalSymbols, 359 uint32_t FirstExternalSymbol, 360 uint32_t NumExternalSymbols, 361 uint32_t FirstUndefinedSymbol, 362 uint32_t NumUndefinedSymbols, 363 uint32_t IndirectSymbolOffset, 364 uint32_t NumIndirectSymbols) { 365 // struct dysymtab_command (80 bytes) 366 367 uint64_t Start = OS.tell(); 368 (void) Start; 369 370 Write32(LCT_Dysymtab); 371 Write32(DysymtabLoadCommandSize); 372 Write32(FirstLocalSymbol); 373 Write32(NumLocalSymbols); 374 Write32(FirstExternalSymbol); 375 Write32(NumExternalSymbols); 376 Write32(FirstUndefinedSymbol); 377 Write32(NumUndefinedSymbols); 378 Write32(0); // tocoff 379 Write32(0); // ntoc 380 Write32(0); // modtaboff 381 Write32(0); // nmodtab 382 Write32(0); // extrefsymoff 383 Write32(0); // nextrefsyms 384 Write32(IndirectSymbolOffset); 385 Write32(NumIndirectSymbols); 386 Write32(0); // extreloff 387 Write32(0); // nextrel 388 Write32(0); // locreloff 389 Write32(0); // nlocrel 390 391 assert(OS.tell() - Start == DysymtabLoadCommandSize); 392 } 393 394 void WriteNlist(MachSymbolData &MSD, const MCAsmLayout &Layout) { 395 MCSymbolData &Data = *MSD.SymbolData; 396 const MCSymbol &Symbol = Data.getSymbol(); 397 uint8_t Type = 0; 398 uint16_t Flags = Data.getFlags(); 399 uint32_t Address = 0; 400 401 // Set the N_TYPE bits. See <mach-o/nlist.h>. 402 // 403 // FIXME: Are the prebound or indirect fields possible here? 404 if (Symbol.isUndefined()) 405 Type = STT_Undefined; 406 else if (Symbol.isAbsolute()) 407 Type = STT_Absolute; 408 else 409 Type = STT_Section; 410 411 // FIXME: Set STAB bits. 412 413 if (Data.isPrivateExtern()) 414 Type |= STF_PrivateExtern; 415 416 // Set external bit. 417 if (Data.isExternal() || Symbol.isUndefined()) 418 Type |= STF_External; 419 420 // Compute the symbol address. 421 if (Symbol.isDefined()) { 422 if (Symbol.isAbsolute()) { 423 Address = cast<MCConstantExpr>(Symbol.getVariableValue())->getValue(); 424 } else { 425 Address = Layout.getSymbolAddress(&Data); 426 } 427 } else if (Data.isCommon()) { 428 // Common symbols are encoded with the size in the address 429 // field, and their alignment in the flags. 430 Address = Data.getCommonSize(); 431 432 // Common alignment is packed into the 'desc' bits. 433 if (unsigned Align = Data.getCommonAlignment()) { 434 unsigned Log2Size = Log2_32(Align); 435 assert((1U << Log2Size) == Align && "Invalid 'common' alignment!"); 436 if (Log2Size > 15) 437 report_fatal_error("invalid 'common' alignment '" + 438 Twine(Align) + "'"); 439 // FIXME: Keep this mask with the SymbolFlags enumeration. 440 Flags = (Flags & 0xF0FF) | (Log2Size << 8); 441 } 442 } 443 444 // struct nlist (12 bytes) 445 446 Write32(MSD.StringIndex); 447 Write8(Type); 448 Write8(MSD.SectionIndex); 449 450 // The Mach-O streamer uses the lowest 16-bits of the flags for the 'desc' 451 // value. 452 Write16(Flags); 453 if (Is64Bit) 454 Write64(Address); 455 else 456 Write32(Address); 457 } 458 459 // FIXME: We really need to improve the relocation validation. Basically, we 460 // want to implement a separate computation which evaluates the relocation 461 // entry as the linker would, and verifies that the resultant fixup value is 462 // exactly what the encoder wanted. This will catch several classes of 463 // problems: 464 // 465 // - Relocation entry bugs, the two algorithms are unlikely to have the same 466 // exact bug. 467 // 468 // - Relaxation issues, where we forget to relax something. 469 // 470 // - Input errors, where something cannot be correctly encoded. 'as' allows 471 // these through in many cases. 472 473 void RecordX86_64Relocation(const MCAssembler &Asm, const MCAsmLayout &Layout, 474 const MCFragment *Fragment, 475 const MCFixup &Fixup, MCValue Target, 476 uint64_t &FixedValue) { 477 unsigned IsPCRel = isFixupKindPCRel(Fixup.getKind()); 478 unsigned IsRIPRel = isFixupKindRIPRel(Fixup.getKind()); 479 unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind()); 480 481 // See <reloc.h>. 482 uint32_t FixupOffset = 483 Layout.getFragmentOffset(Fragment) + Fixup.getOffset(); 484 uint32_t FixupAddress = 485 Layout.getFragmentAddress(Fragment) + Fixup.getOffset(); 486 int64_t Value = 0; 487 unsigned Index = 0; 488 unsigned IsExtern = 0; 489 unsigned Type = 0; 490 491 Value = Target.getConstant(); 492 493 if (IsPCRel) { 494 // Compensate for the relocation offset, Darwin x86_64 relocations only 495 // have the addend and appear to have attempted to define it to be the 496 // actual expression addend without the PCrel bias. However, instructions 497 // with data following the relocation are not accomodated for (see comment 498 // below regarding SIGNED{1,2,4}), so it isn't exactly that either. 499 Value += 1LL << Log2Size; 500 } 501 502 if (Target.isAbsolute()) { // constant 503 // SymbolNum of 0 indicates the absolute section. 504 Type = RIT_X86_64_Unsigned; 505 Index = 0; 506 507 // FIXME: I believe this is broken, I don't think the linker can 508 // understand it. I think it would require a local relocation, but I'm not 509 // sure if that would work either. The official way to get an absolute 510 // PCrel relocation is to use an absolute symbol (which we don't support 511 // yet). 512 if (IsPCRel) { 513 IsExtern = 1; 514 Type = RIT_X86_64_Branch; 515 } 516 } else if (Target.getSymB()) { // A - B + constant 517 const MCSymbol *A = &Target.getSymA()->getSymbol(); 518 MCSymbolData &A_SD = Asm.getSymbolData(*A); 519 const MCSymbolData *A_Base = Asm.getAtom(Layout, &A_SD); 520 521 const MCSymbol *B = &Target.getSymB()->getSymbol(); 522 MCSymbolData &B_SD = Asm.getSymbolData(*B); 523 const MCSymbolData *B_Base = Asm.getAtom(Layout, &B_SD); 524 525 // Neither symbol can be modified. 526 if (Target.getSymA()->getKind() != MCSymbolRefExpr::VK_None || 527 Target.getSymB()->getKind() != MCSymbolRefExpr::VK_None) 528 report_fatal_error("unsupported relocation of modified symbol"); 529 530 // We don't support PCrel relocations of differences. Darwin 'as' doesn't 531 // implement most of these correctly. 532 if (IsPCRel) 533 report_fatal_error("unsupported pc-relative relocation of difference"); 534 535 // We don't currently support any situation where one or both of the 536 // symbols would require a local relocation. This is almost certainly 537 // unused and may not be possible to encode correctly. 538 if (!A_Base || !B_Base) 539 report_fatal_error("unsupported local relocations in difference"); 540 541 // Darwin 'as' doesn't emit correct relocations for this (it ends up with 542 // a single SIGNED relocation); reject it for now. 543 if (A_Base == B_Base) 544 report_fatal_error("unsupported relocation with identical base"); 545 546 Value += Layout.getSymbolAddress(&A_SD) - Layout.getSymbolAddress(A_Base); 547 Value -= Layout.getSymbolAddress(&B_SD) - Layout.getSymbolAddress(B_Base); 548 549 Index = A_Base->getIndex(); 550 IsExtern = 1; 551 Type = RIT_X86_64_Unsigned; 552 553 MachRelocationEntry MRE; 554 MRE.Word0 = FixupOffset; 555 MRE.Word1 = ((Index << 0) | 556 (IsPCRel << 24) | 557 (Log2Size << 25) | 558 (IsExtern << 27) | 559 (Type << 28)); 560 Relocations[Fragment->getParent()].push_back(MRE); 561 562 Index = B_Base->getIndex(); 563 IsExtern = 1; 564 Type = RIT_X86_64_Subtractor; 565 } else { 566 const MCSymbol *Symbol = &Target.getSymA()->getSymbol(); 567 MCSymbolData &SD = Asm.getSymbolData(*Symbol); 568 const MCSymbolData *Base = Asm.getAtom(Layout, &SD); 569 570 // Relocations inside debug sections always use local relocations when 571 // possible. This seems to be done because the debugger doesn't fully 572 // understand x86_64 relocation entries, and expects to find values that 573 // have already been fixed up. 574 if (Symbol->isInSection()) { 575 const MCSectionMachO &Section = static_cast<const MCSectionMachO&>( 576 Fragment->getParent()->getSection()); 577 if (Section.hasAttribute(MCSectionMachO::S_ATTR_DEBUG)) 578 Base = 0; 579 } 580 581 // x86_64 almost always uses external relocations, except when there is no 582 // symbol to use as a base address (a local symbol with no preceeding 583 // non-local symbol). 584 if (Base) { 585 Index = Base->getIndex(); 586 IsExtern = 1; 587 588 // Add the local offset, if needed. 589 if (Base != &SD) 590 Value += Layout.getSymbolAddress(&SD) - Layout.getSymbolAddress(Base); 591 } else if (Symbol->isInSection()) { 592 // The index is the section ordinal (1-based). 593 Index = SD.getFragment()->getParent()->getOrdinal() + 1; 594 IsExtern = 0; 595 Value += Layout.getSymbolAddress(&SD); 596 597 if (IsPCRel) 598 Value -= FixupAddress + (1 << Log2Size); 599 } else { 600 report_fatal_error("unsupported relocation of undefined symbol '" + 601 Symbol->getName() + "'"); 602 } 603 604 MCSymbolRefExpr::VariantKind Modifier = Target.getSymA()->getKind(); 605 if (IsPCRel) { 606 if (IsRIPRel) { 607 if (Modifier == MCSymbolRefExpr::VK_GOTPCREL) { 608 // x86_64 distinguishes movq foo@GOTPCREL so that the linker can 609 // rewrite the movq to an leaq at link time if the symbol ends up in 610 // the same linkage unit. 611 if (unsigned(Fixup.getKind()) == X86::reloc_riprel_4byte_movq_load) 612 Type = RIT_X86_64_GOTLoad; 613 else 614 Type = RIT_X86_64_GOT; 615 } else if (Modifier == MCSymbolRefExpr::VK_TLVP) { 616 Type = RIT_X86_64_TLV; 617 } else if (Modifier != MCSymbolRefExpr::VK_None) { 618 report_fatal_error("unsupported symbol modifier in relocation"); 619 } else { 620 Type = RIT_X86_64_Signed; 621 622 // The Darwin x86_64 relocation format has a problem where it cannot 623 // encode an address (L<foo> + <constant>) which is outside the atom 624 // containing L<foo>. Generally, this shouldn't occur but it does 625 // happen when we have a RIPrel instruction with data following the 626 // relocation entry (e.g., movb $012, L0(%rip)). Even with the PCrel 627 // adjustment Darwin x86_64 uses, the offset is still negative and 628 // the linker has no way to recognize this. 629 // 630 // To work around this, Darwin uses several special relocation types 631 // to indicate the offsets. However, the specification or 632 // implementation of these seems to also be incomplete; they should 633 // adjust the addend as well based on the actual encoded instruction 634 // (the additional bias), but instead appear to just look at the 635 // final offset. 636 switch (-(Target.getConstant() + (1LL << Log2Size))) { 637 case 1: Type = RIT_X86_64_Signed1; break; 638 case 2: Type = RIT_X86_64_Signed2; break; 639 case 4: Type = RIT_X86_64_Signed4; break; 640 } 641 } 642 } else { 643 if (Modifier != MCSymbolRefExpr::VK_None) 644 report_fatal_error("unsupported symbol modifier in branch " 645 "relocation"); 646 647 Type = RIT_X86_64_Branch; 648 } 649 } else { 650 if (Modifier == MCSymbolRefExpr::VK_GOT) { 651 Type = RIT_X86_64_GOT; 652 } else if (Modifier == MCSymbolRefExpr::VK_GOTPCREL) { 653 // GOTPCREL is allowed as a modifier on non-PCrel instructions, in 654 // which case all we do is set the PCrel bit in the relocation entry; 655 // this is used with exception handling, for example. The source is 656 // required to include any necessary offset directly. 657 Type = RIT_X86_64_GOT; 658 IsPCRel = 1; 659 } else if (Modifier == MCSymbolRefExpr::VK_TLVP) { 660 report_fatal_error("TLVP symbol modifier should have been rip-rel"); 661 } else if (Modifier != MCSymbolRefExpr::VK_None) 662 report_fatal_error("unsupported symbol modifier in relocation"); 663 else 664 Type = RIT_X86_64_Unsigned; 665 } 666 } 667 668 // x86_64 always writes custom values into the fixups. 669 FixedValue = Value; 670 671 // struct relocation_info (8 bytes) 672 MachRelocationEntry MRE; 673 MRE.Word0 = FixupOffset; 674 MRE.Word1 = ((Index << 0) | 675 (IsPCRel << 24) | 676 (Log2Size << 25) | 677 (IsExtern << 27) | 678 (Type << 28)); 679 Relocations[Fragment->getParent()].push_back(MRE); 680 } 681 682 void RecordScatteredRelocation(const MCAssembler &Asm, 683 const MCAsmLayout &Layout, 684 const MCFragment *Fragment, 685 const MCFixup &Fixup, MCValue Target, 686 uint64_t &FixedValue) { 687 uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset(); 688 unsigned IsPCRel = isFixupKindPCRel(Fixup.getKind()); 689 unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind()); 690 unsigned Type = RIT_Vanilla; 691 692 // See <reloc.h>. 693 const MCSymbol *A = &Target.getSymA()->getSymbol(); 694 MCSymbolData *A_SD = &Asm.getSymbolData(*A); 695 696 if (!A_SD->getFragment()) 697 report_fatal_error("symbol '" + A->getName() + 698 "' can not be undefined in a subtraction expression"); 699 700 uint32_t Value = Layout.getSymbolAddress(A_SD); 701 uint32_t Value2 = 0; 702 703 if (const MCSymbolRefExpr *B = Target.getSymB()) { 704 MCSymbolData *B_SD = &Asm.getSymbolData(B->getSymbol()); 705 706 if (!B_SD->getFragment()) 707 report_fatal_error("symbol '" + B->getSymbol().getName() + 708 "' can not be undefined in a subtraction expression"); 709 710 // Select the appropriate difference relocation type. 711 // 712 // Note that there is no longer any semantic difference between these two 713 // relocation types from the linkers point of view, this is done solely 714 // for pedantic compatibility with 'as'. 715 Type = A_SD->isExternal() ? RIT_Difference : RIT_LocalDifference; 716 Value2 = Layout.getSymbolAddress(B_SD); 717 } 718 719 // Relocations are written out in reverse order, so the PAIR comes first. 720 if (Type == RIT_Difference || Type == RIT_LocalDifference) { 721 MachRelocationEntry MRE; 722 MRE.Word0 = ((0 << 0) | 723 (RIT_Pair << 24) | 724 (Log2Size << 28) | 725 (IsPCRel << 30) | 726 RF_Scattered); 727 MRE.Word1 = Value2; 728 Relocations[Fragment->getParent()].push_back(MRE); 729 } 730 731 MachRelocationEntry MRE; 732 MRE.Word0 = ((FixupOffset << 0) | 733 (Type << 24) | 734 (Log2Size << 28) | 735 (IsPCRel << 30) | 736 RF_Scattered); 737 MRE.Word1 = Value; 738 Relocations[Fragment->getParent()].push_back(MRE); 739 } 740 741 void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout, 742 const MCFragment *Fragment, const MCFixup &Fixup, 743 MCValue Target, uint64_t &FixedValue) { 744 if (Is64Bit) { 745 RecordX86_64Relocation(Asm, Layout, Fragment, Fixup, Target, FixedValue); 746 return; 747 } 748 749 unsigned IsPCRel = isFixupKindPCRel(Fixup.getKind()); 750 unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind()); 751 752 // If this is a difference or a defined symbol plus an offset, then we need 753 // a scattered relocation entry. 754 // Differences always require scattered relocations. 755 if (Target.getSymB()) 756 return RecordScatteredRelocation(Asm, Layout, Fragment, Fixup, 757 Target, FixedValue); 758 759 // Get the symbol data, if any. 760 MCSymbolData *SD = 0; 761 if (Target.getSymA()) 762 SD = &Asm.getSymbolData(Target.getSymA()->getSymbol()); 763 764 // If this is an internal relocation with an offset, it also needs a 765 // scattered relocation entry. 766 uint32_t Offset = Target.getConstant(); 767 if (IsPCRel) 768 Offset += 1 << Log2Size; 769 if (Offset && SD && !doesSymbolRequireExternRelocation(SD)) 770 return RecordScatteredRelocation(Asm, Layout, Fragment, Fixup, 771 Target, FixedValue); 772 773 // See <reloc.h>. 774 uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset(); 775 uint32_t Value = 0; 776 unsigned Index = 0; 777 unsigned IsExtern = 0; 778 unsigned Type = 0; 779 780 if (Target.isAbsolute()) { // constant 781 // SymbolNum of 0 indicates the absolute section. 782 // 783 // FIXME: Currently, these are never generated (see code below). I cannot 784 // find a case where they are actually emitted. 785 Type = RIT_Vanilla; 786 Value = 0; 787 } else { 788 // Check whether we need an external or internal relocation. 789 if (doesSymbolRequireExternRelocation(SD)) { 790 IsExtern = 1; 791 Index = SD->getIndex(); 792 // For external relocations, make sure to offset the fixup value to 793 // compensate for the addend of the symbol address, if it was 794 // undefined. This occurs with weak definitions, for example. 795 if (!SD->Symbol->isUndefined()) 796 FixedValue -= Layout.getSymbolAddress(SD); 797 Value = 0; 798 } else { 799 // The index is the section ordinal (1-based). 800 Index = SD->getFragment()->getParent()->getOrdinal() + 1; 801 Value = Layout.getSymbolAddress(SD); 802 } 803 804 Type = RIT_Vanilla; 805 } 806 807 // struct relocation_info (8 bytes) 808 MachRelocationEntry MRE; 809 MRE.Word0 = FixupOffset; 810 MRE.Word1 = ((Index << 0) | 811 (IsPCRel << 24) | 812 (Log2Size << 25) | 813 (IsExtern << 27) | 814 (Type << 28)); 815 Relocations[Fragment->getParent()].push_back(MRE); 816 } 817 818 void BindIndirectSymbols(MCAssembler &Asm) { 819 // This is the point where 'as' creates actual symbols for indirect symbols 820 // (in the following two passes). It would be easier for us to do this 821 // sooner when we see the attribute, but that makes getting the order in the 822 // symbol table much more complicated than it is worth. 823 // 824 // FIXME: Revisit this when the dust settles. 825 826 // Bind non lazy symbol pointers first. 827 unsigned IndirectIndex = 0; 828 for (MCAssembler::indirect_symbol_iterator it = Asm.indirect_symbol_begin(), 829 ie = Asm.indirect_symbol_end(); it != ie; ++it, ++IndirectIndex) { 830 const MCSectionMachO &Section = 831 cast<MCSectionMachO>(it->SectionData->getSection()); 832 833 if (Section.getType() != MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS) 834 continue; 835 836 // Initialize the section indirect symbol base, if necessary. 837 if (!IndirectSymBase.count(it->SectionData)) 838 IndirectSymBase[it->SectionData] = IndirectIndex; 839 840 Asm.getOrCreateSymbolData(*it->Symbol); 841 } 842 843 // Then lazy symbol pointers and symbol stubs. 844 IndirectIndex = 0; 845 for (MCAssembler::indirect_symbol_iterator it = Asm.indirect_symbol_begin(), 846 ie = Asm.indirect_symbol_end(); it != ie; ++it, ++IndirectIndex) { 847 const MCSectionMachO &Section = 848 cast<MCSectionMachO>(it->SectionData->getSection()); 849 850 if (Section.getType() != MCSectionMachO::S_LAZY_SYMBOL_POINTERS && 851 Section.getType() != MCSectionMachO::S_SYMBOL_STUBS) 852 continue; 853 854 // Initialize the section indirect symbol base, if necessary. 855 if (!IndirectSymBase.count(it->SectionData)) 856 IndirectSymBase[it->SectionData] = IndirectIndex; 857 858 // Set the symbol type to undefined lazy, but only on construction. 859 // 860 // FIXME: Do not hardcode. 861 bool Created; 862 MCSymbolData &Entry = Asm.getOrCreateSymbolData(*it->Symbol, &Created); 863 if (Created) 864 Entry.setFlags(Entry.getFlags() | 0x0001); 865 } 866 } 867 868 /// ComputeSymbolTable - Compute the symbol table data 869 /// 870 /// \param StringTable [out] - The string table data. 871 /// \param StringIndexMap [out] - Map from symbol names to offsets in the 872 /// string table. 873 void ComputeSymbolTable(MCAssembler &Asm, SmallString<256> &StringTable, 874 std::vector<MachSymbolData> &LocalSymbolData, 875 std::vector<MachSymbolData> &ExternalSymbolData, 876 std::vector<MachSymbolData> &UndefinedSymbolData) { 877 // Build section lookup table. 878 DenseMap<const MCSection*, uint8_t> SectionIndexMap; 879 unsigned Index = 1; 880 for (MCAssembler::iterator it = Asm.begin(), 881 ie = Asm.end(); it != ie; ++it, ++Index) 882 SectionIndexMap[&it->getSection()] = Index; 883 assert(Index <= 256 && "Too many sections!"); 884 885 // Index 0 is always the empty string. 886 StringMap<uint64_t> StringIndexMap; 887 StringTable += '\x00'; 888 889 // Build the symbol arrays and the string table, but only for non-local 890 // symbols. 891 // 892 // The particular order that we collect the symbols and create the string 893 // table, then sort the symbols is chosen to match 'as'. Even though it 894 // doesn't matter for correctness, this is important for letting us diff .o 895 // files. 896 for (MCAssembler::symbol_iterator it = Asm.symbol_begin(), 897 ie = Asm.symbol_end(); it != ie; ++it) { 898 const MCSymbol &Symbol = it->getSymbol(); 899 900 // Ignore non-linker visible symbols. 901 if (!Asm.isSymbolLinkerVisible(it)) 902 continue; 903 904 if (!it->isExternal() && !Symbol.isUndefined()) 905 continue; 906 907 uint64_t &Entry = StringIndexMap[Symbol.getName()]; 908 if (!Entry) { 909 Entry = StringTable.size(); 910 StringTable += Symbol.getName(); 911 StringTable += '\x00'; 912 } 913 914 MachSymbolData MSD; 915 MSD.SymbolData = it; 916 MSD.StringIndex = Entry; 917 918 if (Symbol.isUndefined()) { 919 MSD.SectionIndex = 0; 920 UndefinedSymbolData.push_back(MSD); 921 } else if (Symbol.isAbsolute()) { 922 MSD.SectionIndex = 0; 923 ExternalSymbolData.push_back(MSD); 924 } else { 925 MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection()); 926 assert(MSD.SectionIndex && "Invalid section index!"); 927 ExternalSymbolData.push_back(MSD); 928 } 929 } 930 931 // Now add the data for local symbols. 932 for (MCAssembler::symbol_iterator it = Asm.symbol_begin(), 933 ie = Asm.symbol_end(); it != ie; ++it) { 934 const MCSymbol &Symbol = it->getSymbol(); 935 936 // Ignore non-linker visible symbols. 937 if (!Asm.isSymbolLinkerVisible(it)) 938 continue; 939 940 if (it->isExternal() || Symbol.isUndefined()) 941 continue; 942 943 uint64_t &Entry = StringIndexMap[Symbol.getName()]; 944 if (!Entry) { 945 Entry = StringTable.size(); 946 StringTable += Symbol.getName(); 947 StringTable += '\x00'; 948 } 949 950 MachSymbolData MSD; 951 MSD.SymbolData = it; 952 MSD.StringIndex = Entry; 953 954 if (Symbol.isAbsolute()) { 955 MSD.SectionIndex = 0; 956 LocalSymbolData.push_back(MSD); 957 } else { 958 MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection()); 959 assert(MSD.SectionIndex && "Invalid section index!"); 960 LocalSymbolData.push_back(MSD); 961 } 962 } 963 964 // External and undefined symbols are required to be in lexicographic order. 965 std::sort(ExternalSymbolData.begin(), ExternalSymbolData.end()); 966 std::sort(UndefinedSymbolData.begin(), UndefinedSymbolData.end()); 967 968 // Set the symbol indices. 969 Index = 0; 970 for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i) 971 LocalSymbolData[i].SymbolData->setIndex(Index++); 972 for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i) 973 ExternalSymbolData[i].SymbolData->setIndex(Index++); 974 for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i) 975 UndefinedSymbolData[i].SymbolData->setIndex(Index++); 976 977 // The string table is padded to a multiple of 4. 978 while (StringTable.size() % 4) 979 StringTable += '\x00'; 980 } 981 982 void ExecutePostLayoutBinding(MCAssembler &Asm) { 983 // Create symbol data for any indirect symbols. 984 BindIndirectSymbols(Asm); 985 986 // Compute symbol table information and bind symbol indices. 987 ComputeSymbolTable(Asm, StringTable, LocalSymbolData, ExternalSymbolData, 988 UndefinedSymbolData); 989 } 990 991 void WriteObject(const MCAssembler &Asm, const MCAsmLayout &Layout) { 992 unsigned NumSections = Asm.size(); 993 994 // The section data starts after the header, the segment load command (and 995 // section headers) and the symbol table. 996 unsigned NumLoadCommands = 1; 997 uint64_t LoadCommandsSize = Is64Bit ? 998 SegmentLoadCommand64Size + NumSections * Section64Size : 999 SegmentLoadCommand32Size + NumSections * Section32Size; 1000 1001 // Add the symbol table load command sizes, if used. 1002 unsigned NumSymbols = LocalSymbolData.size() + ExternalSymbolData.size() + 1003 UndefinedSymbolData.size(); 1004 if (NumSymbols) { 1005 NumLoadCommands += 2; 1006 LoadCommandsSize += SymtabLoadCommandSize + DysymtabLoadCommandSize; 1007 } 1008 1009 // Compute the total size of the section data, as well as its file size and 1010 // vm size. 1011 uint64_t SectionDataStart = (Is64Bit ? Header64Size : Header32Size) 1012 + LoadCommandsSize; 1013 uint64_t SectionDataSize = 0; 1014 uint64_t SectionDataFileSize = 0; 1015 uint64_t VMSize = 0; 1016 for (MCAssembler::const_iterator it = Asm.begin(), 1017 ie = Asm.end(); it != ie; ++it) { 1018 const MCSectionData &SD = *it; 1019 uint64_t Address = Layout.getSectionAddress(&SD); 1020 uint64_t Size = Layout.getSectionSize(&SD); 1021 uint64_t FileSize = Layout.getSectionFileSize(&SD); 1022 1023 VMSize = std::max(VMSize, Address + Size); 1024 1025 if (Asm.getBackend().isVirtualSection(SD.getSection())) 1026 continue; 1027 1028 SectionDataSize = std::max(SectionDataSize, Address + Size); 1029 SectionDataFileSize = std::max(SectionDataFileSize, Address + FileSize); 1030 } 1031 1032 // The section data is padded to 4 bytes. 1033 // 1034 // FIXME: Is this machine dependent? 1035 unsigned SectionDataPadding = OffsetToAlignment(SectionDataFileSize, 4); 1036 SectionDataFileSize += SectionDataPadding; 1037 1038 // Write the prolog, starting with the header and load command... 1039 WriteHeader(NumLoadCommands, LoadCommandsSize, 1040 Asm.getSubsectionsViaSymbols()); 1041 WriteSegmentLoadCommand(NumSections, VMSize, 1042 SectionDataStart, SectionDataSize); 1043 1044 // ... and then the section headers. 1045 uint64_t RelocTableEnd = SectionDataStart + SectionDataFileSize; 1046 for (MCAssembler::const_iterator it = Asm.begin(), 1047 ie = Asm.end(); it != ie; ++it) { 1048 std::vector<MachRelocationEntry> &Relocs = Relocations[it]; 1049 unsigned NumRelocs = Relocs.size(); 1050 uint64_t SectionStart = SectionDataStart + Layout.getSectionAddress(it); 1051 WriteSection(Asm, Layout, *it, SectionStart, RelocTableEnd, NumRelocs); 1052 RelocTableEnd += NumRelocs * RelocationInfoSize; 1053 } 1054 1055 // Write the symbol table load command, if used. 1056 if (NumSymbols) { 1057 unsigned FirstLocalSymbol = 0; 1058 unsigned NumLocalSymbols = LocalSymbolData.size(); 1059 unsigned FirstExternalSymbol = FirstLocalSymbol + NumLocalSymbols; 1060 unsigned NumExternalSymbols = ExternalSymbolData.size(); 1061 unsigned FirstUndefinedSymbol = FirstExternalSymbol + NumExternalSymbols; 1062 unsigned NumUndefinedSymbols = UndefinedSymbolData.size(); 1063 unsigned NumIndirectSymbols = Asm.indirect_symbol_size(); 1064 unsigned NumSymTabSymbols = 1065 NumLocalSymbols + NumExternalSymbols + NumUndefinedSymbols; 1066 uint64_t IndirectSymbolSize = NumIndirectSymbols * 4; 1067 uint64_t IndirectSymbolOffset = 0; 1068 1069 // If used, the indirect symbols are written after the section data. 1070 if (NumIndirectSymbols) 1071 IndirectSymbolOffset = RelocTableEnd; 1072 1073 // The symbol table is written after the indirect symbol data. 1074 uint64_t SymbolTableOffset = RelocTableEnd + IndirectSymbolSize; 1075 1076 // The string table is written after symbol table. 1077 uint64_t StringTableOffset = 1078 SymbolTableOffset + NumSymTabSymbols * (Is64Bit ? Nlist64Size : 1079 Nlist32Size); 1080 WriteSymtabLoadCommand(SymbolTableOffset, NumSymTabSymbols, 1081 StringTableOffset, StringTable.size()); 1082 1083 WriteDysymtabLoadCommand(FirstLocalSymbol, NumLocalSymbols, 1084 FirstExternalSymbol, NumExternalSymbols, 1085 FirstUndefinedSymbol, NumUndefinedSymbols, 1086 IndirectSymbolOffset, NumIndirectSymbols); 1087 } 1088 1089 // Write the actual section data. 1090 for (MCAssembler::const_iterator it = Asm.begin(), 1091 ie = Asm.end(); it != ie; ++it) 1092 Asm.WriteSectionData(it, Layout, Writer); 1093 1094 // Write the extra padding. 1095 WriteZeros(SectionDataPadding); 1096 1097 // Write the relocation entries. 1098 for (MCAssembler::const_iterator it = Asm.begin(), 1099 ie = Asm.end(); it != ie; ++it) { 1100 // Write the section relocation entries, in reverse order to match 'as' 1101 // (approximately, the exact algorithm is more complicated than this). 1102 std::vector<MachRelocationEntry> &Relocs = Relocations[it]; 1103 for (unsigned i = 0, e = Relocs.size(); i != e; ++i) { 1104 Write32(Relocs[e - i - 1].Word0); 1105 Write32(Relocs[e - i - 1].Word1); 1106 } 1107 } 1108 1109 // Write the symbol table data, if used. 1110 if (NumSymbols) { 1111 // Write the indirect symbol entries. 1112 for (MCAssembler::const_indirect_symbol_iterator 1113 it = Asm.indirect_symbol_begin(), 1114 ie = Asm.indirect_symbol_end(); it != ie; ++it) { 1115 // Indirect symbols in the non lazy symbol pointer section have some 1116 // special handling. 1117 const MCSectionMachO &Section = 1118 static_cast<const MCSectionMachO&>(it->SectionData->getSection()); 1119 if (Section.getType() == MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS) { 1120 // If this symbol is defined and internal, mark it as such. 1121 if (it->Symbol->isDefined() && 1122 !Asm.getSymbolData(*it->Symbol).isExternal()) { 1123 uint32_t Flags = ISF_Local; 1124 if (it->Symbol->isAbsolute()) 1125 Flags |= ISF_Absolute; 1126 Write32(Flags); 1127 continue; 1128 } 1129 } 1130 1131 Write32(Asm.getSymbolData(*it->Symbol).getIndex()); 1132 } 1133 1134 // FIXME: Check that offsets match computed ones. 1135 1136 // Write the symbol table entries. 1137 for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i) 1138 WriteNlist(LocalSymbolData[i], Layout); 1139 for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i) 1140 WriteNlist(ExternalSymbolData[i], Layout); 1141 for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i) 1142 WriteNlist(UndefinedSymbolData[i], Layout); 1143 1144 // Write the string table. 1145 OS << StringTable.str(); 1146 } 1147 } 1148 }; 1149 1150 } 1151 1152 MachObjectWriter::MachObjectWriter(raw_ostream &OS, 1153 bool Is64Bit, 1154 bool IsLittleEndian) 1155 : MCObjectWriter(OS, IsLittleEndian) 1156 { 1157 Impl = new MachObjectWriterImpl(this, Is64Bit); 1158 } 1159 1160 MachObjectWriter::~MachObjectWriter() { 1161 delete (MachObjectWriterImpl*) Impl; 1162 } 1163 1164 void MachObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm) { 1165 ((MachObjectWriterImpl*) Impl)->ExecutePostLayoutBinding(Asm); 1166 } 1167 1168 void MachObjectWriter::RecordRelocation(const MCAssembler &Asm, 1169 const MCAsmLayout &Layout, 1170 const MCFragment *Fragment, 1171 const MCFixup &Fixup, MCValue Target, 1172 uint64_t &FixedValue) { 1173 ((MachObjectWriterImpl*) Impl)->RecordRelocation(Asm, Layout, Fragment, Fixup, 1174 Target, FixedValue); 1175 } 1176 1177 void MachObjectWriter::WriteObject(const MCAssembler &Asm, 1178 const MCAsmLayout &Layout) { 1179 ((MachObjectWriterImpl*) Impl)->WriteObject(Asm, Layout); 1180 } 1181