1 //===- lib/MC/ELFObjectWriter.cpp - ELF 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 // This file implements ELF object file writer information. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/MC/MCELFObjectWriter.h" 15 #include "llvm/ADT/STLExtras.h" 16 #include "llvm/ADT/SmallPtrSet.h" 17 #include "llvm/ADT/SmallString.h" 18 #include "llvm/ADT/StringMap.h" 19 #include "llvm/MC/MCAsmBackend.h" 20 #include "llvm/MC/MCAsmInfo.h" 21 #include "llvm/MC/MCAsmLayout.h" 22 #include "llvm/MC/MCAssembler.h" 23 #include "llvm/MC/MCContext.h" 24 #include "llvm/MC/MCELF.h" 25 #include "llvm/MC/MCELFSymbolFlags.h" 26 #include "llvm/MC/MCExpr.h" 27 #include "llvm/MC/MCFixupKindInfo.h" 28 #include "llvm/MC/MCObjectWriter.h" 29 #include "llvm/MC/MCSectionELF.h" 30 #include "llvm/MC/MCValue.h" 31 #include "llvm/MC/StringTableBuilder.h" 32 #include "llvm/Support/Compression.h" 33 #include "llvm/Support/Debug.h" 34 #include "llvm/Support/ELF.h" 35 #include "llvm/Support/Endian.h" 36 #include "llvm/Support/ErrorHandling.h" 37 #include <vector> 38 using namespace llvm; 39 40 #undef DEBUG_TYPE 41 #define DEBUG_TYPE "reloc-info" 42 43 namespace { 44 45 typedef DenseMap<const MCSectionELF *, uint32_t> SectionIndexMapTy; 46 47 class ELFObjectWriter; 48 49 class SymbolTableWriter { 50 ELFObjectWriter &EWriter; 51 bool Is64Bit; 52 53 // indexes we are going to write to .symtab_shndx. 54 std::vector<uint32_t> ShndxIndexes; 55 56 // The numbel of symbols written so far. 57 unsigned NumWritten; 58 59 void createSymtabShndx(); 60 61 template <typename T> void write(T Value); 62 63 public: 64 SymbolTableWriter(ELFObjectWriter &EWriter, bool Is64Bit); 65 66 void writeSymbol(uint32_t name, uint8_t info, uint64_t value, uint64_t size, 67 uint8_t other, uint32_t shndx, bool Reserved); 68 69 ArrayRef<uint32_t> getShndxIndexes() const { return ShndxIndexes; } 70 }; 71 72 class ELFObjectWriter : public MCObjectWriter { 73 static bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind); 74 static bool RelocNeedsGOT(MCSymbolRefExpr::VariantKind Variant); 75 static uint64_t SymbolValue(MCSymbolData &Data, const MCAsmLayout &Layout); 76 static bool isInSymtab(const MCAsmLayout &Layout, const MCSymbolData &Data, 77 bool Used, bool Renamed); 78 static bool isLocal(const MCSymbolData &Data, bool isUsedInReloc); 79 80 /// Helper struct for containing some precomputed information on symbols. 81 struct ELFSymbolData { 82 MCSymbolData *SymbolData; 83 uint64_t StringIndex; 84 uint32_t SectionIndex; 85 StringRef Name; 86 87 // Support lexicographic sorting. 88 bool operator<(const ELFSymbolData &RHS) const { 89 unsigned LHSType = MCELF::GetType(*SymbolData); 90 unsigned RHSType = MCELF::GetType(*RHS.SymbolData); 91 if (LHSType == ELF::STT_SECTION && RHSType != ELF::STT_SECTION) 92 return false; 93 if (LHSType != ELF::STT_SECTION && RHSType == ELF::STT_SECTION) 94 return true; 95 if (LHSType == ELF::STT_SECTION && RHSType == ELF::STT_SECTION) 96 return SectionIndex < RHS.SectionIndex; 97 return Name < RHS.Name; 98 } 99 }; 100 101 /// The target specific ELF writer instance. 102 std::unique_ptr<MCELFObjectTargetWriter> TargetObjectWriter; 103 104 SmallPtrSet<const MCSymbol *, 16> UsedInReloc; 105 SmallPtrSet<const MCSymbol *, 16> WeakrefUsedInReloc; 106 DenseMap<const MCSymbol *, const MCSymbol *> Renames; 107 108 llvm::DenseMap<const MCSectionELF *, std::vector<ELFRelocationEntry>> 109 Relocations; 110 StringTableBuilder ShStrTabBuilder; 111 112 /// @} 113 /// @name Symbol Table Data 114 /// @{ 115 116 StringTableBuilder StrTabBuilder; 117 std::vector<uint64_t> FileSymbolData; 118 std::vector<ELFSymbolData> LocalSymbolData; 119 std::vector<ELFSymbolData> ExternalSymbolData; 120 std::vector<ELFSymbolData> UndefinedSymbolData; 121 122 /// @} 123 124 bool NeedsGOT; 125 126 // This holds the symbol table index of the last local symbol. 127 unsigned LastLocalSymbolIndex; 128 // This holds the .strtab section index. 129 unsigned StringTableIndex; 130 // This holds the .symtab section index. 131 unsigned SymbolTableIndex; 132 133 unsigned ShstrtabIndex; 134 135 // Sections in the order they are to be output in the section table. 136 std::vector<const MCSectionELF *> SectionTable; 137 unsigned addToSectionTable(const MCSectionELF *Sec); 138 139 // TargetObjectWriter wrappers. 140 bool is64Bit() const { return TargetObjectWriter->is64Bit(); } 141 bool hasRelocationAddend() const { 142 return TargetObjectWriter->hasRelocationAddend(); 143 } 144 unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, 145 bool IsPCRel) const { 146 return TargetObjectWriter->GetRelocType(Target, Fixup, IsPCRel); 147 } 148 149 public: 150 ELFObjectWriter(MCELFObjectTargetWriter *MOTW, raw_pwrite_stream &OS, 151 bool IsLittleEndian) 152 : MCObjectWriter(OS, IsLittleEndian), TargetObjectWriter(MOTW), 153 NeedsGOT(false) {} 154 155 void reset() override { 156 UsedInReloc.clear(); 157 WeakrefUsedInReloc.clear(); 158 Renames.clear(); 159 Relocations.clear(); 160 ShStrTabBuilder.clear(); 161 StrTabBuilder.clear(); 162 FileSymbolData.clear(); 163 LocalSymbolData.clear(); 164 ExternalSymbolData.clear(); 165 UndefinedSymbolData.clear(); 166 MCObjectWriter::reset(); 167 } 168 169 ~ELFObjectWriter() override; 170 171 void WriteWord(uint64_t W) { 172 if (is64Bit()) 173 Write64(W); 174 else 175 Write32(W); 176 } 177 178 template <typename T> void write(T Val) { 179 if (IsLittleEndian) 180 support::endian::Writer<support::little>(OS).write(Val); 181 else 182 support::endian::Writer<support::big>(OS).write(Val); 183 } 184 185 void writeHeader(const MCAssembler &Asm); 186 187 void WriteSymbol(SymbolTableWriter &Writer, ELFSymbolData &MSD, 188 const MCAsmLayout &Layout); 189 190 // Start and end offset of each section 191 typedef std::map<const MCSectionELF *, std::pair<uint64_t, uint64_t>> 192 SectionOffsetsTy; 193 194 void WriteSymbolTable(MCAssembler &Asm, const MCAsmLayout &Layout, 195 SectionOffsetsTy &SectionOffsets); 196 197 bool shouldRelocateWithSymbol(const MCAssembler &Asm, 198 const MCSymbolRefExpr *RefA, 199 const MCSymbolData *SD, uint64_t C, 200 unsigned Type) const; 201 202 void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout, 203 const MCFragment *Fragment, const MCFixup &Fixup, 204 MCValue Target, bool &IsPCRel, 205 uint64_t &FixedValue) override; 206 207 uint64_t getSymbolIndexInSymbolTable(const MCAssembler &Asm, 208 const MCSymbol *S); 209 210 // Map from a signature symbol to the group section index 211 typedef DenseMap<const MCSymbol *, unsigned> RevGroupMapTy; 212 213 /// Compute the symbol table data 214 /// 215 /// \param Asm - The assembler. 216 /// \param SectionIndexMap - Maps a section to its index. 217 /// \param RevGroupMap - Maps a signature symbol to the group section. 218 void computeSymbolTable(MCAssembler &Asm, const MCAsmLayout &Layout, 219 const SectionIndexMapTy &SectionIndexMap, 220 const RevGroupMapTy &RevGroupMap); 221 222 const MCSectionELF *createRelocationSection(MCAssembler &Asm, 223 const MCSectionELF &Sec); 224 225 const MCSectionELF *createSectionHeaderStringTable(); 226 const MCSectionELF *createStringTable(MCContext &Ctx); 227 228 void ExecutePostLayoutBinding(MCAssembler &Asm, 229 const MCAsmLayout &Layout) override; 230 231 void writeSectionHeader(MCAssembler &Asm, const MCAsmLayout &Layout, 232 const SectionIndexMapTy &SectionIndexMap, 233 const SectionOffsetsTy &SectionOffsets); 234 235 void writeSectionData(const MCAssembler &Asm, const MCSectionData &SD, 236 const MCAsmLayout &Layout); 237 238 void WriteSecHdrEntry(uint32_t Name, uint32_t Type, uint64_t Flags, 239 uint64_t Address, uint64_t Offset, uint64_t Size, 240 uint32_t Link, uint32_t Info, uint64_t Alignment, 241 uint64_t EntrySize); 242 243 void writeRelocations(const MCAssembler &Asm, const MCSectionELF &Sec); 244 245 bool 246 IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, 247 const MCSymbolData &DataA, 248 const MCFragment &FB, 249 bool InSet, 250 bool IsPCRel) const override; 251 252 bool isWeak(const MCSymbolData &SD) const override; 253 254 void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override; 255 void writeSection(MCAssembler &Asm, 256 const SectionIndexMapTy &SectionIndexMap, 257 uint32_t GroupSymbolIndex, 258 uint64_t Offset, uint64_t Size, uint64_t Alignment, 259 const MCSectionELF &Section); 260 }; 261 } 262 263 unsigned ELFObjectWriter::addToSectionTable(const MCSectionELF *Sec) { 264 SectionTable.push_back(Sec); 265 ShStrTabBuilder.add(Sec->getSectionName()); 266 return SectionTable.size(); 267 } 268 269 void SymbolTableWriter::createSymtabShndx() { 270 if (!ShndxIndexes.empty()) 271 return; 272 273 ShndxIndexes.resize(NumWritten); 274 } 275 276 template <typename T> void SymbolTableWriter::write(T Value) { 277 EWriter.write(Value); 278 } 279 280 SymbolTableWriter::SymbolTableWriter(ELFObjectWriter &EWriter, bool Is64Bit) 281 : EWriter(EWriter), Is64Bit(Is64Bit), NumWritten(0) {} 282 283 void SymbolTableWriter::writeSymbol(uint32_t name, uint8_t info, uint64_t value, 284 uint64_t size, uint8_t other, 285 uint32_t shndx, bool Reserved) { 286 bool LargeIndex = shndx >= ELF::SHN_LORESERVE && !Reserved; 287 288 if (LargeIndex) 289 createSymtabShndx(); 290 291 if (!ShndxIndexes.empty()) { 292 if (LargeIndex) 293 ShndxIndexes.push_back(shndx); 294 else 295 ShndxIndexes.push_back(0); 296 } 297 298 uint16_t Index = LargeIndex ? uint16_t(ELF::SHN_XINDEX) : shndx; 299 300 if (Is64Bit) { 301 write(name); // st_name 302 write(info); // st_info 303 write(other); // st_other 304 write(Index); // st_shndx 305 write(value); // st_value 306 write(size); // st_size 307 } else { 308 write(name); // st_name 309 write(uint32_t(value)); // st_value 310 write(uint32_t(size)); // st_size 311 write(info); // st_info 312 write(other); // st_other 313 write(Index); // st_shndx 314 } 315 316 ++NumWritten; 317 } 318 319 bool ELFObjectWriter::isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind) { 320 const MCFixupKindInfo &FKI = 321 Asm.getBackend().getFixupKindInfo((MCFixupKind) Kind); 322 323 return FKI.Flags & MCFixupKindInfo::FKF_IsPCRel; 324 } 325 326 bool ELFObjectWriter::RelocNeedsGOT(MCSymbolRefExpr::VariantKind Variant) { 327 switch (Variant) { 328 default: 329 return false; 330 case MCSymbolRefExpr::VK_GOT: 331 case MCSymbolRefExpr::VK_PLT: 332 case MCSymbolRefExpr::VK_GOTPCREL: 333 case MCSymbolRefExpr::VK_GOTOFF: 334 case MCSymbolRefExpr::VK_TPOFF: 335 case MCSymbolRefExpr::VK_TLSGD: 336 case MCSymbolRefExpr::VK_GOTTPOFF: 337 case MCSymbolRefExpr::VK_INDNTPOFF: 338 case MCSymbolRefExpr::VK_NTPOFF: 339 case MCSymbolRefExpr::VK_GOTNTPOFF: 340 case MCSymbolRefExpr::VK_TLSLDM: 341 case MCSymbolRefExpr::VK_DTPOFF: 342 case MCSymbolRefExpr::VK_TLSLD: 343 return true; 344 } 345 } 346 347 ELFObjectWriter::~ELFObjectWriter() 348 {} 349 350 // Emit the ELF header. 351 void ELFObjectWriter::writeHeader(const MCAssembler &Asm) { 352 // ELF Header 353 // ---------- 354 // 355 // Note 356 // ---- 357 // emitWord method behaves differently for ELF32 and ELF64, writing 358 // 4 bytes in the former and 8 in the latter. 359 360 WriteBytes(ELF::ElfMagic); // e_ident[EI_MAG0] to e_ident[EI_MAG3] 361 362 Write8(is64Bit() ? ELF::ELFCLASS64 : ELF::ELFCLASS32); // e_ident[EI_CLASS] 363 364 // e_ident[EI_DATA] 365 Write8(isLittleEndian() ? ELF::ELFDATA2LSB : ELF::ELFDATA2MSB); 366 367 Write8(ELF::EV_CURRENT); // e_ident[EI_VERSION] 368 // e_ident[EI_OSABI] 369 Write8(TargetObjectWriter->getOSABI()); 370 Write8(0); // e_ident[EI_ABIVERSION] 371 372 WriteZeros(ELF::EI_NIDENT - ELF::EI_PAD); 373 374 Write16(ELF::ET_REL); // e_type 375 376 Write16(TargetObjectWriter->getEMachine()); // e_machine = target 377 378 Write32(ELF::EV_CURRENT); // e_version 379 WriteWord(0); // e_entry, no entry point in .o file 380 WriteWord(0); // e_phoff, no program header for .o 381 WriteWord(0); // e_shoff = sec hdr table off in bytes 382 383 // e_flags = whatever the target wants 384 Write32(Asm.getELFHeaderEFlags()); 385 386 // e_ehsize = ELF header size 387 Write16(is64Bit() ? sizeof(ELF::Elf64_Ehdr) : sizeof(ELF::Elf32_Ehdr)); 388 389 Write16(0); // e_phentsize = prog header entry size 390 Write16(0); // e_phnum = # prog header entries = 0 391 392 // e_shentsize = Section header entry size 393 Write16(is64Bit() ? sizeof(ELF::Elf64_Shdr) : sizeof(ELF::Elf32_Shdr)); 394 395 // e_shnum = # of section header ents 396 Write16(0); 397 398 // e_shstrndx = Section # of '.shstrtab' 399 assert(ShstrtabIndex < ELF::SHN_LORESERVE); 400 Write16(ShstrtabIndex); 401 } 402 403 uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &Data, 404 const MCAsmLayout &Layout) { 405 if (Data.isCommon() && Data.isExternal()) 406 return Data.getCommonAlignment(); 407 408 uint64_t Res; 409 if (!Layout.getSymbolOffset(&Data, Res)) 410 return 0; 411 412 if (Layout.getAssembler().isThumbFunc(&Data.getSymbol())) 413 Res |= 1; 414 415 return Res; 416 } 417 418 void ELFObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm, 419 const MCAsmLayout &Layout) { 420 // The presence of symbol versions causes undefined symbols and 421 // versions declared with @@@ to be renamed. 422 423 for (MCSymbolData &OriginalData : Asm.symbols()) { 424 const MCSymbol &Alias = OriginalData.getSymbol(); 425 426 // Not an alias. 427 if (!Alias.isVariable()) 428 continue; 429 auto *Ref = dyn_cast<MCSymbolRefExpr>(Alias.getVariableValue()); 430 if (!Ref) 431 continue; 432 const MCSymbol &Symbol = Ref->getSymbol(); 433 MCSymbolData &SD = Asm.getSymbolData(Symbol); 434 435 StringRef AliasName = Alias.getName(); 436 size_t Pos = AliasName.find('@'); 437 if (Pos == StringRef::npos) 438 continue; 439 440 // Aliases defined with .symvar copy the binding from the symbol they alias. 441 // This is the first place we are able to copy this information. 442 OriginalData.setExternal(SD.isExternal()); 443 MCELF::SetBinding(OriginalData, MCELF::GetBinding(SD)); 444 445 StringRef Rest = AliasName.substr(Pos); 446 if (!Symbol.isUndefined() && !Rest.startswith("@@@")) 447 continue; 448 449 // FIXME: produce a better error message. 450 if (Symbol.isUndefined() && Rest.startswith("@@") && 451 !Rest.startswith("@@@")) 452 report_fatal_error("A @@ version cannot be undefined"); 453 454 Renames.insert(std::make_pair(&Symbol, &Alias)); 455 } 456 } 457 458 static uint8_t mergeTypeForSet(uint8_t origType, uint8_t newType) { 459 uint8_t Type = newType; 460 461 // Propagation rules: 462 // IFUNC > FUNC > OBJECT > NOTYPE 463 // TLS_OBJECT > OBJECT > NOTYPE 464 // 465 // dont let the new type degrade the old type 466 switch (origType) { 467 default: 468 break; 469 case ELF::STT_GNU_IFUNC: 470 if (Type == ELF::STT_FUNC || Type == ELF::STT_OBJECT || 471 Type == ELF::STT_NOTYPE || Type == ELF::STT_TLS) 472 Type = ELF::STT_GNU_IFUNC; 473 break; 474 case ELF::STT_FUNC: 475 if (Type == ELF::STT_OBJECT || Type == ELF::STT_NOTYPE || 476 Type == ELF::STT_TLS) 477 Type = ELF::STT_FUNC; 478 break; 479 case ELF::STT_OBJECT: 480 if (Type == ELF::STT_NOTYPE) 481 Type = ELF::STT_OBJECT; 482 break; 483 case ELF::STT_TLS: 484 if (Type == ELF::STT_OBJECT || Type == ELF::STT_NOTYPE || 485 Type == ELF::STT_GNU_IFUNC || Type == ELF::STT_FUNC) 486 Type = ELF::STT_TLS; 487 break; 488 } 489 490 return Type; 491 } 492 493 void ELFObjectWriter::WriteSymbol(SymbolTableWriter &Writer, ELFSymbolData &MSD, 494 const MCAsmLayout &Layout) { 495 MCSymbolData &OrigData = *MSD.SymbolData; 496 assert((!OrigData.getFragment() || 497 (&OrigData.getFragment()->getParent()->getSection() == 498 &OrigData.getSymbol().getSection())) && 499 "The symbol's section doesn't match the fragment's symbol"); 500 const MCSymbol *Base = Layout.getBaseSymbol(OrigData.getSymbol()); 501 502 // This has to be in sync with when computeSymbolTable uses SHN_ABS or 503 // SHN_COMMON. 504 bool IsReserved = !Base || OrigData.isCommon(); 505 506 // Binding and Type share the same byte as upper and lower nibbles 507 uint8_t Binding = MCELF::GetBinding(OrigData); 508 uint8_t Type = MCELF::GetType(OrigData); 509 MCSymbolData *BaseSD = nullptr; 510 if (Base) { 511 BaseSD = &Layout.getAssembler().getSymbolData(*Base); 512 Type = mergeTypeForSet(Type, MCELF::GetType(*BaseSD)); 513 } 514 uint8_t Info = (Binding << ELF_STB_Shift) | (Type << ELF_STT_Shift); 515 516 // Other and Visibility share the same byte with Visibility using the lower 517 // 2 bits 518 uint8_t Visibility = MCELF::GetVisibility(OrigData); 519 uint8_t Other = MCELF::getOther(OrigData) << (ELF_STO_Shift - ELF_STV_Shift); 520 Other |= Visibility; 521 522 uint64_t Value = SymbolValue(OrigData, Layout); 523 uint64_t Size = 0; 524 525 const MCExpr *ESize = OrigData.getSize(); 526 if (!ESize && Base) 527 ESize = BaseSD->getSize(); 528 529 if (ESize) { 530 int64_t Res; 531 if (!ESize->evaluateKnownAbsolute(Res, Layout)) 532 report_fatal_error("Size expression must be absolute."); 533 Size = Res; 534 } 535 536 // Write out the symbol table entry 537 Writer.writeSymbol(MSD.StringIndex, Info, Value, Size, Other, 538 MSD.SectionIndex, IsReserved); 539 } 540 541 void ELFObjectWriter::WriteSymbolTable(MCAssembler &Asm, 542 const MCAsmLayout &Layout, 543 SectionOffsetsTy &SectionOffsets) { 544 545 MCContext &Ctx = Asm.getContext(); 546 547 unsigned EntrySize = is64Bit() ? ELF::SYMENTRY_SIZE64 : ELF::SYMENTRY_SIZE32; 548 549 // Symbol table 550 const MCSectionELF *SymtabSection = 551 Ctx.getELFSection(".symtab", ELF::SHT_SYMTAB, 0, EntrySize, ""); 552 MCSectionData &SymtabSD = Asm.getOrCreateSectionData(*SymtabSection); 553 SymtabSD.setAlignment(is64Bit() ? 8 : 4); 554 SymbolTableIndex = addToSectionTable(SymtabSection); 555 556 // The string table must be emitted first because we need the index 557 // into the string table for all the symbol names. 558 559 SymbolTableWriter Writer(*this, is64Bit()); 560 561 uint64_t Padding = OffsetToAlignment(OS.tell(), SymtabSD.getAlignment()); 562 WriteZeros(Padding); 563 564 uint64_t SecStart = OS.tell(); 565 566 // The first entry is the undefined symbol entry. 567 Writer.writeSymbol(0, 0, 0, 0, 0, 0, false); 568 569 for (unsigned i = 0, e = FileSymbolData.size(); i != e; ++i) { 570 Writer.writeSymbol(FileSymbolData[i], ELF::STT_FILE | ELF::STB_LOCAL, 0, 0, 571 ELF::STV_DEFAULT, ELF::SHN_ABS, true); 572 } 573 574 // Write the symbol table entries. 575 LastLocalSymbolIndex = FileSymbolData.size() + LocalSymbolData.size() + 1; 576 577 for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i) { 578 ELFSymbolData &MSD = LocalSymbolData[i]; 579 WriteSymbol(Writer, MSD, Layout); 580 } 581 582 for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i) { 583 ELFSymbolData &MSD = ExternalSymbolData[i]; 584 MCSymbolData &Data = *MSD.SymbolData; 585 assert(((Data.getFlags() & ELF_STB_Global) || 586 (Data.getFlags() & ELF_STB_Weak)) && 587 "External symbol requires STB_GLOBAL or STB_WEAK flag"); 588 WriteSymbol(Writer, MSD, Layout); 589 if (MCELF::GetBinding(Data) == ELF::STB_LOCAL) 590 LastLocalSymbolIndex++; 591 } 592 593 for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i) { 594 ELFSymbolData &MSD = UndefinedSymbolData[i]; 595 MCSymbolData &Data = *MSD.SymbolData; 596 WriteSymbol(Writer, MSD, Layout); 597 if (MCELF::GetBinding(Data) == ELF::STB_LOCAL) 598 LastLocalSymbolIndex++; 599 } 600 601 uint64_t SecEnd = OS.tell(); 602 SectionOffsets[SymtabSection] = std::make_pair(SecStart, SecEnd); 603 604 ArrayRef<uint32_t> ShndxIndexes = Writer.getShndxIndexes(); 605 if (ShndxIndexes.empty()) 606 return; 607 608 SecStart = OS.tell(); 609 const MCSectionELF *SymtabShndxSection = 610 Ctx.getELFSection(".symtab_shndxr", ELF::SHT_SYMTAB_SHNDX, 0, 4, ""); 611 addToSectionTable(SymtabShndxSection); 612 MCSectionData *SymtabShndxSD = 613 &Asm.getOrCreateSectionData(*SymtabShndxSection); 614 SymtabShndxSD->setAlignment(4); 615 for (uint32_t Index : ShndxIndexes) 616 write(Index); 617 SecEnd = OS.tell(); 618 SectionOffsets[SymtabShndxSection] = std::make_pair(SecStart, SecEnd); 619 } 620 621 // It is always valid to create a relocation with a symbol. It is preferable 622 // to use a relocation with a section if that is possible. Using the section 623 // allows us to omit some local symbols from the symbol table. 624 bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm, 625 const MCSymbolRefExpr *RefA, 626 const MCSymbolData *SD, 627 uint64_t C, 628 unsigned Type) const { 629 // A PCRel relocation to an absolute value has no symbol (or section). We 630 // represent that with a relocation to a null section. 631 if (!RefA) 632 return false; 633 634 MCSymbolRefExpr::VariantKind Kind = RefA->getKind(); 635 switch (Kind) { 636 default: 637 break; 638 // The .odp creation emits a relocation against the symbol ".TOC." which 639 // create a R_PPC64_TOC relocation. However the relocation symbol name 640 // in final object creation should be NULL, since the symbol does not 641 // really exist, it is just the reference to TOC base for the current 642 // object file. Since the symbol is undefined, returning false results 643 // in a relocation with a null section which is the desired result. 644 case MCSymbolRefExpr::VK_PPC_TOCBASE: 645 return false; 646 647 // These VariantKind cause the relocation to refer to something other than 648 // the symbol itself, like a linker generated table. Since the address of 649 // symbol is not relevant, we cannot replace the symbol with the 650 // section and patch the difference in the addend. 651 case MCSymbolRefExpr::VK_GOT: 652 case MCSymbolRefExpr::VK_PLT: 653 case MCSymbolRefExpr::VK_GOTPCREL: 654 case MCSymbolRefExpr::VK_Mips_GOT: 655 case MCSymbolRefExpr::VK_PPC_GOT_LO: 656 case MCSymbolRefExpr::VK_PPC_GOT_HI: 657 case MCSymbolRefExpr::VK_PPC_GOT_HA: 658 return true; 659 } 660 661 // An undefined symbol is not in any section, so the relocation has to point 662 // to the symbol itself. 663 const MCSymbol &Sym = SD->getSymbol(); 664 if (Sym.isUndefined()) 665 return true; 666 667 unsigned Binding = MCELF::GetBinding(*SD); 668 switch(Binding) { 669 default: 670 llvm_unreachable("Invalid Binding"); 671 case ELF::STB_LOCAL: 672 break; 673 case ELF::STB_WEAK: 674 // If the symbol is weak, it might be overridden by a symbol in another 675 // file. The relocation has to point to the symbol so that the linker 676 // can update it. 677 return true; 678 case ELF::STB_GLOBAL: 679 // Global ELF symbols can be preempted by the dynamic linker. The relocation 680 // has to point to the symbol for a reason analogous to the STB_WEAK case. 681 return true; 682 } 683 684 // If a relocation points to a mergeable section, we have to be careful. 685 // If the offset is zero, a relocation with the section will encode the 686 // same information. With a non-zero offset, the situation is different. 687 // For example, a relocation can point 42 bytes past the end of a string. 688 // If we change such a relocation to use the section, the linker would think 689 // that it pointed to another string and subtracting 42 at runtime will 690 // produce the wrong value. 691 auto &Sec = cast<MCSectionELF>(Sym.getSection()); 692 unsigned Flags = Sec.getFlags(); 693 if (Flags & ELF::SHF_MERGE) { 694 if (C != 0) 695 return true; 696 697 // It looks like gold has a bug (http://sourceware.org/PR16794) and can 698 // only handle section relocations to mergeable sections if using RELA. 699 if (!hasRelocationAddend()) 700 return true; 701 } 702 703 // Most TLS relocations use a got, so they need the symbol. Even those that 704 // are just an offset (@tpoff), require a symbol in gold versions before 705 // 5efeedf61e4fe720fd3e9a08e6c91c10abb66d42 (2014-09-26) which fixed 706 // http://sourceware.org/PR16773. 707 if (Flags & ELF::SHF_TLS) 708 return true; 709 710 // If the symbol is a thumb function the final relocation must set the lowest 711 // bit. With a symbol that is done by just having the symbol have that bit 712 // set, so we would lose the bit if we relocated with the section. 713 // FIXME: We could use the section but add the bit to the relocation value. 714 if (Asm.isThumbFunc(&Sym)) 715 return true; 716 717 if (TargetObjectWriter->needsRelocateWithSymbol(*SD, Type)) 718 return true; 719 return false; 720 } 721 722 static const MCSymbol *getWeakRef(const MCSymbolRefExpr &Ref) { 723 const MCSymbol &Sym = Ref.getSymbol(); 724 725 if (Ref.getKind() == MCSymbolRefExpr::VK_WEAKREF) 726 return &Sym; 727 728 if (!Sym.isVariable()) 729 return nullptr; 730 731 const MCExpr *Expr = Sym.getVariableValue(); 732 const auto *Inner = dyn_cast<MCSymbolRefExpr>(Expr); 733 if (!Inner) 734 return nullptr; 735 736 if (Inner->getKind() == MCSymbolRefExpr::VK_WEAKREF) 737 return &Inner->getSymbol(); 738 return nullptr; 739 } 740 741 // True if the assembler knows nothing about the final value of the symbol. 742 // This doesn't cover the comdat issues, since in those cases the assembler 743 // can at least know that all symbols in the section will move together. 744 static bool isWeak(const MCSymbolData &D) { 745 if (MCELF::GetType(D) == ELF::STT_GNU_IFUNC) 746 return true; 747 748 switch (MCELF::GetBinding(D)) { 749 default: 750 llvm_unreachable("Unknown binding"); 751 case ELF::STB_LOCAL: 752 return false; 753 case ELF::STB_GLOBAL: 754 return false; 755 case ELF::STB_WEAK: 756 case ELF::STB_GNU_UNIQUE: 757 return true; 758 } 759 } 760 761 void ELFObjectWriter::RecordRelocation(MCAssembler &Asm, 762 const MCAsmLayout &Layout, 763 const MCFragment *Fragment, 764 const MCFixup &Fixup, MCValue Target, 765 bool &IsPCRel, uint64_t &FixedValue) { 766 const MCSectionData *FixupSectionD = Fragment->getParent(); 767 const MCSectionELF &FixupSection = 768 cast<MCSectionELF>(FixupSectionD->getSection()); 769 uint64_t C = Target.getConstant(); 770 uint64_t FixupOffset = Layout.getFragmentOffset(Fragment) + Fixup.getOffset(); 771 772 if (const MCSymbolRefExpr *RefB = Target.getSymB()) { 773 assert(RefB->getKind() == MCSymbolRefExpr::VK_None && 774 "Should not have constructed this"); 775 776 // Let A, B and C being the components of Target and R be the location of 777 // the fixup. If the fixup is not pcrel, we want to compute (A - B + C). 778 // If it is pcrel, we want to compute (A - B + C - R). 779 780 // In general, ELF has no relocations for -B. It can only represent (A + C) 781 // or (A + C - R). If B = R + K and the relocation is not pcrel, we can 782 // replace B to implement it: (A - R - K + C) 783 if (IsPCRel) 784 Asm.getContext().FatalError( 785 Fixup.getLoc(), 786 "No relocation available to represent this relative expression"); 787 788 const MCSymbol &SymB = RefB->getSymbol(); 789 790 if (SymB.isUndefined()) 791 Asm.getContext().FatalError( 792 Fixup.getLoc(), 793 Twine("symbol '") + SymB.getName() + 794 "' can not be undefined in a subtraction expression"); 795 796 assert(!SymB.isAbsolute() && "Should have been folded"); 797 const MCSection &SecB = SymB.getSection(); 798 if (&SecB != &FixupSection) 799 Asm.getContext().FatalError( 800 Fixup.getLoc(), "Cannot represent a difference across sections"); 801 802 const MCSymbolData &SymBD = Asm.getSymbolData(SymB); 803 if (::isWeak(SymBD)) 804 Asm.getContext().FatalError( 805 Fixup.getLoc(), "Cannot represent a subtraction with a weak symbol"); 806 807 uint64_t SymBOffset = Layout.getSymbolOffset(&SymBD); 808 uint64_t K = SymBOffset - FixupOffset; 809 IsPCRel = true; 810 C -= K; 811 } 812 813 // We either rejected the fixup or folded B into C at this point. 814 const MCSymbolRefExpr *RefA = Target.getSymA(); 815 const MCSymbol *SymA = RefA ? &RefA->getSymbol() : nullptr; 816 const MCSymbolData *SymAD = SymA ? &Asm.getSymbolData(*SymA) : nullptr; 817 818 unsigned Type = GetRelocType(Target, Fixup, IsPCRel); 819 bool RelocateWithSymbol = shouldRelocateWithSymbol(Asm, RefA, SymAD, C, Type); 820 if (!RelocateWithSymbol && SymA && !SymA->isUndefined()) 821 C += Layout.getSymbolOffset(SymAD); 822 823 uint64_t Addend = 0; 824 if (hasRelocationAddend()) { 825 Addend = C; 826 C = 0; 827 } 828 829 FixedValue = C; 830 831 // FIXME: What is this!?!? 832 MCSymbolRefExpr::VariantKind Modifier = 833 RefA ? RefA->getKind() : MCSymbolRefExpr::VK_None; 834 if (RelocNeedsGOT(Modifier)) 835 NeedsGOT = true; 836 837 if (!RelocateWithSymbol) { 838 const MCSection *SecA = 839 (SymA && !SymA->isUndefined()) ? &SymA->getSection() : nullptr; 840 auto *ELFSec = cast_or_null<MCSectionELF>(SecA); 841 MCSymbol *SectionSymbol = 842 ELFSec ? Asm.getContext().getOrCreateSectionSymbol(*ELFSec) 843 : nullptr; 844 ELFRelocationEntry Rec(FixupOffset, SectionSymbol, Type, Addend); 845 Relocations[&FixupSection].push_back(Rec); 846 return; 847 } 848 849 if (SymA) { 850 if (const MCSymbol *R = Renames.lookup(SymA)) 851 SymA = R; 852 853 if (const MCSymbol *WeakRef = getWeakRef(*RefA)) 854 WeakrefUsedInReloc.insert(WeakRef); 855 else 856 UsedInReloc.insert(SymA); 857 } 858 ELFRelocationEntry Rec(FixupOffset, SymA, Type, Addend); 859 Relocations[&FixupSection].push_back(Rec); 860 return; 861 } 862 863 864 uint64_t 865 ELFObjectWriter::getSymbolIndexInSymbolTable(const MCAssembler &Asm, 866 const MCSymbol *S) { 867 const MCSymbolData &SD = Asm.getSymbolData(*S); 868 return SD.getIndex(); 869 } 870 871 bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout, 872 const MCSymbolData &Data, bool Used, 873 bool Renamed) { 874 const MCSymbol &Symbol = Data.getSymbol(); 875 if (Symbol.isVariable()) { 876 const MCExpr *Expr = Symbol.getVariableValue(); 877 if (const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Expr)) { 878 if (Ref->getKind() == MCSymbolRefExpr::VK_WEAKREF) 879 return false; 880 } 881 } 882 883 if (Used) 884 return true; 885 886 if (Renamed) 887 return false; 888 889 if (Symbol.getName() == "_GLOBAL_OFFSET_TABLE_") 890 return true; 891 892 if (Symbol.isVariable()) { 893 const MCSymbol *Base = Layout.getBaseSymbol(Symbol); 894 if (Base && Base->isUndefined()) 895 return false; 896 } 897 898 bool IsGlobal = MCELF::GetBinding(Data) == ELF::STB_GLOBAL; 899 if (!Symbol.isVariable() && Symbol.isUndefined() && !IsGlobal) 900 return false; 901 902 if (Symbol.isTemporary()) 903 return false; 904 905 return true; 906 } 907 908 bool ELFObjectWriter::isLocal(const MCSymbolData &Data, bool isUsedInReloc) { 909 if (Data.isExternal()) 910 return false; 911 912 const MCSymbol &Symbol = Data.getSymbol(); 913 if (Symbol.isDefined()) 914 return true; 915 916 if (isUsedInReloc) 917 return false; 918 919 return true; 920 } 921 922 void ELFObjectWriter::computeSymbolTable( 923 MCAssembler &Asm, const MCAsmLayout &Layout, 924 const SectionIndexMapTy &SectionIndexMap, 925 const RevGroupMapTy &RevGroupMap) { 926 // FIXME: Is this the correct place to do this? 927 // FIXME: Why is an undefined reference to _GLOBAL_OFFSET_TABLE_ needed? 928 if (NeedsGOT) { 929 StringRef Name = "_GLOBAL_OFFSET_TABLE_"; 930 MCSymbol *Sym = Asm.getContext().GetOrCreateSymbol(Name); 931 MCSymbolData &Data = Asm.getOrCreateSymbolData(*Sym); 932 Data.setExternal(true); 933 MCELF::SetBinding(Data, ELF::STB_GLOBAL); 934 } 935 936 // Add the data for the symbols. 937 for (MCSymbolData &SD : Asm.symbols()) { 938 const MCSymbol &Symbol = SD.getSymbol(); 939 940 bool Used = UsedInReloc.count(&Symbol); 941 bool WeakrefUsed = WeakrefUsedInReloc.count(&Symbol); 942 bool isSignature = RevGroupMap.count(&Symbol); 943 944 if (!isInSymtab(Layout, SD, 945 Used || WeakrefUsed || isSignature, 946 Renames.count(&Symbol))) 947 continue; 948 949 ELFSymbolData MSD; 950 MSD.SymbolData = &SD; 951 const MCSymbol *BaseSymbol = Layout.getBaseSymbol(Symbol); 952 953 // Undefined symbols are global, but this is the first place we 954 // are able to set it. 955 bool Local = isLocal(SD, Used); 956 if (!Local && MCELF::GetBinding(SD) == ELF::STB_LOCAL) { 957 assert(BaseSymbol); 958 MCSymbolData &BaseData = Asm.getSymbolData(*BaseSymbol); 959 MCELF::SetBinding(SD, ELF::STB_GLOBAL); 960 MCELF::SetBinding(BaseData, ELF::STB_GLOBAL); 961 } 962 963 if (!BaseSymbol) { 964 MSD.SectionIndex = ELF::SHN_ABS; 965 } else if (SD.isCommon()) { 966 assert(!Local); 967 MSD.SectionIndex = ELF::SHN_COMMON; 968 } else if (BaseSymbol->isUndefined()) { 969 if (isSignature && !Used) 970 MSD.SectionIndex = RevGroupMap.lookup(&Symbol); 971 else 972 MSD.SectionIndex = ELF::SHN_UNDEF; 973 if (!Used && WeakrefUsed) 974 MCELF::SetBinding(SD, ELF::STB_WEAK); 975 } else { 976 const MCSectionELF &Section = 977 static_cast<const MCSectionELF&>(BaseSymbol->getSection()); 978 MSD.SectionIndex = SectionIndexMap.lookup(&Section); 979 assert(MSD.SectionIndex && "Invalid section index!"); 980 } 981 982 // The @@@ in symbol version is replaced with @ in undefined symbols and @@ 983 // in defined ones. 984 // 985 // FIXME: All name handling should be done before we get to the writer, 986 // including dealing with GNU-style version suffixes. Fixing this isn't 987 // trivial. 988 // 989 // We thus have to be careful to not perform the symbol version replacement 990 // blindly: 991 // 992 // The ELF format is used on Windows by the MCJIT engine. Thus, on 993 // Windows, the ELFObjectWriter can encounter symbols mangled using the MS 994 // Visual Studio C++ name mangling scheme. Symbols mangled using the MSVC 995 // C++ name mangling can legally have "@@@" as a sub-string. In that case, 996 // the EFLObjectWriter should not interpret the "@@@" sub-string as 997 // specifying GNU-style symbol versioning. The ELFObjectWriter therefore 998 // checks for the MSVC C++ name mangling prefix which is either "?", "@?", 999 // "__imp_?" or "__imp_@?". 1000 // 1001 // It would have been interesting to perform the MS mangling prefix check 1002 // only when the target triple is of the form *-pc-windows-elf. But, it 1003 // seems that this information is not easily accessible from the 1004 // ELFObjectWriter. 1005 StringRef Name = Symbol.getName(); 1006 if (!Name.startswith("?") && !Name.startswith("@?") && 1007 !Name.startswith("__imp_?") && !Name.startswith("__imp_@?")) { 1008 // This symbol isn't following the MSVC C++ name mangling convention. We 1009 // can thus safely interpret the @@@ in symbol names as specifying symbol 1010 // versioning. 1011 SmallString<32> Buf; 1012 size_t Pos = Name.find("@@@"); 1013 if (Pos != StringRef::npos) { 1014 Buf += Name.substr(0, Pos); 1015 unsigned Skip = MSD.SectionIndex == ELF::SHN_UNDEF ? 2 : 1; 1016 Buf += Name.substr(Pos + Skip); 1017 Name = Buf; 1018 } 1019 } 1020 1021 // Sections have their own string table 1022 if (MCELF::GetType(SD) != ELF::STT_SECTION) 1023 MSD.Name = StrTabBuilder.add(Name); 1024 1025 if (MSD.SectionIndex == ELF::SHN_UNDEF) 1026 UndefinedSymbolData.push_back(MSD); 1027 else if (Local) 1028 LocalSymbolData.push_back(MSD); 1029 else 1030 ExternalSymbolData.push_back(MSD); 1031 } 1032 1033 for (auto i = Asm.file_names_begin(), e = Asm.file_names_end(); i != e; ++i) 1034 StrTabBuilder.add(*i); 1035 1036 StrTabBuilder.finalize(StringTableBuilder::ELF); 1037 1038 for (auto i = Asm.file_names_begin(), e = Asm.file_names_end(); i != e; ++i) 1039 FileSymbolData.push_back(StrTabBuilder.getOffset(*i)); 1040 1041 for (ELFSymbolData &MSD : LocalSymbolData) 1042 MSD.StringIndex = MCELF::GetType(*MSD.SymbolData) == ELF::STT_SECTION 1043 ? 0 1044 : StrTabBuilder.getOffset(MSD.Name); 1045 for (ELFSymbolData &MSD : ExternalSymbolData) 1046 MSD.StringIndex = StrTabBuilder.getOffset(MSD.Name); 1047 for (ELFSymbolData& MSD : UndefinedSymbolData) 1048 MSD.StringIndex = StrTabBuilder.getOffset(MSD.Name); 1049 1050 // Symbols are required to be in lexicographic order. 1051 array_pod_sort(LocalSymbolData.begin(), LocalSymbolData.end()); 1052 array_pod_sort(ExternalSymbolData.begin(), ExternalSymbolData.end()); 1053 array_pod_sort(UndefinedSymbolData.begin(), UndefinedSymbolData.end()); 1054 1055 // Set the symbol indices. Local symbols must come before all other 1056 // symbols with non-local bindings. 1057 unsigned Index = FileSymbolData.size() + 1; 1058 for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i) 1059 LocalSymbolData[i].SymbolData->setIndex(Index++); 1060 1061 for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i) 1062 ExternalSymbolData[i].SymbolData->setIndex(Index++); 1063 for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i) 1064 UndefinedSymbolData[i].SymbolData->setIndex(Index++); 1065 } 1066 1067 const MCSectionELF * 1068 ELFObjectWriter::createRelocationSection(MCAssembler &Asm, 1069 const MCSectionELF &Sec) { 1070 if (Relocations[&Sec].empty()) 1071 return nullptr; 1072 1073 MCContext &Ctx = Asm.getContext(); 1074 const StringRef SectionName = Sec.getSectionName(); 1075 std::string RelaSectionName = hasRelocationAddend() ? ".rela" : ".rel"; 1076 RelaSectionName += SectionName; 1077 1078 unsigned EntrySize; 1079 if (hasRelocationAddend()) 1080 EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rela) : sizeof(ELF::Elf32_Rela); 1081 else 1082 EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rel) : sizeof(ELF::Elf32_Rel); 1083 1084 unsigned Flags = 0; 1085 if (Sec.getFlags() & ELF::SHF_GROUP) 1086 Flags = ELF::SHF_GROUP; 1087 1088 const MCSectionELF *RelaSection = Ctx.createELFRelSection( 1089 RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL, 1090 Flags, EntrySize, Sec.getGroup(), &Sec); 1091 MCSectionData &RelSD = Asm.getOrCreateSectionData(*RelaSection); 1092 RelSD.setAlignment(is64Bit() ? 8 : 4); 1093 return RelaSection; 1094 } 1095 1096 static SmallVector<char, 128> 1097 getUncompressedData(const MCAsmLayout &Layout, 1098 const MCSectionData::FragmentListType &Fragments) { 1099 SmallVector<char, 128> UncompressedData; 1100 for (const MCFragment &F : Fragments) { 1101 const SmallVectorImpl<char> *Contents; 1102 switch (F.getKind()) { 1103 case MCFragment::FT_Data: 1104 Contents = &cast<MCDataFragment>(F).getContents(); 1105 break; 1106 case MCFragment::FT_Dwarf: 1107 Contents = &cast<MCDwarfLineAddrFragment>(F).getContents(); 1108 break; 1109 case MCFragment::FT_DwarfFrame: 1110 Contents = &cast<MCDwarfCallFrameFragment>(F).getContents(); 1111 break; 1112 default: 1113 llvm_unreachable( 1114 "Not expecting any other fragment types in a debug_* section"); 1115 } 1116 UncompressedData.append(Contents->begin(), Contents->end()); 1117 } 1118 return UncompressedData; 1119 } 1120 1121 // Include the debug info compression header: 1122 // "ZLIB" followed by 8 bytes representing the uncompressed size of the section, 1123 // useful for consumers to preallocate a buffer to decompress into. 1124 static bool 1125 prependCompressionHeader(uint64_t Size, 1126 SmallVectorImpl<char> &CompressedContents) { 1127 const StringRef Magic = "ZLIB"; 1128 if (Size <= Magic.size() + sizeof(Size) + CompressedContents.size()) 1129 return false; 1130 if (sys::IsLittleEndianHost) 1131 sys::swapByteOrder(Size); 1132 CompressedContents.insert(CompressedContents.begin(), 1133 Magic.size() + sizeof(Size), 0); 1134 std::copy(Magic.begin(), Magic.end(), CompressedContents.begin()); 1135 std::copy(reinterpret_cast<char *>(&Size), 1136 reinterpret_cast<char *>(&Size + 1), 1137 CompressedContents.begin() + Magic.size()); 1138 return true; 1139 } 1140 1141 void ELFObjectWriter::writeSectionData(const MCAssembler &Asm, 1142 const MCSectionData &SD, 1143 const MCAsmLayout &Layout) { 1144 const MCSectionELF &Section = 1145 static_cast<const MCSectionELF &>(SD.getSection()); 1146 StringRef SectionName = Section.getSectionName(); 1147 1148 // Compressing debug_frame requires handling alignment fragments which is 1149 // more work (possibly generalizing MCAssembler.cpp:writeFragment to allow 1150 // for writing to arbitrary buffers) for little benefit. 1151 if (!Asm.getContext().getAsmInfo()->compressDebugSections() || 1152 !SectionName.startswith(".debug_") || SectionName == ".debug_frame") { 1153 Asm.writeSectionData(&SD, Layout); 1154 return; 1155 } 1156 1157 // Gather the uncompressed data from all the fragments. 1158 const MCSectionData::FragmentListType &Fragments = SD.getFragmentList(); 1159 SmallVector<char, 128> UncompressedData = 1160 getUncompressedData(Layout, Fragments); 1161 1162 SmallVector<char, 128> CompressedContents; 1163 zlib::Status Success = zlib::compress( 1164 StringRef(UncompressedData.data(), UncompressedData.size()), 1165 CompressedContents); 1166 if (Success != zlib::StatusOK) { 1167 Asm.writeSectionData(&SD, Layout); 1168 return; 1169 } 1170 1171 if (!prependCompressionHeader(UncompressedData.size(), CompressedContents)) { 1172 Asm.writeSectionData(&SD, Layout); 1173 return; 1174 } 1175 Asm.getContext().renameELFSection(&Section, 1176 (".z" + SectionName.drop_front(1)).str()); 1177 OS << CompressedContents; 1178 } 1179 1180 void ELFObjectWriter::WriteSecHdrEntry(uint32_t Name, uint32_t Type, 1181 uint64_t Flags, uint64_t Address, 1182 uint64_t Offset, uint64_t Size, 1183 uint32_t Link, uint32_t Info, 1184 uint64_t Alignment, 1185 uint64_t EntrySize) { 1186 Write32(Name); // sh_name: index into string table 1187 Write32(Type); // sh_type 1188 WriteWord(Flags); // sh_flags 1189 WriteWord(Address); // sh_addr 1190 WriteWord(Offset); // sh_offset 1191 WriteWord(Size); // sh_size 1192 Write32(Link); // sh_link 1193 Write32(Info); // sh_info 1194 WriteWord(Alignment); // sh_addralign 1195 WriteWord(EntrySize); // sh_entsize 1196 } 1197 1198 void ELFObjectWriter::writeRelocations(const MCAssembler &Asm, 1199 const MCSectionELF &Sec) { 1200 std::vector<ELFRelocationEntry> &Relocs = Relocations[&Sec]; 1201 1202 // Sort the relocation entries. Most targets just sort by Offset, but some 1203 // (e.g., MIPS) have additional constraints. 1204 TargetObjectWriter->sortRelocs(Asm, Relocs); 1205 1206 for (unsigned i = 0, e = Relocs.size(); i != e; ++i) { 1207 const ELFRelocationEntry &Entry = Relocs[e - i - 1]; 1208 unsigned Index = 1209 Entry.Symbol ? getSymbolIndexInSymbolTable(Asm, Entry.Symbol) : 0; 1210 1211 if (is64Bit()) { 1212 write(Entry.Offset); 1213 if (TargetObjectWriter->isN64()) { 1214 write(uint32_t(Index)); 1215 1216 write(TargetObjectWriter->getRSsym(Entry.Type)); 1217 write(TargetObjectWriter->getRType3(Entry.Type)); 1218 write(TargetObjectWriter->getRType2(Entry.Type)); 1219 write(TargetObjectWriter->getRType(Entry.Type)); 1220 } else { 1221 struct ELF::Elf64_Rela ERE64; 1222 ERE64.setSymbolAndType(Index, Entry.Type); 1223 write(ERE64.r_info); 1224 } 1225 if (hasRelocationAddend()) 1226 write(Entry.Addend); 1227 } else { 1228 write(uint32_t(Entry.Offset)); 1229 1230 struct ELF::Elf32_Rela ERE32; 1231 ERE32.setSymbolAndType(Index, Entry.Type); 1232 write(ERE32.r_info); 1233 1234 if (hasRelocationAddend()) 1235 write(uint32_t(Entry.Addend)); 1236 } 1237 } 1238 } 1239 1240 const MCSectionELF *ELFObjectWriter::createSectionHeaderStringTable() { 1241 const MCSectionELF *ShstrtabSection = SectionTable[ShstrtabIndex - 1]; 1242 ShStrTabBuilder.finalize(StringTableBuilder::ELF); 1243 OS << ShStrTabBuilder.data(); 1244 return ShstrtabSection; 1245 } 1246 1247 const MCSectionELF *ELFObjectWriter::createStringTable(MCContext &Ctx) { 1248 const MCSectionELF *StrtabSection = 1249 Ctx.getELFSection(".strtab", ELF::SHT_STRTAB, 0); 1250 StringTableIndex = addToSectionTable(StrtabSection); 1251 OS << StrTabBuilder.data(); 1252 return StrtabSection; 1253 } 1254 1255 void ELFObjectWriter::writeSection(MCAssembler &Asm, 1256 const SectionIndexMapTy &SectionIndexMap, 1257 uint32_t GroupSymbolIndex, 1258 uint64_t Offset, uint64_t Size, 1259 uint64_t Alignment, 1260 const MCSectionELF &Section) { 1261 uint64_t sh_link = 0; 1262 uint64_t sh_info = 0; 1263 1264 switch(Section.getType()) { 1265 default: 1266 // Nothing to do. 1267 break; 1268 1269 case ELF::SHT_DYNAMIC: 1270 llvm_unreachable("SHT_DYNAMIC in a relocatable object"); 1271 1272 case ELF::SHT_REL: 1273 case ELF::SHT_RELA: { 1274 sh_link = SymbolTableIndex; 1275 assert(sh_link && ".symtab not found"); 1276 const MCSectionELF *InfoSection = Section.getAssociatedSection(); 1277 sh_info = SectionIndexMap.lookup(InfoSection); 1278 break; 1279 } 1280 1281 case ELF::SHT_SYMTAB: 1282 case ELF::SHT_DYNSYM: 1283 sh_link = StringTableIndex; 1284 sh_info = LastLocalSymbolIndex; 1285 break; 1286 1287 case ELF::SHT_SYMTAB_SHNDX: 1288 sh_link = SymbolTableIndex; 1289 break; 1290 1291 case ELF::SHT_GROUP: 1292 sh_link = SymbolTableIndex; 1293 sh_info = GroupSymbolIndex; 1294 break; 1295 } 1296 1297 if (TargetObjectWriter->getEMachine() == ELF::EM_ARM && 1298 Section.getType() == ELF::SHT_ARM_EXIDX) 1299 sh_link = SectionIndexMap.lookup(Section.getAssociatedSection()); 1300 1301 WriteSecHdrEntry(ShStrTabBuilder.getOffset(Section.getSectionName()), 1302 Section.getType(), 1303 Section.getFlags(), 0, Offset, Size, sh_link, sh_info, 1304 Alignment, Section.getEntrySize()); 1305 } 1306 1307 void ELFObjectWriter::writeSectionHeader( 1308 MCAssembler &Asm, const MCAsmLayout &Layout, 1309 const SectionIndexMapTy &SectionIndexMap, 1310 const SectionOffsetsTy &SectionOffsets) { 1311 const unsigned NumSections = SectionTable.size(); 1312 1313 // Null section first. 1314 uint64_t FirstSectionSize = 1315 (NumSections + 1) >= ELF::SHN_LORESERVE ? NumSections + 1 : 0; 1316 WriteSecHdrEntry(0, 0, 0, 0, 0, FirstSectionSize, 0, 0, 0, 0); 1317 1318 for (const MCSectionELF *Section : SectionTable) { 1319 const MCSectionData &SD = Asm.getOrCreateSectionData(*Section); 1320 uint32_t GroupSymbolIndex; 1321 unsigned Type = Section->getType(); 1322 if (Type != ELF::SHT_GROUP) 1323 GroupSymbolIndex = 0; 1324 else 1325 GroupSymbolIndex = getSymbolIndexInSymbolTable(Asm, Section->getGroup()); 1326 1327 const std::pair<uint64_t, uint64_t> &Offsets = 1328 SectionOffsets.find(Section)->second; 1329 uint64_t Size = Type == ELF::SHT_NOBITS ? Layout.getSectionAddressSize(&SD) 1330 : Offsets.second - Offsets.first; 1331 1332 writeSection(Asm, SectionIndexMap, GroupSymbolIndex, Offsets.first, Size, 1333 SD.getAlignment(), *Section); 1334 } 1335 } 1336 1337 void ELFObjectWriter::WriteObject(MCAssembler &Asm, 1338 const MCAsmLayout &Layout) { 1339 MCContext &Ctx = Asm.getContext(); 1340 const MCSectionELF *ShstrtabSection = 1341 Ctx.getELFSection(".shstrtab", ELF::SHT_STRTAB, 0); 1342 ShstrtabIndex = addToSectionTable(ShstrtabSection); 1343 1344 RevGroupMapTy RevGroupMap; 1345 SectionIndexMapTy SectionIndexMap; 1346 1347 std::map<const MCSymbol *, std::vector<const MCSectionELF *>> GroupMembers; 1348 1349 // Write out the ELF header ... 1350 writeHeader(Asm); 1351 1352 // ... then the sections ... 1353 SectionOffsetsTy SectionOffsets; 1354 bool ComputedSymtab = false; 1355 for (const MCSectionData &SD : Asm) { 1356 const MCSectionELF &Section = 1357 static_cast<const MCSectionELF &>(SD.getSection()); 1358 1359 uint64_t Padding = OffsetToAlignment(OS.tell(), SD.getAlignment()); 1360 WriteZeros(Padding); 1361 1362 // Remember the offset into the file for this section. 1363 uint64_t SecStart = OS.tell(); 1364 1365 const MCSymbol *SignatureSymbol = Section.getGroup(); 1366 unsigned Type = Section.getType(); 1367 if (Type == ELF::SHT_GROUP) { 1368 assert(SignatureSymbol); 1369 write(uint32_t(ELF::GRP_COMDAT)); 1370 for (const MCSectionELF *Member : GroupMembers[SignatureSymbol]) { 1371 uint32_t SecIndex = SectionIndexMap.lookup(Member); 1372 write(SecIndex); 1373 } 1374 } else if (Type == ELF::SHT_REL || Type == ELF::SHT_RELA) { 1375 if (!ComputedSymtab) { 1376 // Compute symbol table information. 1377 computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap); 1378 ComputedSymtab = true; 1379 } 1380 writeRelocations(Asm, *Section.getAssociatedSection()); 1381 } else { 1382 writeSectionData(Asm, SD, Layout); 1383 } 1384 1385 uint64_t SecEnd = OS.tell(); 1386 SectionOffsets[&Section] = std::make_pair(SecStart, SecEnd); 1387 1388 if (Type == ELF::SHT_GROUP || Type == ELF::SHT_REL || Type == ELF::SHT_RELA) 1389 continue; 1390 1391 const MCSectionELF *RelSection = createRelocationSection(Asm, Section); 1392 1393 if (SignatureSymbol) { 1394 Asm.getOrCreateSymbolData(*SignatureSymbol); 1395 unsigned &GroupIdx = RevGroupMap[SignatureSymbol]; 1396 if (!GroupIdx) { 1397 const MCSectionELF *Group = Ctx.createELFGroupSection(SignatureSymbol); 1398 GroupIdx = addToSectionTable(Group); 1399 MCSectionData *GroupD = &Asm.getOrCreateSectionData(*Group); 1400 GroupD->setAlignment(4); 1401 } 1402 GroupMembers[SignatureSymbol].push_back(&Section); 1403 if (RelSection) 1404 GroupMembers[SignatureSymbol].push_back(RelSection); 1405 } 1406 1407 SectionIndexMap[&Section] = addToSectionTable(&Section); 1408 if (RelSection) 1409 SectionIndexMap[RelSection] = addToSectionTable(RelSection); 1410 } 1411 1412 if (!ComputedSymtab) { 1413 // Compute symbol table information. 1414 computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap); 1415 ComputedSymtab = true; 1416 } 1417 1418 WriteSymbolTable(Asm, Layout, SectionOffsets); 1419 1420 { 1421 uint64_t SecStart = OS.tell(); 1422 const MCSectionELF *Sec = createStringTable(Ctx); 1423 uint64_t SecEnd = OS.tell(); 1424 SectionOffsets[Sec] = std::make_pair(SecStart, SecEnd); 1425 } 1426 1427 { 1428 uint64_t SecStart = OS.tell(); 1429 const MCSectionELF *Sec = createSectionHeaderStringTable(); 1430 uint64_t SecEnd = OS.tell(); 1431 SectionOffsets[Sec] = std::make_pair(SecStart, SecEnd); 1432 } 1433 1434 uint64_t NaturalAlignment = is64Bit() ? 8 : 4; 1435 uint64_t Padding = OffsetToAlignment(OS.tell(), NaturalAlignment); 1436 WriteZeros(Padding); 1437 1438 const unsigned SectionHeaderOffset = OS.tell(); 1439 1440 // ... then the section header table ... 1441 writeSectionHeader(Asm, Layout, SectionIndexMap, SectionOffsets); 1442 1443 uint16_t NumSections = (SectionTable.size() + 1 >= ELF::SHN_LORESERVE) 1444 ? (uint16_t)ELF::SHN_UNDEF 1445 : SectionTable.size() + 1; 1446 if (sys::IsLittleEndianHost != IsLittleEndian) 1447 sys::swapByteOrder(NumSections); 1448 unsigned NumSectionsOffset; 1449 1450 if (is64Bit()) { 1451 uint64_t Val = SectionHeaderOffset; 1452 if (sys::IsLittleEndianHost != IsLittleEndian) 1453 sys::swapByteOrder(Val); 1454 OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val), 1455 offsetof(ELF::Elf64_Ehdr, e_shoff)); 1456 NumSectionsOffset = offsetof(ELF::Elf64_Ehdr, e_shnum); 1457 } else { 1458 uint32_t Val = SectionHeaderOffset; 1459 if (sys::IsLittleEndianHost != IsLittleEndian) 1460 sys::swapByteOrder(Val); 1461 OS.pwrite(reinterpret_cast<char *>(&Val), sizeof(Val), 1462 offsetof(ELF::Elf32_Ehdr, e_shoff)); 1463 NumSectionsOffset = offsetof(ELF::Elf32_Ehdr, e_shnum); 1464 } 1465 OS.pwrite(reinterpret_cast<char *>(&NumSections), sizeof(NumSections), 1466 NumSectionsOffset); 1467 } 1468 1469 bool ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl( 1470 const MCAssembler &Asm, const MCSymbolData &DataA, const MCFragment &FB, 1471 bool InSet, bool IsPCRel) const { 1472 if (IsPCRel) { 1473 assert(!InSet); 1474 if (::isWeak(DataA)) 1475 return false; 1476 } 1477 return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(Asm, DataA, FB, 1478 InSet, IsPCRel); 1479 } 1480 1481 bool ELFObjectWriter::isWeak(const MCSymbolData &SD) const { 1482 if (::isWeak(SD)) 1483 return true; 1484 1485 // It is invalid to replace a reference to a global in a comdat 1486 // with a reference to a local since out of comdat references 1487 // to a local are forbidden. 1488 // We could try to return false for more cases, like the reference 1489 // being in the same comdat or Sym being an alias to another global, 1490 // but it is not clear if it is worth the effort. 1491 if (MCELF::GetBinding(SD) != ELF::STB_GLOBAL) 1492 return false; 1493 1494 const MCSymbol &Sym = SD.getSymbol(); 1495 if (!Sym.isInSection()) 1496 return false; 1497 1498 const auto &Sec = cast<MCSectionELF>(Sym.getSection()); 1499 return Sec.getGroup(); 1500 } 1501 1502 MCObjectWriter *llvm::createELFObjectWriter(MCELFObjectTargetWriter *MOTW, 1503 raw_pwrite_stream &OS, 1504 bool IsLittleEndian) { 1505 return new ELFObjectWriter(MOTW, OS, IsLittleEndian); 1506 } 1507