1 //===- Object.cpp ---------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "Object.h" 10 #include "llvm-objcopy.h" 11 #include "llvm/ADT/ArrayRef.h" 12 #include "llvm/ADT/STLExtras.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/ADT/Twine.h" 15 #include "llvm/ADT/iterator_range.h" 16 #include "llvm/BinaryFormat/ELF.h" 17 #include "llvm/MC/MCTargetOptions.h" 18 #include "llvm/Object/ELFObjectFile.h" 19 #include "llvm/Support/Compression.h" 20 #include "llvm/Support/Endian.h" 21 #include "llvm/Support/ErrorHandling.h" 22 #include "llvm/Support/FileOutputBuffer.h" 23 #include "llvm/Support/Path.h" 24 #include <algorithm> 25 #include <cstddef> 26 #include <cstdint> 27 #include <iterator> 28 #include <unordered_set> 29 #include <utility> 30 #include <vector> 31 32 namespace llvm { 33 namespace objcopy { 34 namespace elf { 35 36 using namespace object; 37 using namespace ELF; 38 39 template <class ELFT> void ELFWriter<ELFT>::writePhdr(const Segment &Seg) { 40 uint8_t *B = Buf.getBufferStart() + Obj.ProgramHdrSegment.Offset + 41 Seg.Index * sizeof(Elf_Phdr); 42 Elf_Phdr &Phdr = *reinterpret_cast<Elf_Phdr *>(B); 43 Phdr.p_type = Seg.Type; 44 Phdr.p_flags = Seg.Flags; 45 Phdr.p_offset = Seg.Offset; 46 Phdr.p_vaddr = Seg.VAddr; 47 Phdr.p_paddr = Seg.PAddr; 48 Phdr.p_filesz = Seg.FileSize; 49 Phdr.p_memsz = Seg.MemSize; 50 Phdr.p_align = Seg.Align; 51 } 52 53 Error SectionBase::removeSectionReferences( 54 bool AllowBrokenLinks, 55 function_ref<bool(const SectionBase *)> ToRemove) { 56 return Error::success(); 57 } 58 59 Error SectionBase::removeSymbols(function_ref<bool(const Symbol &)> ToRemove) { 60 return Error::success(); 61 } 62 63 void SectionBase::initialize(SectionTableRef SecTable) {} 64 void SectionBase::finalize() {} 65 void SectionBase::markSymbols() {} 66 void SectionBase::replaceSectionReferences( 67 const DenseMap<SectionBase *, SectionBase *> &) {} 68 69 template <class ELFT> void ELFWriter<ELFT>::writeShdr(const SectionBase &Sec) { 70 uint8_t *B = Buf.getBufferStart() + Sec.HeaderOffset; 71 Elf_Shdr &Shdr = *reinterpret_cast<Elf_Shdr *>(B); 72 Shdr.sh_name = Sec.NameIndex; 73 Shdr.sh_type = Sec.Type; 74 Shdr.sh_flags = Sec.Flags; 75 Shdr.sh_addr = Sec.Addr; 76 Shdr.sh_offset = Sec.Offset; 77 Shdr.sh_size = Sec.Size; 78 Shdr.sh_link = Sec.Link; 79 Shdr.sh_info = Sec.Info; 80 Shdr.sh_addralign = Sec.Align; 81 Shdr.sh_entsize = Sec.EntrySize; 82 } 83 84 template <class ELFT> void ELFSectionSizer<ELFT>::visit(Section &Sec) {} 85 86 template <class ELFT> 87 void ELFSectionSizer<ELFT>::visit(OwnedDataSection &Sec) {} 88 89 template <class ELFT> 90 void ELFSectionSizer<ELFT>::visit(StringTableSection &Sec) {} 91 92 template <class ELFT> 93 void ELFSectionSizer<ELFT>::visit(DynamicRelocationSection &Sec) {} 94 95 template <class ELFT> 96 void ELFSectionSizer<ELFT>::visit(SymbolTableSection &Sec) { 97 Sec.EntrySize = sizeof(Elf_Sym); 98 Sec.Size = Sec.Symbols.size() * Sec.EntrySize; 99 // Align to the largest field in Elf_Sym. 100 Sec.Align = ELFT::Is64Bits ? sizeof(Elf_Xword) : sizeof(Elf_Word); 101 } 102 103 template <class ELFT> 104 void ELFSectionSizer<ELFT>::visit(RelocationSection &Sec) { 105 Sec.EntrySize = Sec.Type == SHT_REL ? sizeof(Elf_Rel) : sizeof(Elf_Rela); 106 Sec.Size = Sec.Relocations.size() * Sec.EntrySize; 107 // Align to the largest field in Elf_Rel(a). 108 Sec.Align = ELFT::Is64Bits ? sizeof(Elf_Xword) : sizeof(Elf_Word); 109 } 110 111 template <class ELFT> 112 void ELFSectionSizer<ELFT>::visit(GnuDebugLinkSection &Sec) {} 113 114 template <class ELFT> void ELFSectionSizer<ELFT>::visit(GroupSection &Sec) {} 115 116 template <class ELFT> 117 void ELFSectionSizer<ELFT>::visit(SectionIndexSection &Sec) {} 118 119 template <class ELFT> 120 void ELFSectionSizer<ELFT>::visit(CompressedSection &Sec) {} 121 122 template <class ELFT> 123 void ELFSectionSizer<ELFT>::visit(DecompressedSection &Sec) {} 124 125 void BinarySectionWriter::visit(const SectionIndexSection &Sec) { 126 error("cannot write symbol section index table '" + Sec.Name + "' "); 127 } 128 129 void BinarySectionWriter::visit(const SymbolTableSection &Sec) { 130 error("cannot write symbol table '" + Sec.Name + "' out to binary"); 131 } 132 133 void BinarySectionWriter::visit(const RelocationSection &Sec) { 134 error("cannot write relocation section '" + Sec.Name + "' out to binary"); 135 } 136 137 void BinarySectionWriter::visit(const GnuDebugLinkSection &Sec) { 138 error("cannot write '" + Sec.Name + "' out to binary"); 139 } 140 141 void BinarySectionWriter::visit(const GroupSection &Sec) { 142 error("cannot write '" + Sec.Name + "' out to binary"); 143 } 144 145 void SectionWriter::visit(const Section &Sec) { 146 if (Sec.Type != SHT_NOBITS) 147 llvm::copy(Sec.Contents, Out.getBufferStart() + Sec.Offset); 148 } 149 150 static bool addressOverflows32bit(uint64_t Addr) { 151 // Sign extended 32 bit addresses (e.g 0xFFFFFFFF80000000) are ok 152 return Addr > UINT32_MAX && Addr + 0x80000000 > UINT32_MAX; 153 } 154 155 template <class T> static T checkedGetHex(StringRef S) { 156 T Value; 157 bool Fail = S.getAsInteger(16, Value); 158 assert(!Fail); 159 (void)Fail; 160 return Value; 161 } 162 163 // Fills exactly Len bytes of buffer with hexadecimal characters 164 // representing value 'X' 165 template <class T, class Iterator> 166 static Iterator utohexstr(T X, Iterator It, size_t Len) { 167 // Fill range with '0' 168 std::fill(It, It + Len, '0'); 169 170 for (long I = Len - 1; I >= 0; --I) { 171 unsigned char Mod = static_cast<unsigned char>(X) & 15; 172 *(It + I) = hexdigit(Mod, false); 173 X >>= 4; 174 } 175 assert(X == 0); 176 return It + Len; 177 } 178 179 uint8_t IHexRecord::getChecksum(StringRef S) { 180 assert((S.size() & 1) == 0); 181 uint8_t Checksum = 0; 182 while (!S.empty()) { 183 Checksum += checkedGetHex<uint8_t>(S.take_front(2)); 184 S = S.drop_front(2); 185 } 186 return -Checksum; 187 } 188 189 IHexLineData IHexRecord::getLine(uint8_t Type, uint16_t Addr, 190 ArrayRef<uint8_t> Data) { 191 IHexLineData Line(getLineLength(Data.size())); 192 assert(Line.size()); 193 auto Iter = Line.begin(); 194 *Iter++ = ':'; 195 Iter = utohexstr(Data.size(), Iter, 2); 196 Iter = utohexstr(Addr, Iter, 4); 197 Iter = utohexstr(Type, Iter, 2); 198 for (uint8_t X : Data) 199 Iter = utohexstr(X, Iter, 2); 200 StringRef S(Line.data() + 1, std::distance(Line.begin() + 1, Iter)); 201 Iter = utohexstr(getChecksum(S), Iter, 2); 202 *Iter++ = '\r'; 203 *Iter++ = '\n'; 204 assert(Iter == Line.end()); 205 return Line; 206 } 207 208 static Error checkRecord(const IHexRecord &R) { 209 switch (R.Type) { 210 case IHexRecord::Data: 211 if (R.HexData.size() == 0) 212 return createStringError( 213 errc::invalid_argument, 214 "zero data length is not allowed for data records"); 215 break; 216 case IHexRecord::EndOfFile: 217 break; 218 case IHexRecord::SegmentAddr: 219 // 20-bit segment address. Data length must be 2 bytes 220 // (4 bytes in hex) 221 if (R.HexData.size() != 4) 222 return createStringError( 223 errc::invalid_argument, 224 "segment address data should be 2 bytes in size"); 225 break; 226 case IHexRecord::StartAddr80x86: 227 case IHexRecord::StartAddr: 228 if (R.HexData.size() != 8) 229 return createStringError(errc::invalid_argument, 230 "start address data should be 4 bytes in size"); 231 // According to Intel HEX specification '03' record 232 // only specifies the code address within the 20-bit 233 // segmented address space of the 8086/80186. This 234 // means 12 high order bits should be zeroes. 235 if (R.Type == IHexRecord::StartAddr80x86 && 236 R.HexData.take_front(3) != "000") 237 return createStringError(errc::invalid_argument, 238 "start address exceeds 20 bit for 80x86"); 239 break; 240 case IHexRecord::ExtendedAddr: 241 // 16-31 bits of linear base address 242 if (R.HexData.size() != 4) 243 return createStringError( 244 errc::invalid_argument, 245 "extended address data should be 2 bytes in size"); 246 break; 247 default: 248 // Unknown record type 249 return createStringError(errc::invalid_argument, "unknown record type: %u", 250 static_cast<unsigned>(R.Type)); 251 } 252 return Error::success(); 253 } 254 255 // Checks that IHEX line contains valid characters. 256 // This allows converting hexadecimal data to integers 257 // without extra verification. 258 static Error checkChars(StringRef Line) { 259 assert(!Line.empty()); 260 if (Line[0] != ':') 261 return createStringError(errc::invalid_argument, 262 "missing ':' in the beginning of line."); 263 264 for (size_t Pos = 1; Pos < Line.size(); ++Pos) 265 if (hexDigitValue(Line[Pos]) == -1U) 266 return createStringError(errc::invalid_argument, 267 "invalid character at position %zu.", Pos + 1); 268 return Error::success(); 269 } 270 271 Expected<IHexRecord> IHexRecord::parse(StringRef Line) { 272 assert(!Line.empty()); 273 274 // ':' + Length + Address + Type + Checksum with empty data ':LLAAAATTCC' 275 if (Line.size() < 11) 276 return createStringError(errc::invalid_argument, 277 "line is too short: %zu chars.", Line.size()); 278 279 if (Error E = checkChars(Line)) 280 return std::move(E); 281 282 IHexRecord Rec; 283 size_t DataLen = checkedGetHex<uint8_t>(Line.substr(1, 2)); 284 if (Line.size() != getLength(DataLen)) 285 return createStringError(errc::invalid_argument, 286 "invalid line length %zu (should be %zu)", 287 Line.size(), getLength(DataLen)); 288 289 Rec.Addr = checkedGetHex<uint16_t>(Line.substr(3, 4)); 290 Rec.Type = checkedGetHex<uint8_t>(Line.substr(7, 2)); 291 Rec.HexData = Line.substr(9, DataLen * 2); 292 293 if (getChecksum(Line.drop_front(1)) != 0) 294 return createStringError(errc::invalid_argument, "incorrect checksum."); 295 if (Error E = checkRecord(Rec)) 296 return std::move(E); 297 return Rec; 298 } 299 300 static uint64_t sectionPhysicalAddr(const SectionBase *Sec) { 301 Segment *Seg = Sec->ParentSegment; 302 if (Seg && Seg->Type != ELF::PT_LOAD) 303 Seg = nullptr; 304 return Seg ? Seg->PAddr + Sec->OriginalOffset - Seg->OriginalOffset 305 : Sec->Addr; 306 } 307 308 void IHexSectionWriterBase::writeSection(const SectionBase *Sec, 309 ArrayRef<uint8_t> Data) { 310 assert(Data.size() == Sec->Size); 311 const uint32_t ChunkSize = 16; 312 uint32_t Addr = sectionPhysicalAddr(Sec) & 0xFFFFFFFFU; 313 while (!Data.empty()) { 314 uint64_t DataSize = std::min<uint64_t>(Data.size(), ChunkSize); 315 if (Addr > SegmentAddr + BaseAddr + 0xFFFFU) { 316 if (Addr > 0xFFFFFU) { 317 // Write extended address record, zeroing segment address 318 // if needed. 319 if (SegmentAddr != 0) 320 SegmentAddr = writeSegmentAddr(0U); 321 BaseAddr = writeBaseAddr(Addr); 322 } else { 323 // We can still remain 16-bit 324 SegmentAddr = writeSegmentAddr(Addr); 325 } 326 } 327 uint64_t SegOffset = Addr - BaseAddr - SegmentAddr; 328 assert(SegOffset <= 0xFFFFU); 329 DataSize = std::min(DataSize, 0x10000U - SegOffset); 330 writeData(0, SegOffset, Data.take_front(DataSize)); 331 Addr += DataSize; 332 Data = Data.drop_front(DataSize); 333 } 334 } 335 336 uint64_t IHexSectionWriterBase::writeSegmentAddr(uint64_t Addr) { 337 assert(Addr <= 0xFFFFFU); 338 uint8_t Data[] = {static_cast<uint8_t>((Addr & 0xF0000U) >> 12), 0}; 339 writeData(2, 0, Data); 340 return Addr & 0xF0000U; 341 } 342 343 uint64_t IHexSectionWriterBase::writeBaseAddr(uint64_t Addr) { 344 assert(Addr <= 0xFFFFFFFFU); 345 uint64_t Base = Addr & 0xFFFF0000U; 346 uint8_t Data[] = {static_cast<uint8_t>(Base >> 24), 347 static_cast<uint8_t>((Base >> 16) & 0xFF)}; 348 writeData(4, 0, Data); 349 return Base; 350 } 351 352 void IHexSectionWriterBase::writeData(uint8_t Type, uint16_t Addr, 353 ArrayRef<uint8_t> Data) { 354 Offset += IHexRecord::getLineLength(Data.size()); 355 } 356 357 void IHexSectionWriterBase::visit(const Section &Sec) { 358 writeSection(&Sec, Sec.Contents); 359 } 360 361 void IHexSectionWriterBase::visit(const OwnedDataSection &Sec) { 362 writeSection(&Sec, Sec.Data); 363 } 364 365 void IHexSectionWriterBase::visit(const StringTableSection &Sec) { 366 // Check that sizer has already done its work 367 assert(Sec.Size == Sec.StrTabBuilder.getSize()); 368 // We are free to pass an invalid pointer to writeSection as long 369 // as we don't actually write any data. The real writer class has 370 // to override this method . 371 writeSection(&Sec, {nullptr, static_cast<size_t>(Sec.Size)}); 372 } 373 374 void IHexSectionWriterBase::visit(const DynamicRelocationSection &Sec) { 375 writeSection(&Sec, Sec.Contents); 376 } 377 378 void IHexSectionWriter::writeData(uint8_t Type, uint16_t Addr, 379 ArrayRef<uint8_t> Data) { 380 IHexLineData HexData = IHexRecord::getLine(Type, Addr, Data); 381 memcpy(Out.getBufferStart() + Offset, HexData.data(), HexData.size()); 382 Offset += HexData.size(); 383 } 384 385 void IHexSectionWriter::visit(const StringTableSection &Sec) { 386 assert(Sec.Size == Sec.StrTabBuilder.getSize()); 387 std::vector<uint8_t> Data(Sec.Size); 388 Sec.StrTabBuilder.write(Data.data()); 389 writeSection(&Sec, Data); 390 } 391 392 void Section::accept(SectionVisitor &Visitor) const { Visitor.visit(*this); } 393 394 void Section::accept(MutableSectionVisitor &Visitor) { Visitor.visit(*this); } 395 396 void SectionWriter::visit(const OwnedDataSection &Sec) { 397 llvm::copy(Sec.Data, Out.getBufferStart() + Sec.Offset); 398 } 399 400 static constexpr std::array<uint8_t, 4> ZlibGnuMagic = {{'Z', 'L', 'I', 'B'}}; 401 402 static bool isDataGnuCompressed(ArrayRef<uint8_t> Data) { 403 return Data.size() > ZlibGnuMagic.size() && 404 std::equal(ZlibGnuMagic.begin(), ZlibGnuMagic.end(), Data.data()); 405 } 406 407 template <class ELFT> 408 static std::tuple<uint64_t, uint64_t> 409 getDecompressedSizeAndAlignment(ArrayRef<uint8_t> Data) { 410 const bool IsGnuDebug = isDataGnuCompressed(Data); 411 const uint64_t DecompressedSize = 412 IsGnuDebug 413 ? support::endian::read64be(Data.data() + ZlibGnuMagic.size()) 414 : reinterpret_cast<const Elf_Chdr_Impl<ELFT> *>(Data.data())->ch_size; 415 const uint64_t DecompressedAlign = 416 IsGnuDebug ? 1 417 : reinterpret_cast<const Elf_Chdr_Impl<ELFT> *>(Data.data()) 418 ->ch_addralign; 419 420 return std::make_tuple(DecompressedSize, DecompressedAlign); 421 } 422 423 template <class ELFT> 424 void ELFSectionWriter<ELFT>::visit(const DecompressedSection &Sec) { 425 const size_t DataOffset = isDataGnuCompressed(Sec.OriginalData) 426 ? (ZlibGnuMagic.size() + sizeof(Sec.Size)) 427 : sizeof(Elf_Chdr_Impl<ELFT>); 428 429 StringRef CompressedContent( 430 reinterpret_cast<const char *>(Sec.OriginalData.data()) + DataOffset, 431 Sec.OriginalData.size() - DataOffset); 432 433 SmallVector<char, 128> DecompressedContent; 434 if (Error E = zlib::uncompress(CompressedContent, DecompressedContent, 435 static_cast<size_t>(Sec.Size))) 436 reportError(Sec.Name, std::move(E)); 437 438 uint8_t *Buf = Out.getBufferStart() + Sec.Offset; 439 std::copy(DecompressedContent.begin(), DecompressedContent.end(), Buf); 440 } 441 442 void BinarySectionWriter::visit(const DecompressedSection &Sec) { 443 error("cannot write compressed section '" + Sec.Name + "' "); 444 } 445 446 void DecompressedSection::accept(SectionVisitor &Visitor) const { 447 Visitor.visit(*this); 448 } 449 450 void DecompressedSection::accept(MutableSectionVisitor &Visitor) { 451 Visitor.visit(*this); 452 } 453 454 void OwnedDataSection::accept(SectionVisitor &Visitor) const { 455 Visitor.visit(*this); 456 } 457 458 void OwnedDataSection::accept(MutableSectionVisitor &Visitor) { 459 Visitor.visit(*this); 460 } 461 462 void OwnedDataSection::appendHexData(StringRef HexData) { 463 assert((HexData.size() & 1) == 0); 464 while (!HexData.empty()) { 465 Data.push_back(checkedGetHex<uint8_t>(HexData.take_front(2))); 466 HexData = HexData.drop_front(2); 467 } 468 Size = Data.size(); 469 } 470 471 void BinarySectionWriter::visit(const CompressedSection &Sec) { 472 error("cannot write compressed section '" + Sec.Name + "' "); 473 } 474 475 template <class ELFT> 476 void ELFSectionWriter<ELFT>::visit(const CompressedSection &Sec) { 477 uint8_t *Buf = Out.getBufferStart() + Sec.Offset; 478 if (Sec.CompressionType == DebugCompressionType::None) { 479 std::copy(Sec.OriginalData.begin(), Sec.OriginalData.end(), Buf); 480 return; 481 } 482 483 if (Sec.CompressionType == DebugCompressionType::GNU) { 484 const char *Magic = "ZLIB"; 485 memcpy(Buf, Magic, strlen(Magic)); 486 Buf += strlen(Magic); 487 const uint64_t DecompressedSize = 488 support::endian::read64be(&Sec.DecompressedSize); 489 memcpy(Buf, &DecompressedSize, sizeof(DecompressedSize)); 490 Buf += sizeof(DecompressedSize); 491 } else { 492 Elf_Chdr_Impl<ELFT> Chdr; 493 Chdr.ch_type = ELF::ELFCOMPRESS_ZLIB; 494 Chdr.ch_size = Sec.DecompressedSize; 495 Chdr.ch_addralign = Sec.DecompressedAlign; 496 memcpy(Buf, &Chdr, sizeof(Chdr)); 497 Buf += sizeof(Chdr); 498 } 499 500 std::copy(Sec.CompressedData.begin(), Sec.CompressedData.end(), Buf); 501 } 502 503 CompressedSection::CompressedSection(const SectionBase &Sec, 504 DebugCompressionType CompressionType) 505 : SectionBase(Sec), CompressionType(CompressionType), 506 DecompressedSize(Sec.OriginalData.size()), DecompressedAlign(Sec.Align) { 507 if (Error E = zlib::compress( 508 StringRef(reinterpret_cast<const char *>(OriginalData.data()), 509 OriginalData.size()), 510 CompressedData)) 511 reportError(Name, std::move(E)); 512 513 size_t ChdrSize; 514 if (CompressionType == DebugCompressionType::GNU) { 515 Name = ".z" + Sec.Name.substr(1); 516 ChdrSize = sizeof("ZLIB") - 1 + sizeof(uint64_t); 517 } else { 518 Flags |= ELF::SHF_COMPRESSED; 519 ChdrSize = 520 std::max(std::max(sizeof(object::Elf_Chdr_Impl<object::ELF64LE>), 521 sizeof(object::Elf_Chdr_Impl<object::ELF64BE>)), 522 std::max(sizeof(object::Elf_Chdr_Impl<object::ELF32LE>), 523 sizeof(object::Elf_Chdr_Impl<object::ELF32BE>))); 524 } 525 Size = ChdrSize + CompressedData.size(); 526 Align = 8; 527 } 528 529 CompressedSection::CompressedSection(ArrayRef<uint8_t> CompressedData, 530 uint64_t DecompressedSize, 531 uint64_t DecompressedAlign) 532 : CompressionType(DebugCompressionType::None), 533 DecompressedSize(DecompressedSize), DecompressedAlign(DecompressedAlign) { 534 OriginalData = CompressedData; 535 } 536 537 void CompressedSection::accept(SectionVisitor &Visitor) const { 538 Visitor.visit(*this); 539 } 540 541 void CompressedSection::accept(MutableSectionVisitor &Visitor) { 542 Visitor.visit(*this); 543 } 544 545 void StringTableSection::addString(StringRef Name) { StrTabBuilder.add(Name); } 546 547 uint32_t StringTableSection::findIndex(StringRef Name) const { 548 return StrTabBuilder.getOffset(Name); 549 } 550 551 void StringTableSection::prepareForLayout() { 552 StrTabBuilder.finalize(); 553 Size = StrTabBuilder.getSize(); 554 } 555 556 void SectionWriter::visit(const StringTableSection &Sec) { 557 Sec.StrTabBuilder.write(Out.getBufferStart() + Sec.Offset); 558 } 559 560 void StringTableSection::accept(SectionVisitor &Visitor) const { 561 Visitor.visit(*this); 562 } 563 564 void StringTableSection::accept(MutableSectionVisitor &Visitor) { 565 Visitor.visit(*this); 566 } 567 568 template <class ELFT> 569 void ELFSectionWriter<ELFT>::visit(const SectionIndexSection &Sec) { 570 uint8_t *Buf = Out.getBufferStart() + Sec.Offset; 571 llvm::copy(Sec.Indexes, reinterpret_cast<Elf_Word *>(Buf)); 572 } 573 574 void SectionIndexSection::initialize(SectionTableRef SecTable) { 575 Size = 0; 576 setSymTab(SecTable.getSectionOfType<SymbolTableSection>( 577 Link, 578 "Link field value " + Twine(Link) + " in section " + Name + " is invalid", 579 "Link field value " + Twine(Link) + " in section " + Name + 580 " is not a symbol table")); 581 Symbols->setShndxTable(this); 582 } 583 584 void SectionIndexSection::finalize() { Link = Symbols->Index; } 585 586 void SectionIndexSection::accept(SectionVisitor &Visitor) const { 587 Visitor.visit(*this); 588 } 589 590 void SectionIndexSection::accept(MutableSectionVisitor &Visitor) { 591 Visitor.visit(*this); 592 } 593 594 static bool isValidReservedSectionIndex(uint16_t Index, uint16_t Machine) { 595 switch (Index) { 596 case SHN_ABS: 597 case SHN_COMMON: 598 return true; 599 } 600 601 if (Machine == EM_AMDGPU) { 602 return Index == SHN_AMDGPU_LDS; 603 } 604 605 if (Machine == EM_HEXAGON) { 606 switch (Index) { 607 case SHN_HEXAGON_SCOMMON: 608 case SHN_HEXAGON_SCOMMON_2: 609 case SHN_HEXAGON_SCOMMON_4: 610 case SHN_HEXAGON_SCOMMON_8: 611 return true; 612 } 613 } 614 return false; 615 } 616 617 // Large indexes force us to clarify exactly what this function should do. This 618 // function should return the value that will appear in st_shndx when written 619 // out. 620 uint16_t Symbol::getShndx() const { 621 if (DefinedIn != nullptr) { 622 if (DefinedIn->Index >= SHN_LORESERVE) 623 return SHN_XINDEX; 624 return DefinedIn->Index; 625 } 626 627 if (ShndxType == SYMBOL_SIMPLE_INDEX) { 628 // This means that we don't have a defined section but we do need to 629 // output a legitimate section index. 630 return SHN_UNDEF; 631 } 632 633 assert(ShndxType == SYMBOL_ABS || ShndxType == SYMBOL_COMMON || 634 (ShndxType >= SYMBOL_LOPROC && ShndxType <= SYMBOL_HIPROC) || 635 (ShndxType >= SYMBOL_LOOS && ShndxType <= SYMBOL_HIOS)); 636 return static_cast<uint16_t>(ShndxType); 637 } 638 639 bool Symbol::isCommon() const { return getShndx() == SHN_COMMON; } 640 641 void SymbolTableSection::assignIndices() { 642 uint32_t Index = 0; 643 for (auto &Sym : Symbols) 644 Sym->Index = Index++; 645 } 646 647 void SymbolTableSection::addSymbol(Twine Name, uint8_t Bind, uint8_t Type, 648 SectionBase *DefinedIn, uint64_t Value, 649 uint8_t Visibility, uint16_t Shndx, 650 uint64_t SymbolSize) { 651 Symbol Sym; 652 Sym.Name = Name.str(); 653 Sym.Binding = Bind; 654 Sym.Type = Type; 655 Sym.DefinedIn = DefinedIn; 656 if (DefinedIn != nullptr) 657 DefinedIn->HasSymbol = true; 658 if (DefinedIn == nullptr) { 659 if (Shndx >= SHN_LORESERVE) 660 Sym.ShndxType = static_cast<SymbolShndxType>(Shndx); 661 else 662 Sym.ShndxType = SYMBOL_SIMPLE_INDEX; 663 } 664 Sym.Value = Value; 665 Sym.Visibility = Visibility; 666 Sym.Size = SymbolSize; 667 Sym.Index = Symbols.size(); 668 Symbols.emplace_back(std::make_unique<Symbol>(Sym)); 669 Size += this->EntrySize; 670 } 671 672 Error SymbolTableSection::removeSectionReferences( 673 bool AllowBrokenLinks, 674 function_ref<bool(const SectionBase *)> ToRemove) { 675 if (ToRemove(SectionIndexTable)) 676 SectionIndexTable = nullptr; 677 if (ToRemove(SymbolNames)) { 678 if (!AllowBrokenLinks) 679 return createStringError( 680 llvm::errc::invalid_argument, 681 "string table '%s' cannot be removed because it is " 682 "referenced by the symbol table '%s'", 683 SymbolNames->Name.data(), this->Name.data()); 684 SymbolNames = nullptr; 685 } 686 return removeSymbols( 687 [ToRemove](const Symbol &Sym) { return ToRemove(Sym.DefinedIn); }); 688 } 689 690 void SymbolTableSection::updateSymbols(function_ref<void(Symbol &)> Callable) { 691 std::for_each(std::begin(Symbols) + 1, std::end(Symbols), 692 [Callable](SymPtr &Sym) { Callable(*Sym); }); 693 std::stable_partition( 694 std::begin(Symbols), std::end(Symbols), 695 [](const SymPtr &Sym) { return Sym->Binding == STB_LOCAL; }); 696 assignIndices(); 697 } 698 699 Error SymbolTableSection::removeSymbols( 700 function_ref<bool(const Symbol &)> ToRemove) { 701 Symbols.erase( 702 std::remove_if(std::begin(Symbols) + 1, std::end(Symbols), 703 [ToRemove](const SymPtr &Sym) { return ToRemove(*Sym); }), 704 std::end(Symbols)); 705 Size = Symbols.size() * EntrySize; 706 assignIndices(); 707 return Error::success(); 708 } 709 710 void SymbolTableSection::replaceSectionReferences( 711 const DenseMap<SectionBase *, SectionBase *> &FromTo) { 712 for (std::unique_ptr<Symbol> &Sym : Symbols) 713 if (SectionBase *To = FromTo.lookup(Sym->DefinedIn)) 714 Sym->DefinedIn = To; 715 } 716 717 void SymbolTableSection::initialize(SectionTableRef SecTable) { 718 Size = 0; 719 setStrTab(SecTable.getSectionOfType<StringTableSection>( 720 Link, 721 "Symbol table has link index of " + Twine(Link) + 722 " which is not a valid index", 723 "Symbol table has link index of " + Twine(Link) + 724 " which is not a string table")); 725 } 726 727 void SymbolTableSection::finalize() { 728 uint32_t MaxLocalIndex = 0; 729 for (std::unique_ptr<Symbol> &Sym : Symbols) { 730 Sym->NameIndex = 731 SymbolNames == nullptr ? 0 : SymbolNames->findIndex(Sym->Name); 732 if (Sym->Binding == STB_LOCAL) 733 MaxLocalIndex = std::max(MaxLocalIndex, Sym->Index); 734 } 735 // Now we need to set the Link and Info fields. 736 Link = SymbolNames == nullptr ? 0 : SymbolNames->Index; 737 Info = MaxLocalIndex + 1; 738 } 739 740 void SymbolTableSection::prepareForLayout() { 741 // Reserve proper amount of space in section index table, so we can 742 // layout sections correctly. We will fill the table with correct 743 // indexes later in fillShdnxTable. 744 if (SectionIndexTable) 745 SectionIndexTable->reserve(Symbols.size()); 746 747 // Add all of our strings to SymbolNames so that SymbolNames has the right 748 // size before layout is decided. 749 // If the symbol names section has been removed, don't try to add strings to 750 // the table. 751 if (SymbolNames != nullptr) 752 for (std::unique_ptr<Symbol> &Sym : Symbols) 753 SymbolNames->addString(Sym->Name); 754 } 755 756 void SymbolTableSection::fillShndxTable() { 757 if (SectionIndexTable == nullptr) 758 return; 759 // Fill section index table with real section indexes. This function must 760 // be called after assignOffsets. 761 for (const std::unique_ptr<Symbol> &Sym : Symbols) { 762 if (Sym->DefinedIn != nullptr && Sym->DefinedIn->Index >= SHN_LORESERVE) 763 SectionIndexTable->addIndex(Sym->DefinedIn->Index); 764 else 765 SectionIndexTable->addIndex(SHN_UNDEF); 766 } 767 } 768 769 const Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) const { 770 if (Symbols.size() <= Index) 771 error("invalid symbol index: " + Twine(Index)); 772 return Symbols[Index].get(); 773 } 774 775 Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) { 776 return const_cast<Symbol *>( 777 static_cast<const SymbolTableSection *>(this)->getSymbolByIndex(Index)); 778 } 779 780 template <class ELFT> 781 void ELFSectionWriter<ELFT>::visit(const SymbolTableSection &Sec) { 782 Elf_Sym *Sym = reinterpret_cast<Elf_Sym *>(Out.getBufferStart() + Sec.Offset); 783 // Loop though symbols setting each entry of the symbol table. 784 for (const std::unique_ptr<Symbol> &Symbol : Sec.Symbols) { 785 Sym->st_name = Symbol->NameIndex; 786 Sym->st_value = Symbol->Value; 787 Sym->st_size = Symbol->Size; 788 Sym->st_other = Symbol->Visibility; 789 Sym->setBinding(Symbol->Binding); 790 Sym->setType(Symbol->Type); 791 Sym->st_shndx = Symbol->getShndx(); 792 ++Sym; 793 } 794 } 795 796 void SymbolTableSection::accept(SectionVisitor &Visitor) const { 797 Visitor.visit(*this); 798 } 799 800 void SymbolTableSection::accept(MutableSectionVisitor &Visitor) { 801 Visitor.visit(*this); 802 } 803 804 Error RelocationSection::removeSectionReferences( 805 bool AllowBrokenLinks, 806 function_ref<bool(const SectionBase *)> ToRemove) { 807 if (ToRemove(Symbols)) { 808 if (!AllowBrokenLinks) 809 return createStringError( 810 llvm::errc::invalid_argument, 811 "symbol table '%s' cannot be removed because it is " 812 "referenced by the relocation section '%s'", 813 Symbols->Name.data(), this->Name.data()); 814 Symbols = nullptr; 815 } 816 817 for (const Relocation &R : Relocations) { 818 if (!R.RelocSymbol->DefinedIn || !ToRemove(R.RelocSymbol->DefinedIn)) 819 continue; 820 return createStringError(llvm::errc::invalid_argument, 821 "section '%s' cannot be removed: (%s+0x%" PRIx64 822 ") has relocation against symbol '%s'", 823 R.RelocSymbol->DefinedIn->Name.data(), 824 SecToApplyRel->Name.data(), R.Offset, 825 R.RelocSymbol->Name.c_str()); 826 } 827 828 return Error::success(); 829 } 830 831 template <class SymTabType> 832 void RelocSectionWithSymtabBase<SymTabType>::initialize( 833 SectionTableRef SecTable) { 834 if (Link != SHN_UNDEF) 835 setSymTab(SecTable.getSectionOfType<SymTabType>( 836 Link, 837 "Link field value " + Twine(Link) + " in section " + Name + 838 " is invalid", 839 "Link field value " + Twine(Link) + " in section " + Name + 840 " is not a symbol table")); 841 842 if (Info != SHN_UNDEF) 843 setSection(SecTable.getSection(Info, "Info field value " + Twine(Info) + 844 " in section " + Name + 845 " is invalid")); 846 else 847 setSection(nullptr); 848 } 849 850 template <class SymTabType> 851 void RelocSectionWithSymtabBase<SymTabType>::finalize() { 852 this->Link = Symbols ? Symbols->Index : 0; 853 854 if (SecToApplyRel != nullptr) 855 this->Info = SecToApplyRel->Index; 856 } 857 858 template <class ELFT> 859 static void setAddend(Elf_Rel_Impl<ELFT, false> &Rel, uint64_t Addend) {} 860 861 template <class ELFT> 862 static void setAddend(Elf_Rel_Impl<ELFT, true> &Rela, uint64_t Addend) { 863 Rela.r_addend = Addend; 864 } 865 866 template <class RelRange, class T> 867 static void writeRel(const RelRange &Relocations, T *Buf) { 868 for (const auto &Reloc : Relocations) { 869 Buf->r_offset = Reloc.Offset; 870 setAddend(*Buf, Reloc.Addend); 871 Buf->setSymbolAndType(Reloc.RelocSymbol->Index, Reloc.Type, false); 872 ++Buf; 873 } 874 } 875 876 template <class ELFT> 877 void ELFSectionWriter<ELFT>::visit(const RelocationSection &Sec) { 878 uint8_t *Buf = Out.getBufferStart() + Sec.Offset; 879 if (Sec.Type == SHT_REL) 880 writeRel(Sec.Relocations, reinterpret_cast<Elf_Rel *>(Buf)); 881 else 882 writeRel(Sec.Relocations, reinterpret_cast<Elf_Rela *>(Buf)); 883 } 884 885 void RelocationSection::accept(SectionVisitor &Visitor) const { 886 Visitor.visit(*this); 887 } 888 889 void RelocationSection::accept(MutableSectionVisitor &Visitor) { 890 Visitor.visit(*this); 891 } 892 893 Error RelocationSection::removeSymbols( 894 function_ref<bool(const Symbol &)> ToRemove) { 895 for (const Relocation &Reloc : Relocations) 896 if (ToRemove(*Reloc.RelocSymbol)) 897 return createStringError( 898 llvm::errc::invalid_argument, 899 "not stripping symbol '%s' because it is named in a relocation", 900 Reloc.RelocSymbol->Name.data()); 901 return Error::success(); 902 } 903 904 void RelocationSection::markSymbols() { 905 for (const Relocation &Reloc : Relocations) 906 Reloc.RelocSymbol->Referenced = true; 907 } 908 909 void RelocationSection::replaceSectionReferences( 910 const DenseMap<SectionBase *, SectionBase *> &FromTo) { 911 // Update the target section if it was replaced. 912 if (SectionBase *To = FromTo.lookup(SecToApplyRel)) 913 SecToApplyRel = To; 914 } 915 916 void SectionWriter::visit(const DynamicRelocationSection &Sec) { 917 llvm::copy(Sec.Contents, Out.getBufferStart() + Sec.Offset); 918 } 919 920 void DynamicRelocationSection::accept(SectionVisitor &Visitor) const { 921 Visitor.visit(*this); 922 } 923 924 void DynamicRelocationSection::accept(MutableSectionVisitor &Visitor) { 925 Visitor.visit(*this); 926 } 927 928 Error DynamicRelocationSection::removeSectionReferences( 929 bool AllowBrokenLinks, function_ref<bool(const SectionBase *)> ToRemove) { 930 if (ToRemove(Symbols)) { 931 if (!AllowBrokenLinks) 932 return createStringError( 933 llvm::errc::invalid_argument, 934 "symbol table '%s' cannot be removed because it is " 935 "referenced by the relocation section '%s'", 936 Symbols->Name.data(), this->Name.data()); 937 Symbols = nullptr; 938 } 939 940 // SecToApplyRel contains a section referenced by sh_info field. It keeps 941 // a section to which the relocation section applies. When we remove any 942 // sections we also remove their relocation sections. Since we do that much 943 // earlier, this assert should never be triggered. 944 assert(!SecToApplyRel || !ToRemove(SecToApplyRel)); 945 return Error::success(); 946 } 947 948 Error Section::removeSectionReferences( 949 bool AllowBrokenDependency, 950 function_ref<bool(const SectionBase *)> ToRemove) { 951 if (ToRemove(LinkSection)) { 952 if (!AllowBrokenDependency) 953 return createStringError(llvm::errc::invalid_argument, 954 "section '%s' cannot be removed because it is " 955 "referenced by the section '%s'", 956 LinkSection->Name.data(), this->Name.data()); 957 LinkSection = nullptr; 958 } 959 return Error::success(); 960 } 961 962 void GroupSection::finalize() { 963 this->Info = Sym->Index; 964 this->Link = SymTab->Index; 965 } 966 967 Error GroupSection::removeSymbols(function_ref<bool(const Symbol &)> ToRemove) { 968 if (ToRemove(*Sym)) 969 return createStringError(llvm::errc::invalid_argument, 970 "symbol '%s' cannot be removed because it is " 971 "referenced by the section '%s[%d]'", 972 Sym->Name.data(), this->Name.data(), this->Index); 973 return Error::success(); 974 } 975 976 void GroupSection::markSymbols() { 977 if (Sym) 978 Sym->Referenced = true; 979 } 980 981 void GroupSection::replaceSectionReferences( 982 const DenseMap<SectionBase *, SectionBase *> &FromTo) { 983 for (SectionBase *&Sec : GroupMembers) 984 if (SectionBase *To = FromTo.lookup(Sec)) 985 Sec = To; 986 } 987 988 void Section::initialize(SectionTableRef SecTable) { 989 if (Link == ELF::SHN_UNDEF) 990 return; 991 LinkSection = 992 SecTable.getSection(Link, "Link field value " + Twine(Link) + 993 " in section " + Name + " is invalid"); 994 if (LinkSection->Type == ELF::SHT_SYMTAB) 995 LinkSection = nullptr; 996 } 997 998 void Section::finalize() { this->Link = LinkSection ? LinkSection->Index : 0; } 999 1000 void GnuDebugLinkSection::init(StringRef File) { 1001 FileName = sys::path::filename(File); 1002 // The format for the .gnu_debuglink starts with the file name and is 1003 // followed by a null terminator and then the CRC32 of the file. The CRC32 1004 // should be 4 byte aligned. So we add the FileName size, a 1 for the null 1005 // byte, and then finally push the size to alignment and add 4. 1006 Size = alignTo(FileName.size() + 1, 4) + 4; 1007 // The CRC32 will only be aligned if we align the whole section. 1008 Align = 4; 1009 Type = ELF::SHT_PROGBITS; 1010 Name = ".gnu_debuglink"; 1011 // For sections not found in segments, OriginalOffset is only used to 1012 // establish the order that sections should go in. By using the maximum 1013 // possible offset we cause this section to wind up at the end. 1014 OriginalOffset = std::numeric_limits<uint64_t>::max(); 1015 } 1016 1017 GnuDebugLinkSection::GnuDebugLinkSection(StringRef File, 1018 uint32_t PrecomputedCRC) 1019 : FileName(File), CRC32(PrecomputedCRC) { 1020 init(File); 1021 } 1022 1023 template <class ELFT> 1024 void ELFSectionWriter<ELFT>::visit(const GnuDebugLinkSection &Sec) { 1025 unsigned char *Buf = Out.getBufferStart() + Sec.Offset; 1026 Elf_Word *CRC = 1027 reinterpret_cast<Elf_Word *>(Buf + Sec.Size - sizeof(Elf_Word)); 1028 *CRC = Sec.CRC32; 1029 llvm::copy(Sec.FileName, Buf); 1030 } 1031 1032 void GnuDebugLinkSection::accept(SectionVisitor &Visitor) const { 1033 Visitor.visit(*this); 1034 } 1035 1036 void GnuDebugLinkSection::accept(MutableSectionVisitor &Visitor) { 1037 Visitor.visit(*this); 1038 } 1039 1040 template <class ELFT> 1041 void ELFSectionWriter<ELFT>::visit(const GroupSection &Sec) { 1042 ELF::Elf32_Word *Buf = 1043 reinterpret_cast<ELF::Elf32_Word *>(Out.getBufferStart() + Sec.Offset); 1044 *Buf++ = Sec.FlagWord; 1045 for (SectionBase *S : Sec.GroupMembers) 1046 support::endian::write32<ELFT::TargetEndianness>(Buf++, S->Index); 1047 } 1048 1049 void GroupSection::accept(SectionVisitor &Visitor) const { 1050 Visitor.visit(*this); 1051 } 1052 1053 void GroupSection::accept(MutableSectionVisitor &Visitor) { 1054 Visitor.visit(*this); 1055 } 1056 1057 // Returns true IFF a section is wholly inside the range of a segment 1058 static bool sectionWithinSegment(const SectionBase &Sec, const Segment &Seg) { 1059 // If a section is empty it should be treated like it has a size of 1. This is 1060 // to clarify the case when an empty section lies on a boundary between two 1061 // segments and ensures that the section "belongs" to the second segment and 1062 // not the first. 1063 uint64_t SecSize = Sec.Size ? Sec.Size : 1; 1064 1065 if (Sec.Type == SHT_NOBITS) { 1066 if (!(Sec.Flags & SHF_ALLOC)) 1067 return false; 1068 1069 bool SectionIsTLS = Sec.Flags & SHF_TLS; 1070 bool SegmentIsTLS = Seg.Type == PT_TLS; 1071 if (SectionIsTLS != SegmentIsTLS) 1072 return false; 1073 1074 return Seg.VAddr <= Sec.Addr && 1075 Seg.VAddr + Seg.MemSize >= Sec.Addr + SecSize; 1076 } 1077 1078 return Seg.Offset <= Sec.OriginalOffset && 1079 Seg.Offset + Seg.FileSize >= Sec.OriginalOffset + SecSize; 1080 } 1081 1082 // Returns true IFF a segment's original offset is inside of another segment's 1083 // range. 1084 static bool segmentOverlapsSegment(const Segment &Child, 1085 const Segment &Parent) { 1086 1087 return Parent.OriginalOffset <= Child.OriginalOffset && 1088 Parent.OriginalOffset + Parent.FileSize > Child.OriginalOffset; 1089 } 1090 1091 static bool compareSegmentsByOffset(const Segment *A, const Segment *B) { 1092 // Any segment without a parent segment should come before a segment 1093 // that has a parent segment. 1094 if (A->OriginalOffset < B->OriginalOffset) 1095 return true; 1096 if (A->OriginalOffset > B->OriginalOffset) 1097 return false; 1098 return A->Index < B->Index; 1099 } 1100 1101 static bool compareSegmentsByPAddr(const Segment *A, const Segment *B) { 1102 if (A->PAddr < B->PAddr) 1103 return true; 1104 if (A->PAddr > B->PAddr) 1105 return false; 1106 return A->Index < B->Index; 1107 } 1108 1109 void BasicELFBuilder::initFileHeader() { 1110 Obj->Flags = 0x0; 1111 Obj->Type = ET_REL; 1112 Obj->OSABI = ELFOSABI_NONE; 1113 Obj->ABIVersion = 0; 1114 Obj->Entry = 0x0; 1115 Obj->Machine = EM_NONE; 1116 Obj->Version = 1; 1117 } 1118 1119 void BasicELFBuilder::initHeaderSegment() { Obj->ElfHdrSegment.Index = 0; } 1120 1121 StringTableSection *BasicELFBuilder::addStrTab() { 1122 auto &StrTab = Obj->addSection<StringTableSection>(); 1123 StrTab.Name = ".strtab"; 1124 1125 Obj->SectionNames = &StrTab; 1126 return &StrTab; 1127 } 1128 1129 SymbolTableSection *BasicELFBuilder::addSymTab(StringTableSection *StrTab) { 1130 auto &SymTab = Obj->addSection<SymbolTableSection>(); 1131 1132 SymTab.Name = ".symtab"; 1133 SymTab.Link = StrTab->Index; 1134 1135 // The symbol table always needs a null symbol 1136 SymTab.addSymbol("", 0, 0, nullptr, 0, 0, 0, 0); 1137 1138 Obj->SymbolTable = &SymTab; 1139 return &SymTab; 1140 } 1141 1142 void BasicELFBuilder::initSections() { 1143 for (SectionBase &Sec : Obj->sections()) 1144 Sec.initialize(Obj->sections()); 1145 } 1146 1147 void BinaryELFBuilder::addData(SymbolTableSection *SymTab) { 1148 auto Data = ArrayRef<uint8_t>( 1149 reinterpret_cast<const uint8_t *>(MemBuf->getBufferStart()), 1150 MemBuf->getBufferSize()); 1151 auto &DataSection = Obj->addSection<Section>(Data); 1152 DataSection.Name = ".data"; 1153 DataSection.Type = ELF::SHT_PROGBITS; 1154 DataSection.Size = Data.size(); 1155 DataSection.Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE; 1156 1157 std::string SanitizedFilename = MemBuf->getBufferIdentifier().str(); 1158 std::replace_if(std::begin(SanitizedFilename), std::end(SanitizedFilename), 1159 [](char C) { return !isalnum(C); }, '_'); 1160 Twine Prefix = Twine("_binary_") + SanitizedFilename; 1161 1162 SymTab->addSymbol(Prefix + "_start", STB_GLOBAL, STT_NOTYPE, &DataSection, 1163 /*Value=*/0, NewSymbolVisibility, 0, 0); 1164 SymTab->addSymbol(Prefix + "_end", STB_GLOBAL, STT_NOTYPE, &DataSection, 1165 /*Value=*/DataSection.Size, NewSymbolVisibility, 0, 0); 1166 SymTab->addSymbol(Prefix + "_size", STB_GLOBAL, STT_NOTYPE, nullptr, 1167 /*Value=*/DataSection.Size, NewSymbolVisibility, SHN_ABS, 1168 0); 1169 } 1170 1171 std::unique_ptr<Object> BinaryELFBuilder::build() { 1172 initFileHeader(); 1173 initHeaderSegment(); 1174 1175 SymbolTableSection *SymTab = addSymTab(addStrTab()); 1176 initSections(); 1177 addData(SymTab); 1178 1179 return std::move(Obj); 1180 } 1181 1182 // Adds sections from IHEX data file. Data should have been 1183 // fully validated by this time. 1184 void IHexELFBuilder::addDataSections() { 1185 OwnedDataSection *Section = nullptr; 1186 uint64_t SegmentAddr = 0, BaseAddr = 0; 1187 uint32_t SecNo = 1; 1188 1189 for (const IHexRecord &R : Records) { 1190 uint64_t RecAddr; 1191 switch (R.Type) { 1192 case IHexRecord::Data: 1193 // Ignore empty data records 1194 if (R.HexData.empty()) 1195 continue; 1196 RecAddr = R.Addr + SegmentAddr + BaseAddr; 1197 if (!Section || Section->Addr + Section->Size != RecAddr) 1198 // OriginalOffset field is only used to sort section properly, so 1199 // instead of keeping track of real offset in IHEX file, we use 1200 // section number. 1201 Section = &Obj->addSection<OwnedDataSection>( 1202 ".sec" + std::to_string(SecNo++), RecAddr, 1203 ELF::SHF_ALLOC | ELF::SHF_WRITE, SecNo); 1204 Section->appendHexData(R.HexData); 1205 break; 1206 case IHexRecord::EndOfFile: 1207 break; 1208 case IHexRecord::SegmentAddr: 1209 // 20-bit segment address. 1210 SegmentAddr = checkedGetHex<uint16_t>(R.HexData) << 4; 1211 break; 1212 case IHexRecord::StartAddr80x86: 1213 case IHexRecord::StartAddr: 1214 Obj->Entry = checkedGetHex<uint32_t>(R.HexData); 1215 assert(Obj->Entry <= 0xFFFFFU); 1216 break; 1217 case IHexRecord::ExtendedAddr: 1218 // 16-31 bits of linear base address 1219 BaseAddr = checkedGetHex<uint16_t>(R.HexData) << 16; 1220 break; 1221 default: 1222 llvm_unreachable("unknown record type"); 1223 } 1224 } 1225 } 1226 1227 std::unique_ptr<Object> IHexELFBuilder::build() { 1228 initFileHeader(); 1229 initHeaderSegment(); 1230 StringTableSection *StrTab = addStrTab(); 1231 addSymTab(StrTab); 1232 initSections(); 1233 addDataSections(); 1234 1235 return std::move(Obj); 1236 } 1237 1238 template <class ELFT> void ELFBuilder<ELFT>::setParentSegment(Segment &Child) { 1239 for (Segment &Parent : Obj.segments()) { 1240 // Every segment will overlap with itself but we don't want a segment to 1241 // be it's own parent so we avoid that situation. 1242 if (&Child != &Parent && segmentOverlapsSegment(Child, Parent)) { 1243 // We want a canonical "most parental" segment but this requires 1244 // inspecting the ParentSegment. 1245 if (compareSegmentsByOffset(&Parent, &Child)) 1246 if (Child.ParentSegment == nullptr || 1247 compareSegmentsByOffset(&Parent, Child.ParentSegment)) { 1248 Child.ParentSegment = &Parent; 1249 } 1250 } 1251 } 1252 } 1253 1254 template <class ELFT> void ELFBuilder<ELFT>::findEhdrOffset() { 1255 if (!ExtractPartition) 1256 return; 1257 1258 for (const SectionBase &Sec : Obj.sections()) { 1259 if (Sec.Type == SHT_LLVM_PART_EHDR && Sec.Name == *ExtractPartition) { 1260 EhdrOffset = Sec.Offset; 1261 return; 1262 } 1263 } 1264 error("could not find partition named '" + *ExtractPartition + "'"); 1265 } 1266 1267 template <class ELFT> 1268 void ELFBuilder<ELFT>::readProgramHeaders(const ELFFile<ELFT> &HeadersFile) { 1269 uint32_t Index = 0; 1270 for (const auto &Phdr : unwrapOrError(HeadersFile.program_headers())) { 1271 if (Phdr.p_offset + Phdr.p_filesz > HeadersFile.getBufSize()) 1272 error("program header with offset 0x" + Twine::utohexstr(Phdr.p_offset) + 1273 " and file size 0x" + Twine::utohexstr(Phdr.p_filesz) + 1274 " goes past the end of the file"); 1275 1276 ArrayRef<uint8_t> Data{HeadersFile.base() + Phdr.p_offset, 1277 (size_t)Phdr.p_filesz}; 1278 Segment &Seg = Obj.addSegment(Data); 1279 Seg.Type = Phdr.p_type; 1280 Seg.Flags = Phdr.p_flags; 1281 Seg.OriginalOffset = Phdr.p_offset + EhdrOffset; 1282 Seg.Offset = Phdr.p_offset + EhdrOffset; 1283 Seg.VAddr = Phdr.p_vaddr; 1284 Seg.PAddr = Phdr.p_paddr; 1285 Seg.FileSize = Phdr.p_filesz; 1286 Seg.MemSize = Phdr.p_memsz; 1287 Seg.Align = Phdr.p_align; 1288 Seg.Index = Index++; 1289 for (SectionBase &Sec : Obj.sections()) 1290 if (sectionWithinSegment(Sec, Seg)) { 1291 Seg.addSection(&Sec); 1292 if (!Sec.ParentSegment || Sec.ParentSegment->Offset > Seg.Offset) 1293 Sec.ParentSegment = &Seg; 1294 } 1295 } 1296 1297 auto &ElfHdr = Obj.ElfHdrSegment; 1298 ElfHdr.Index = Index++; 1299 ElfHdr.OriginalOffset = ElfHdr.Offset = EhdrOffset; 1300 1301 const auto &Ehdr = *HeadersFile.getHeader(); 1302 auto &PrHdr = Obj.ProgramHdrSegment; 1303 PrHdr.Type = PT_PHDR; 1304 PrHdr.Flags = 0; 1305 // The spec requires us to have p_vaddr % p_align == p_offset % p_align. 1306 // Whereas this works automatically for ElfHdr, here OriginalOffset is 1307 // always non-zero and to ensure the equation we assign the same value to 1308 // VAddr as well. 1309 PrHdr.OriginalOffset = PrHdr.Offset = PrHdr.VAddr = EhdrOffset + Ehdr.e_phoff; 1310 PrHdr.PAddr = 0; 1311 PrHdr.FileSize = PrHdr.MemSize = Ehdr.e_phentsize * Ehdr.e_phnum; 1312 // The spec requires us to naturally align all the fields. 1313 PrHdr.Align = sizeof(Elf_Addr); 1314 PrHdr.Index = Index++; 1315 1316 // Now we do an O(n^2) loop through the segments in order to match up 1317 // segments. 1318 for (Segment &Child : Obj.segments()) 1319 setParentSegment(Child); 1320 setParentSegment(ElfHdr); 1321 setParentSegment(PrHdr); 1322 } 1323 1324 template <class ELFT> 1325 void ELFBuilder<ELFT>::initGroupSection(GroupSection *GroupSec) { 1326 if (GroupSec->Align % sizeof(ELF::Elf32_Word) != 0) 1327 error("invalid alignment " + Twine(GroupSec->Align) + " of group section '" + 1328 GroupSec->Name + "'"); 1329 SectionTableRef SecTable = Obj.sections(); 1330 auto SymTab = SecTable.template getSectionOfType<SymbolTableSection>( 1331 GroupSec->Link, 1332 "link field value '" + Twine(GroupSec->Link) + "' in section '" + 1333 GroupSec->Name + "' is invalid", 1334 "link field value '" + Twine(GroupSec->Link) + "' in section '" + 1335 GroupSec->Name + "' is not a symbol table"); 1336 Symbol *Sym = SymTab->getSymbolByIndex(GroupSec->Info); 1337 if (!Sym) 1338 error("info field value '" + Twine(GroupSec->Info) + "' in section '" + 1339 GroupSec->Name + "' is not a valid symbol index"); 1340 GroupSec->setSymTab(SymTab); 1341 GroupSec->setSymbol(Sym); 1342 if (GroupSec->Contents.size() % sizeof(ELF::Elf32_Word) || 1343 GroupSec->Contents.empty()) 1344 error("the content of the section " + GroupSec->Name + " is malformed"); 1345 const ELF::Elf32_Word *Word = 1346 reinterpret_cast<const ELF::Elf32_Word *>(GroupSec->Contents.data()); 1347 const ELF::Elf32_Word *End = 1348 Word + GroupSec->Contents.size() / sizeof(ELF::Elf32_Word); 1349 GroupSec->setFlagWord(*Word++); 1350 for (; Word != End; ++Word) { 1351 uint32_t Index = support::endian::read32<ELFT::TargetEndianness>(Word); 1352 GroupSec->addMember(SecTable.getSection( 1353 Index, "group member index " + Twine(Index) + " in section '" + 1354 GroupSec->Name + "' is invalid")); 1355 } 1356 } 1357 1358 template <class ELFT> 1359 void ELFBuilder<ELFT>::initSymbolTable(SymbolTableSection *SymTab) { 1360 const Elf_Shdr &Shdr = *unwrapOrError(ElfFile.getSection(SymTab->Index)); 1361 StringRef StrTabData = unwrapOrError(ElfFile.getStringTableForSymtab(Shdr)); 1362 ArrayRef<Elf_Word> ShndxData; 1363 1364 auto Symbols = unwrapOrError(ElfFile.symbols(&Shdr)); 1365 for (const auto &Sym : Symbols) { 1366 SectionBase *DefSection = nullptr; 1367 StringRef Name = unwrapOrError(Sym.getName(StrTabData)); 1368 1369 if (Sym.st_shndx == SHN_XINDEX) { 1370 if (SymTab->getShndxTable() == nullptr) 1371 error("symbol '" + Name + 1372 "' has index SHN_XINDEX but no SHT_SYMTAB_SHNDX section exists"); 1373 if (ShndxData.data() == nullptr) { 1374 const Elf_Shdr &ShndxSec = 1375 *unwrapOrError(ElfFile.getSection(SymTab->getShndxTable()->Index)); 1376 ShndxData = unwrapOrError( 1377 ElfFile.template getSectionContentsAsArray<Elf_Word>(&ShndxSec)); 1378 if (ShndxData.size() != Symbols.size()) 1379 error("symbol section index table does not have the same number of " 1380 "entries as the symbol table"); 1381 } 1382 Elf_Word Index = ShndxData[&Sym - Symbols.begin()]; 1383 DefSection = Obj.sections().getSection( 1384 Index, 1385 "symbol '" + Name + "' has invalid section index " + Twine(Index)); 1386 } else if (Sym.st_shndx >= SHN_LORESERVE) { 1387 if (!isValidReservedSectionIndex(Sym.st_shndx, Obj.Machine)) { 1388 error( 1389 "symbol '" + Name + 1390 "' has unsupported value greater than or equal to SHN_LORESERVE: " + 1391 Twine(Sym.st_shndx)); 1392 } 1393 } else if (Sym.st_shndx != SHN_UNDEF) { 1394 DefSection = Obj.sections().getSection( 1395 Sym.st_shndx, "symbol '" + Name + 1396 "' is defined has invalid section index " + 1397 Twine(Sym.st_shndx)); 1398 } 1399 1400 SymTab->addSymbol(Name, Sym.getBinding(), Sym.getType(), DefSection, 1401 Sym.getValue(), Sym.st_other, Sym.st_shndx, Sym.st_size); 1402 } 1403 } 1404 1405 template <class ELFT> 1406 static void getAddend(uint64_t &ToSet, const Elf_Rel_Impl<ELFT, false> &Rel) {} 1407 1408 template <class ELFT> 1409 static void getAddend(uint64_t &ToSet, const Elf_Rel_Impl<ELFT, true> &Rela) { 1410 ToSet = Rela.r_addend; 1411 } 1412 1413 template <class T> 1414 static void initRelocations(RelocationSection *Relocs, 1415 SymbolTableSection *SymbolTable, T RelRange) { 1416 for (const auto &Rel : RelRange) { 1417 Relocation ToAdd; 1418 ToAdd.Offset = Rel.r_offset; 1419 getAddend(ToAdd.Addend, Rel); 1420 ToAdd.Type = Rel.getType(false); 1421 ToAdd.RelocSymbol = SymbolTable->getSymbolByIndex(Rel.getSymbol(false)); 1422 Relocs->addRelocation(ToAdd); 1423 } 1424 } 1425 1426 SectionBase *SectionTableRef::getSection(uint32_t Index, Twine ErrMsg) { 1427 if (Index == SHN_UNDEF || Index > Sections.size()) 1428 error(ErrMsg); 1429 return Sections[Index - 1].get(); 1430 } 1431 1432 template <class T> 1433 T *SectionTableRef::getSectionOfType(uint32_t Index, Twine IndexErrMsg, 1434 Twine TypeErrMsg) { 1435 if (T *Sec = dyn_cast<T>(getSection(Index, IndexErrMsg))) 1436 return Sec; 1437 error(TypeErrMsg); 1438 } 1439 1440 template <class ELFT> 1441 SectionBase &ELFBuilder<ELFT>::makeSection(const Elf_Shdr &Shdr) { 1442 ArrayRef<uint8_t> Data; 1443 switch (Shdr.sh_type) { 1444 case SHT_REL: 1445 case SHT_RELA: 1446 if (Shdr.sh_flags & SHF_ALLOC) { 1447 Data = unwrapOrError(ElfFile.getSectionContents(&Shdr)); 1448 return Obj.addSection<DynamicRelocationSection>(Data); 1449 } 1450 return Obj.addSection<RelocationSection>(); 1451 case SHT_STRTAB: 1452 // If a string table is allocated we don't want to mess with it. That would 1453 // mean altering the memory image. There are no special link types or 1454 // anything so we can just use a Section. 1455 if (Shdr.sh_flags & SHF_ALLOC) { 1456 Data = unwrapOrError(ElfFile.getSectionContents(&Shdr)); 1457 return Obj.addSection<Section>(Data); 1458 } 1459 return Obj.addSection<StringTableSection>(); 1460 case SHT_HASH: 1461 case SHT_GNU_HASH: 1462 // Hash tables should refer to SHT_DYNSYM which we're not going to change. 1463 // Because of this we don't need to mess with the hash tables either. 1464 Data = unwrapOrError(ElfFile.getSectionContents(&Shdr)); 1465 return Obj.addSection<Section>(Data); 1466 case SHT_GROUP: 1467 Data = unwrapOrError(ElfFile.getSectionContents(&Shdr)); 1468 return Obj.addSection<GroupSection>(Data); 1469 case SHT_DYNSYM: 1470 Data = unwrapOrError(ElfFile.getSectionContents(&Shdr)); 1471 return Obj.addSection<DynamicSymbolTableSection>(Data); 1472 case SHT_DYNAMIC: 1473 Data = unwrapOrError(ElfFile.getSectionContents(&Shdr)); 1474 return Obj.addSection<DynamicSection>(Data); 1475 case SHT_SYMTAB: { 1476 auto &SymTab = Obj.addSection<SymbolTableSection>(); 1477 Obj.SymbolTable = &SymTab; 1478 return SymTab; 1479 } 1480 case SHT_SYMTAB_SHNDX: { 1481 auto &ShndxSection = Obj.addSection<SectionIndexSection>(); 1482 Obj.SectionIndexTable = &ShndxSection; 1483 return ShndxSection; 1484 } 1485 case SHT_NOBITS: 1486 return Obj.addSection<Section>(Data); 1487 default: { 1488 Data = unwrapOrError(ElfFile.getSectionContents(&Shdr)); 1489 1490 StringRef Name = unwrapOrError(ElfFile.getSectionName(&Shdr)); 1491 if (Name.startswith(".zdebug") || (Shdr.sh_flags & ELF::SHF_COMPRESSED)) { 1492 uint64_t DecompressedSize, DecompressedAlign; 1493 std::tie(DecompressedSize, DecompressedAlign) = 1494 getDecompressedSizeAndAlignment<ELFT>(Data); 1495 return Obj.addSection<CompressedSection>(Data, DecompressedSize, 1496 DecompressedAlign); 1497 } 1498 1499 return Obj.addSection<Section>(Data); 1500 } 1501 } 1502 } 1503 1504 template <class ELFT> void ELFBuilder<ELFT>::readSectionHeaders() { 1505 uint32_t Index = 0; 1506 for (const auto &Shdr : unwrapOrError(ElfFile.sections())) { 1507 if (Index == 0) { 1508 ++Index; 1509 continue; 1510 } 1511 auto &Sec = makeSection(Shdr); 1512 Sec.Name = unwrapOrError(ElfFile.getSectionName(&Shdr)); 1513 Sec.Type = Shdr.sh_type; 1514 Sec.Flags = Shdr.sh_flags; 1515 Sec.Addr = Shdr.sh_addr; 1516 Sec.Offset = Shdr.sh_offset; 1517 Sec.OriginalOffset = Shdr.sh_offset; 1518 Sec.Size = Shdr.sh_size; 1519 Sec.Link = Shdr.sh_link; 1520 Sec.Info = Shdr.sh_info; 1521 Sec.Align = Shdr.sh_addralign; 1522 Sec.EntrySize = Shdr.sh_entsize; 1523 Sec.Index = Index++; 1524 Sec.OriginalData = 1525 ArrayRef<uint8_t>(ElfFile.base() + Shdr.sh_offset, 1526 (Shdr.sh_type == SHT_NOBITS) ? 0 : Shdr.sh_size); 1527 } 1528 } 1529 1530 template <class ELFT> void ELFBuilder<ELFT>::readSections(bool EnsureSymtab) { 1531 // If a section index table exists we'll need to initialize it before we 1532 // initialize the symbol table because the symbol table might need to 1533 // reference it. 1534 if (Obj.SectionIndexTable) 1535 Obj.SectionIndexTable->initialize(Obj.sections()); 1536 1537 // Now that all of the sections have been added we can fill out some extra 1538 // details about symbol tables. We need the symbol table filled out before 1539 // any relocations. 1540 if (Obj.SymbolTable) { 1541 Obj.SymbolTable->initialize(Obj.sections()); 1542 initSymbolTable(Obj.SymbolTable); 1543 } else if (EnsureSymtab) { 1544 // Reuse the existing SHT_STRTAB section if exists. 1545 StringTableSection *StrTab = nullptr; 1546 for (auto &Sec : Obj.sections()) { 1547 if (Sec.Type == ELF::SHT_STRTAB && !(Sec.Flags & SHF_ALLOC)) { 1548 StrTab = static_cast<StringTableSection *>(&Sec); 1549 1550 // Prefer .strtab to .shstrtab. 1551 if (Obj.SectionNames != &Sec) 1552 break; 1553 } 1554 } 1555 if (!StrTab) 1556 StrTab = &Obj.addSection<StringTableSection>(); 1557 1558 SymbolTableSection &SymTab = Obj.addSection<SymbolTableSection>(); 1559 SymTab.Name = ".symtab"; 1560 SymTab.Link = StrTab->Index; 1561 SymTab.initialize(Obj.sections()); 1562 SymTab.addSymbol("", 0, 0, nullptr, 0, 0, 0, 0); 1563 Obj.SymbolTable = &SymTab; 1564 } 1565 1566 // Now that all sections and symbols have been added we can add 1567 // relocations that reference symbols and set the link and info fields for 1568 // relocation sections. 1569 for (auto &Sec : Obj.sections()) { 1570 if (&Sec == Obj.SymbolTable) 1571 continue; 1572 Sec.initialize(Obj.sections()); 1573 if (auto RelSec = dyn_cast<RelocationSection>(&Sec)) { 1574 auto Shdr = unwrapOrError(ElfFile.sections()).begin() + RelSec->Index; 1575 if (RelSec->Type == SHT_REL) 1576 initRelocations(RelSec, Obj.SymbolTable, 1577 unwrapOrError(ElfFile.rels(Shdr))); 1578 else 1579 initRelocations(RelSec, Obj.SymbolTable, 1580 unwrapOrError(ElfFile.relas(Shdr))); 1581 } else if (auto GroupSec = dyn_cast<GroupSection>(&Sec)) { 1582 initGroupSection(GroupSec); 1583 } 1584 } 1585 1586 uint32_t ShstrIndex = ElfFile.getHeader()->e_shstrndx; 1587 if (ShstrIndex == SHN_XINDEX) 1588 ShstrIndex = unwrapOrError(ElfFile.getSection(0))->sh_link; 1589 1590 if (ShstrIndex == SHN_UNDEF) 1591 Obj.HadShdrs = false; 1592 else 1593 Obj.SectionNames = 1594 Obj.sections().template getSectionOfType<StringTableSection>( 1595 ShstrIndex, 1596 "e_shstrndx field value " + Twine(ShstrIndex) + " in elf header " + 1597 " is invalid", 1598 "e_shstrndx field value " + Twine(ShstrIndex) + " in elf header " + 1599 " is not a string table"); 1600 } 1601 1602 template <class ELFT> void ELFBuilder<ELFT>::build(bool EnsureSymtab) { 1603 readSectionHeaders(); 1604 findEhdrOffset(); 1605 1606 // The ELFFile whose ELF headers and program headers are copied into the 1607 // output file. Normally the same as ElfFile, but if we're extracting a 1608 // loadable partition it will point to the partition's headers. 1609 ELFFile<ELFT> HeadersFile = unwrapOrError(ELFFile<ELFT>::create(toStringRef( 1610 {ElfFile.base() + EhdrOffset, ElfFile.getBufSize() - EhdrOffset}))); 1611 1612 auto &Ehdr = *HeadersFile.getHeader(); 1613 Obj.OSABI = Ehdr.e_ident[EI_OSABI]; 1614 Obj.ABIVersion = Ehdr.e_ident[EI_ABIVERSION]; 1615 Obj.Type = Ehdr.e_type; 1616 Obj.Machine = Ehdr.e_machine; 1617 Obj.Version = Ehdr.e_version; 1618 Obj.Entry = Ehdr.e_entry; 1619 Obj.Flags = Ehdr.e_flags; 1620 1621 readSections(EnsureSymtab); 1622 readProgramHeaders(HeadersFile); 1623 } 1624 1625 Writer::~Writer() {} 1626 1627 Reader::~Reader() {} 1628 1629 std::unique_ptr<Object> BinaryReader::create(bool /*EnsureSymtab*/) const { 1630 return BinaryELFBuilder(MemBuf, NewSymbolVisibility).build(); 1631 } 1632 1633 Expected<std::vector<IHexRecord>> IHexReader::parse() const { 1634 SmallVector<StringRef, 16> Lines; 1635 std::vector<IHexRecord> Records; 1636 bool HasSections = false; 1637 1638 MemBuf->getBuffer().split(Lines, '\n'); 1639 Records.reserve(Lines.size()); 1640 for (size_t LineNo = 1; LineNo <= Lines.size(); ++LineNo) { 1641 StringRef Line = Lines[LineNo - 1].trim(); 1642 if (Line.empty()) 1643 continue; 1644 1645 Expected<IHexRecord> R = IHexRecord::parse(Line); 1646 if (!R) 1647 return parseError(LineNo, R.takeError()); 1648 if (R->Type == IHexRecord::EndOfFile) 1649 break; 1650 HasSections |= (R->Type == IHexRecord::Data); 1651 Records.push_back(*R); 1652 } 1653 if (!HasSections) 1654 return parseError(-1U, "no sections"); 1655 1656 return std::move(Records); 1657 } 1658 1659 std::unique_ptr<Object> IHexReader::create(bool /*EnsureSymtab*/) const { 1660 std::vector<IHexRecord> Records = unwrapOrError(parse()); 1661 return IHexELFBuilder(Records).build(); 1662 } 1663 1664 std::unique_ptr<Object> ELFReader::create(bool EnsureSymtab) const { 1665 auto Obj = std::make_unique<Object>(); 1666 if (auto *O = dyn_cast<ELFObjectFile<ELF32LE>>(Bin)) { 1667 ELFBuilder<ELF32LE> Builder(*O, *Obj, ExtractPartition); 1668 Builder.build(EnsureSymtab); 1669 return Obj; 1670 } else if (auto *O = dyn_cast<ELFObjectFile<ELF64LE>>(Bin)) { 1671 ELFBuilder<ELF64LE> Builder(*O, *Obj, ExtractPartition); 1672 Builder.build(EnsureSymtab); 1673 return Obj; 1674 } else if (auto *O = dyn_cast<ELFObjectFile<ELF32BE>>(Bin)) { 1675 ELFBuilder<ELF32BE> Builder(*O, *Obj, ExtractPartition); 1676 Builder.build(EnsureSymtab); 1677 return Obj; 1678 } else if (auto *O = dyn_cast<ELFObjectFile<ELF64BE>>(Bin)) { 1679 ELFBuilder<ELF64BE> Builder(*O, *Obj, ExtractPartition); 1680 Builder.build(EnsureSymtab); 1681 return Obj; 1682 } 1683 error("invalid file type"); 1684 } 1685 1686 template <class ELFT> void ELFWriter<ELFT>::writeEhdr() { 1687 Elf_Ehdr &Ehdr = *reinterpret_cast<Elf_Ehdr *>(Buf.getBufferStart()); 1688 std::fill(Ehdr.e_ident, Ehdr.e_ident + 16, 0); 1689 Ehdr.e_ident[EI_MAG0] = 0x7f; 1690 Ehdr.e_ident[EI_MAG1] = 'E'; 1691 Ehdr.e_ident[EI_MAG2] = 'L'; 1692 Ehdr.e_ident[EI_MAG3] = 'F'; 1693 Ehdr.e_ident[EI_CLASS] = ELFT::Is64Bits ? ELFCLASS64 : ELFCLASS32; 1694 Ehdr.e_ident[EI_DATA] = 1695 ELFT::TargetEndianness == support::big ? ELFDATA2MSB : ELFDATA2LSB; 1696 Ehdr.e_ident[EI_VERSION] = EV_CURRENT; 1697 Ehdr.e_ident[EI_OSABI] = Obj.OSABI; 1698 Ehdr.e_ident[EI_ABIVERSION] = Obj.ABIVersion; 1699 1700 Ehdr.e_type = Obj.Type; 1701 Ehdr.e_machine = Obj.Machine; 1702 Ehdr.e_version = Obj.Version; 1703 Ehdr.e_entry = Obj.Entry; 1704 // We have to use the fully-qualified name llvm::size 1705 // since some compilers complain on ambiguous resolution. 1706 Ehdr.e_phnum = llvm::size(Obj.segments()); 1707 Ehdr.e_phoff = (Ehdr.e_phnum != 0) ? Obj.ProgramHdrSegment.Offset : 0; 1708 Ehdr.e_phentsize = (Ehdr.e_phnum != 0) ? sizeof(Elf_Phdr) : 0; 1709 Ehdr.e_flags = Obj.Flags; 1710 Ehdr.e_ehsize = sizeof(Elf_Ehdr); 1711 if (WriteSectionHeaders && Obj.sections().size() != 0) { 1712 Ehdr.e_shentsize = sizeof(Elf_Shdr); 1713 Ehdr.e_shoff = Obj.SHOff; 1714 // """ 1715 // If the number of sections is greater than or equal to 1716 // SHN_LORESERVE (0xff00), this member has the value zero and the actual 1717 // number of section header table entries is contained in the sh_size field 1718 // of the section header at index 0. 1719 // """ 1720 auto Shnum = Obj.sections().size() + 1; 1721 if (Shnum >= SHN_LORESERVE) 1722 Ehdr.e_shnum = 0; 1723 else 1724 Ehdr.e_shnum = Shnum; 1725 // """ 1726 // If the section name string table section index is greater than or equal 1727 // to SHN_LORESERVE (0xff00), this member has the value SHN_XINDEX (0xffff) 1728 // and the actual index of the section name string table section is 1729 // contained in the sh_link field of the section header at index 0. 1730 // """ 1731 if (Obj.SectionNames->Index >= SHN_LORESERVE) 1732 Ehdr.e_shstrndx = SHN_XINDEX; 1733 else 1734 Ehdr.e_shstrndx = Obj.SectionNames->Index; 1735 } else { 1736 Ehdr.e_shentsize = 0; 1737 Ehdr.e_shoff = 0; 1738 Ehdr.e_shnum = 0; 1739 Ehdr.e_shstrndx = 0; 1740 } 1741 } 1742 1743 template <class ELFT> void ELFWriter<ELFT>::writePhdrs() { 1744 for (auto &Seg : Obj.segments()) 1745 writePhdr(Seg); 1746 } 1747 1748 template <class ELFT> void ELFWriter<ELFT>::writeShdrs() { 1749 // This reference serves to write the dummy section header at the begining 1750 // of the file. It is not used for anything else 1751 Elf_Shdr &Shdr = 1752 *reinterpret_cast<Elf_Shdr *>(Buf.getBufferStart() + Obj.SHOff); 1753 Shdr.sh_name = 0; 1754 Shdr.sh_type = SHT_NULL; 1755 Shdr.sh_flags = 0; 1756 Shdr.sh_addr = 0; 1757 Shdr.sh_offset = 0; 1758 // See writeEhdr for why we do this. 1759 uint64_t Shnum = Obj.sections().size() + 1; 1760 if (Shnum >= SHN_LORESERVE) 1761 Shdr.sh_size = Shnum; 1762 else 1763 Shdr.sh_size = 0; 1764 // See writeEhdr for why we do this. 1765 if (Obj.SectionNames != nullptr && Obj.SectionNames->Index >= SHN_LORESERVE) 1766 Shdr.sh_link = Obj.SectionNames->Index; 1767 else 1768 Shdr.sh_link = 0; 1769 Shdr.sh_info = 0; 1770 Shdr.sh_addralign = 0; 1771 Shdr.sh_entsize = 0; 1772 1773 for (SectionBase &Sec : Obj.sections()) 1774 writeShdr(Sec); 1775 } 1776 1777 template <class ELFT> void ELFWriter<ELFT>::writeSectionData() { 1778 for (SectionBase &Sec : Obj.sections()) 1779 // Segments are responsible for writing their contents, so only write the 1780 // section data if the section is not in a segment. Note that this renders 1781 // sections in segments effectively immutable. 1782 if (Sec.ParentSegment == nullptr) 1783 Sec.accept(*SecWriter); 1784 } 1785 1786 template <class ELFT> void ELFWriter<ELFT>::writeSegmentData() { 1787 for (Segment &Seg : Obj.segments()) { 1788 uint8_t *B = Buf.getBufferStart() + Seg.Offset; 1789 assert(Seg.FileSize == Seg.getContents().size() && 1790 "Segment size must match contents size"); 1791 std::memcpy(B, Seg.getContents().data(), Seg.FileSize); 1792 } 1793 1794 // Iterate over removed sections and overwrite their old data with zeroes. 1795 for (auto &Sec : Obj.removedSections()) { 1796 Segment *Parent = Sec.ParentSegment; 1797 if (Parent == nullptr || Sec.Type == SHT_NOBITS || Sec.Size == 0) 1798 continue; 1799 uint64_t Offset = 1800 Sec.OriginalOffset - Parent->OriginalOffset + Parent->Offset; 1801 std::memset(Buf.getBufferStart() + Offset, 0, Sec.Size); 1802 } 1803 } 1804 1805 template <class ELFT> 1806 ELFWriter<ELFT>::ELFWriter(Object &Obj, Buffer &Buf, bool WSH) 1807 : Writer(Obj, Buf), WriteSectionHeaders(WSH && Obj.HadShdrs) {} 1808 1809 Error Object::removeSections(bool AllowBrokenLinks, 1810 std::function<bool(const SectionBase &)> ToRemove) { 1811 1812 auto Iter = std::stable_partition( 1813 std::begin(Sections), std::end(Sections), [=](const SecPtr &Sec) { 1814 if (ToRemove(*Sec)) 1815 return false; 1816 if (auto RelSec = dyn_cast<RelocationSectionBase>(Sec.get())) { 1817 if (auto ToRelSec = RelSec->getSection()) 1818 return !ToRemove(*ToRelSec); 1819 } 1820 return true; 1821 }); 1822 if (SymbolTable != nullptr && ToRemove(*SymbolTable)) 1823 SymbolTable = nullptr; 1824 if (SectionNames != nullptr && ToRemove(*SectionNames)) 1825 SectionNames = nullptr; 1826 if (SectionIndexTable != nullptr && ToRemove(*SectionIndexTable)) 1827 SectionIndexTable = nullptr; 1828 // Now make sure there are no remaining references to the sections that will 1829 // be removed. Sometimes it is impossible to remove a reference so we emit 1830 // an error here instead. 1831 std::unordered_set<const SectionBase *> RemoveSections; 1832 RemoveSections.reserve(std::distance(Iter, std::end(Sections))); 1833 for (auto &RemoveSec : make_range(Iter, std::end(Sections))) { 1834 for (auto &Segment : Segments) 1835 Segment->removeSection(RemoveSec.get()); 1836 RemoveSections.insert(RemoveSec.get()); 1837 } 1838 1839 // For each section that remains alive, we want to remove the dead references. 1840 // This either might update the content of the section (e.g. remove symbols 1841 // from symbol table that belongs to removed section) or trigger an error if 1842 // a live section critically depends on a section being removed somehow 1843 // (e.g. the removed section is referenced by a relocation). 1844 for (auto &KeepSec : make_range(std::begin(Sections), Iter)) { 1845 if (Error E = KeepSec->removeSectionReferences(AllowBrokenLinks, 1846 [&RemoveSections](const SectionBase *Sec) { 1847 return RemoveSections.find(Sec) != RemoveSections.end(); 1848 })) 1849 return E; 1850 } 1851 1852 // Transfer removed sections into the Object RemovedSections container for use 1853 // later. 1854 std::move(Iter, Sections.end(), std::back_inserter(RemovedSections)); 1855 // Now finally get rid of them all together. 1856 Sections.erase(Iter, std::end(Sections)); 1857 return Error::success(); 1858 } 1859 1860 Error Object::removeSymbols(function_ref<bool(const Symbol &)> ToRemove) { 1861 if (SymbolTable) 1862 for (const SecPtr &Sec : Sections) 1863 if (Error E = Sec->removeSymbols(ToRemove)) 1864 return E; 1865 return Error::success(); 1866 } 1867 1868 void Object::sortSections() { 1869 // Use stable_sort to maintain the original ordering as closely as possible. 1870 llvm::stable_sort(Sections, [](const SecPtr &A, const SecPtr &B) { 1871 // Put SHT_GROUP sections first, since group section headers must come 1872 // before the sections they contain. This also matches what GNU objcopy 1873 // does. 1874 if (A->Type != B->Type && 1875 (A->Type == ELF::SHT_GROUP || B->Type == ELF::SHT_GROUP)) 1876 return A->Type == ELF::SHT_GROUP; 1877 // For all other sections, sort by offset order. 1878 return A->OriginalOffset < B->OriginalOffset; 1879 }); 1880 } 1881 1882 // Orders segments such that if x = y->ParentSegment then y comes before x. 1883 static void orderSegments(std::vector<Segment *> &Segments) { 1884 llvm::stable_sort(Segments, compareSegmentsByOffset); 1885 } 1886 1887 // This function finds a consistent layout for a list of segments starting from 1888 // an Offset. It assumes that Segments have been sorted by orderSegments and 1889 // returns an Offset one past the end of the last segment. 1890 static uint64_t layoutSegments(std::vector<Segment *> &Segments, 1891 uint64_t Offset) { 1892 assert(std::is_sorted(std::begin(Segments), std::end(Segments), 1893 compareSegmentsByOffset)); 1894 // The only way a segment should move is if a section was between two 1895 // segments and that section was removed. If that section isn't in a segment 1896 // then it's acceptable, but not ideal, to simply move it to after the 1897 // segments. So we can simply layout segments one after the other accounting 1898 // for alignment. 1899 for (Segment *Seg : Segments) { 1900 // We assume that segments have been ordered by OriginalOffset and Index 1901 // such that a parent segment will always come before a child segment in 1902 // OrderedSegments. This means that the Offset of the ParentSegment should 1903 // already be set and we can set our offset relative to it. 1904 if (Seg->ParentSegment != nullptr) { 1905 Segment *Parent = Seg->ParentSegment; 1906 Seg->Offset = 1907 Parent->Offset + Seg->OriginalOffset - Parent->OriginalOffset; 1908 } else { 1909 Seg->Offset = 1910 alignTo(Offset, std::max<uint64_t>(Seg->Align, 1), Seg->VAddr); 1911 } 1912 Offset = std::max(Offset, Seg->Offset + Seg->FileSize); 1913 } 1914 return Offset; 1915 } 1916 1917 // This function finds a consistent layout for a list of sections. It assumes 1918 // that the ->ParentSegment of each section has already been laid out. The 1919 // supplied starting Offset is used for the starting offset of any section that 1920 // does not have a ParentSegment. It returns either the offset given if all 1921 // sections had a ParentSegment or an offset one past the last section if there 1922 // was a section that didn't have a ParentSegment. 1923 template <class Range> 1924 static uint64_t layoutSections(Range Sections, uint64_t Offset) { 1925 // Now the offset of every segment has been set we can assign the offsets 1926 // of each section. For sections that are covered by a segment we should use 1927 // the segment's original offset and the section's original offset to compute 1928 // the offset from the start of the segment. Using the offset from the start 1929 // of the segment we can assign a new offset to the section. For sections not 1930 // covered by segments we can just bump Offset to the next valid location. 1931 uint32_t Index = 1; 1932 for (auto &Sec : Sections) { 1933 Sec.Index = Index++; 1934 if (Sec.ParentSegment != nullptr) { 1935 auto Segment = *Sec.ParentSegment; 1936 Sec.Offset = 1937 Segment.Offset + (Sec.OriginalOffset - Segment.OriginalOffset); 1938 } else { 1939 Offset = alignTo(Offset, Sec.Align == 0 ? 1 : Sec.Align); 1940 Sec.Offset = Offset; 1941 if (Sec.Type != SHT_NOBITS) 1942 Offset += Sec.Size; 1943 } 1944 } 1945 return Offset; 1946 } 1947 1948 template <class ELFT> void ELFWriter<ELFT>::initEhdrSegment() { 1949 Segment &ElfHdr = Obj.ElfHdrSegment; 1950 ElfHdr.Type = PT_PHDR; 1951 ElfHdr.Flags = 0; 1952 ElfHdr.VAddr = 0; 1953 ElfHdr.PAddr = 0; 1954 ElfHdr.FileSize = ElfHdr.MemSize = sizeof(Elf_Ehdr); 1955 ElfHdr.Align = 0; 1956 } 1957 1958 template <class ELFT> void ELFWriter<ELFT>::assignOffsets() { 1959 // We need a temporary list of segments that has a special order to it 1960 // so that we know that anytime ->ParentSegment is set that segment has 1961 // already had its offset properly set. 1962 std::vector<Segment *> OrderedSegments; 1963 for (Segment &Segment : Obj.segments()) 1964 OrderedSegments.push_back(&Segment); 1965 OrderedSegments.push_back(&Obj.ElfHdrSegment); 1966 OrderedSegments.push_back(&Obj.ProgramHdrSegment); 1967 orderSegments(OrderedSegments); 1968 // Offset is used as the start offset of the first segment to be laid out. 1969 // Since the ELF Header (ElfHdrSegment) must be at the start of the file, 1970 // we start at offset 0. 1971 uint64_t Offset = 0; 1972 Offset = layoutSegments(OrderedSegments, Offset); 1973 Offset = layoutSections(Obj.sections(), Offset); 1974 // If we need to write the section header table out then we need to align the 1975 // Offset so that SHOffset is valid. 1976 if (WriteSectionHeaders) 1977 Offset = alignTo(Offset, sizeof(Elf_Addr)); 1978 Obj.SHOff = Offset; 1979 } 1980 1981 template <class ELFT> size_t ELFWriter<ELFT>::totalSize() const { 1982 // We already have the section header offset so we can calculate the total 1983 // size by just adding up the size of each section header. 1984 if (!WriteSectionHeaders) 1985 return Obj.SHOff; 1986 size_t ShdrCount = Obj.sections().size() + 1; // Includes null shdr. 1987 return Obj.SHOff + ShdrCount * sizeof(Elf_Shdr); 1988 } 1989 1990 template <class ELFT> Error ELFWriter<ELFT>::write() { 1991 // Segment data must be written first, so that the ELF header and program 1992 // header tables can overwrite it, if covered by a segment. 1993 writeSegmentData(); 1994 writeEhdr(); 1995 writePhdrs(); 1996 writeSectionData(); 1997 if (WriteSectionHeaders) 1998 writeShdrs(); 1999 return Buf.commit(); 2000 } 2001 2002 static Error removeUnneededSections(Object &Obj) { 2003 // We can remove an empty symbol table from non-relocatable objects. 2004 // Relocatable objects typically have relocation sections whose 2005 // sh_link field points to .symtab, so we can't remove .symtab 2006 // even if it is empty. 2007 if (Obj.isRelocatable() || Obj.SymbolTable == nullptr || 2008 !Obj.SymbolTable->empty()) 2009 return Error::success(); 2010 2011 // .strtab can be used for section names. In such a case we shouldn't 2012 // remove it. 2013 auto *StrTab = Obj.SymbolTable->getStrTab() == Obj.SectionNames 2014 ? nullptr 2015 : Obj.SymbolTable->getStrTab(); 2016 return Obj.removeSections(false, [&](const SectionBase &Sec) { 2017 return &Sec == Obj.SymbolTable || &Sec == StrTab; 2018 }); 2019 } 2020 2021 template <class ELFT> Error ELFWriter<ELFT>::finalize() { 2022 // It could happen that SectionNames has been removed and yet the user wants 2023 // a section header table output. We need to throw an error if a user tries 2024 // to do that. 2025 if (Obj.SectionNames == nullptr && WriteSectionHeaders) 2026 return createStringError(llvm::errc::invalid_argument, 2027 "cannot write section header table because " 2028 "section header string table was removed"); 2029 2030 if (Error E = removeUnneededSections(Obj)) 2031 return E; 2032 Obj.sortSections(); 2033 2034 // We need to assign indexes before we perform layout because we need to know 2035 // if we need large indexes or not. We can assign indexes first and check as 2036 // we go to see if we will actully need large indexes. 2037 bool NeedsLargeIndexes = false; 2038 if (Obj.sections().size() >= SHN_LORESERVE) { 2039 SectionTableRef Sections = Obj.sections(); 2040 NeedsLargeIndexes = 2041 std::any_of(Sections.begin() + SHN_LORESERVE, Sections.end(), 2042 [](const SectionBase &Sec) { return Sec.HasSymbol; }); 2043 // TODO: handle case where only one section needs the large index table but 2044 // only needs it because the large index table hasn't been removed yet. 2045 } 2046 2047 if (NeedsLargeIndexes) { 2048 // This means we definitely need to have a section index table but if we 2049 // already have one then we should use it instead of making a new one. 2050 if (Obj.SymbolTable != nullptr && Obj.SectionIndexTable == nullptr) { 2051 // Addition of a section to the end does not invalidate the indexes of 2052 // other sections and assigns the correct index to the new section. 2053 auto &Shndx = Obj.addSection<SectionIndexSection>(); 2054 Obj.SymbolTable->setShndxTable(&Shndx); 2055 Shndx.setSymTab(Obj.SymbolTable); 2056 } 2057 } else { 2058 // Since we don't need SectionIndexTable we should remove it and all 2059 // references to it. 2060 if (Obj.SectionIndexTable != nullptr) { 2061 // We do not support sections referring to the section index table. 2062 if (Error E = Obj.removeSections(false /*AllowBrokenLinks*/, 2063 [this](const SectionBase &Sec) { 2064 return &Sec == Obj.SectionIndexTable; 2065 })) 2066 return E; 2067 } 2068 } 2069 2070 // Make sure we add the names of all the sections. Importantly this must be 2071 // done after we decide to add or remove SectionIndexes. 2072 if (Obj.SectionNames != nullptr) 2073 for (const SectionBase &Sec : Obj.sections()) 2074 Obj.SectionNames->addString(Sec.Name); 2075 2076 initEhdrSegment(); 2077 2078 // Before we can prepare for layout the indexes need to be finalized. 2079 // Also, the output arch may not be the same as the input arch, so fix up 2080 // size-related fields before doing layout calculations. 2081 uint64_t Index = 0; 2082 auto SecSizer = std::make_unique<ELFSectionSizer<ELFT>>(); 2083 for (SectionBase &Sec : Obj.sections()) { 2084 Sec.Index = Index++; 2085 Sec.accept(*SecSizer); 2086 } 2087 2088 // The symbol table does not update all other sections on update. For 2089 // instance, symbol names are not added as new symbols are added. This means 2090 // that some sections, like .strtab, don't yet have their final size. 2091 if (Obj.SymbolTable != nullptr) 2092 Obj.SymbolTable->prepareForLayout(); 2093 2094 // Now that all strings are added we want to finalize string table builders, 2095 // because that affects section sizes which in turn affects section offsets. 2096 for (SectionBase &Sec : Obj.sections()) 2097 if (auto StrTab = dyn_cast<StringTableSection>(&Sec)) 2098 StrTab->prepareForLayout(); 2099 2100 assignOffsets(); 2101 2102 // layoutSections could have modified section indexes, so we need 2103 // to fill the index table after assignOffsets. 2104 if (Obj.SymbolTable != nullptr) 2105 Obj.SymbolTable->fillShndxTable(); 2106 2107 // Finally now that all offsets and indexes have been set we can finalize any 2108 // remaining issues. 2109 uint64_t Offset = Obj.SHOff + sizeof(Elf_Shdr); 2110 for (SectionBase &Sec : Obj.sections()) { 2111 Sec.HeaderOffset = Offset; 2112 Offset += sizeof(Elf_Shdr); 2113 if (WriteSectionHeaders) 2114 Sec.NameIndex = Obj.SectionNames->findIndex(Sec.Name); 2115 Sec.finalize(); 2116 } 2117 2118 if (Error E = Buf.allocate(totalSize())) 2119 return E; 2120 SecWriter = std::make_unique<ELFSectionWriter<ELFT>>(Buf); 2121 return Error::success(); 2122 } 2123 2124 Error BinaryWriter::write() { 2125 for (const SectionBase &Sec : Obj.allocSections()) 2126 Sec.accept(*SecWriter); 2127 return Buf.commit(); 2128 } 2129 2130 Error BinaryWriter::finalize() { 2131 // We need a temporary list of segments that has a special order to it 2132 // so that we know that anytime ->ParentSegment is set that segment has 2133 // already had it's offset properly set. We only want to consider the segments 2134 // that will affect layout of allocated sections so we only add those. 2135 std::vector<Segment *> OrderedSegments; 2136 for (const SectionBase &Sec : Obj.allocSections()) 2137 if (Sec.ParentSegment != nullptr) 2138 OrderedSegments.push_back(Sec.ParentSegment); 2139 2140 // For binary output, we're going to use physical addresses instead of 2141 // virtual addresses, since a binary output is used for cases like ROM 2142 // loading and physical addresses are intended for ROM loading. 2143 // However, if no segment has a physical address, we'll fallback to using 2144 // virtual addresses for all. 2145 if (all_of(OrderedSegments, 2146 [](const Segment *Seg) { return Seg->PAddr == 0; })) 2147 for (Segment *Seg : OrderedSegments) 2148 Seg->PAddr = Seg->VAddr; 2149 2150 llvm::stable_sort(OrderedSegments, compareSegmentsByPAddr); 2151 2152 // Because we add a ParentSegment for each section we might have duplicate 2153 // segments in OrderedSegments. If there were duplicates then layoutSegments 2154 // would do very strange things. 2155 auto End = 2156 std::unique(std::begin(OrderedSegments), std::end(OrderedSegments)); 2157 OrderedSegments.erase(End, std::end(OrderedSegments)); 2158 2159 uint64_t Offset = 0; 2160 2161 // Modify the first segment so that there is no gap at the start. This allows 2162 // our layout algorithm to proceed as expected while not writing out the gap 2163 // at the start. 2164 if (!OrderedSegments.empty()) { 2165 Segment *Seg = OrderedSegments[0]; 2166 const SectionBase *Sec = Seg->firstSection(); 2167 auto Diff = Sec->OriginalOffset - Seg->OriginalOffset; 2168 Seg->OriginalOffset += Diff; 2169 // The size needs to be shrunk as well. 2170 Seg->FileSize -= Diff; 2171 // The PAddr needs to be increased to remove the gap before the first 2172 // section. 2173 Seg->PAddr += Diff; 2174 uint64_t LowestPAddr = Seg->PAddr; 2175 for (Segment *Segment : OrderedSegments) { 2176 Segment->Offset = Segment->PAddr - LowestPAddr; 2177 Offset = std::max(Offset, Segment->Offset + Segment->FileSize); 2178 } 2179 } 2180 2181 layoutSections(Obj.allocSections(), Offset); 2182 2183 // Now that every section has been laid out we just need to compute the total 2184 // file size. This might not be the same as the offset returned by 2185 // layoutSections, because we want to truncate the last segment to the end of 2186 // its last section, to match GNU objcopy's behaviour. 2187 TotalSize = 0; 2188 for (const SectionBase &Sec : Obj.allocSections()) 2189 if (Sec.Type != SHT_NOBITS) 2190 TotalSize = std::max(TotalSize, Sec.Offset + Sec.Size); 2191 2192 if (Error E = Buf.allocate(TotalSize)) 2193 return E; 2194 SecWriter = std::make_unique<BinarySectionWriter>(Buf); 2195 return Error::success(); 2196 } 2197 2198 bool IHexWriter::SectionCompare::operator()(const SectionBase *Lhs, 2199 const SectionBase *Rhs) const { 2200 return (sectionPhysicalAddr(Lhs) & 0xFFFFFFFFU) < 2201 (sectionPhysicalAddr(Rhs) & 0xFFFFFFFFU); 2202 } 2203 2204 uint64_t IHexWriter::writeEntryPointRecord(uint8_t *Buf) { 2205 IHexLineData HexData; 2206 uint8_t Data[4] = {}; 2207 // We don't write entry point record if entry is zero. 2208 if (Obj.Entry == 0) 2209 return 0; 2210 2211 if (Obj.Entry <= 0xFFFFFU) { 2212 Data[0] = ((Obj.Entry & 0xF0000U) >> 12) & 0xFF; 2213 support::endian::write(&Data[2], static_cast<uint16_t>(Obj.Entry), 2214 support::big); 2215 HexData = IHexRecord::getLine(IHexRecord::StartAddr80x86, 0, Data); 2216 } else { 2217 support::endian::write(Data, static_cast<uint32_t>(Obj.Entry), 2218 support::big); 2219 HexData = IHexRecord::getLine(IHexRecord::StartAddr, 0, Data); 2220 } 2221 memcpy(Buf, HexData.data(), HexData.size()); 2222 return HexData.size(); 2223 } 2224 2225 uint64_t IHexWriter::writeEndOfFileRecord(uint8_t *Buf) { 2226 IHexLineData HexData = IHexRecord::getLine(IHexRecord::EndOfFile, 0, {}); 2227 memcpy(Buf, HexData.data(), HexData.size()); 2228 return HexData.size(); 2229 } 2230 2231 Error IHexWriter::write() { 2232 IHexSectionWriter Writer(Buf); 2233 // Write sections. 2234 for (const SectionBase *Sec : Sections) 2235 Sec->accept(Writer); 2236 2237 uint64_t Offset = Writer.getBufferOffset(); 2238 // Write entry point address. 2239 Offset += writeEntryPointRecord(Buf.getBufferStart() + Offset); 2240 // Write EOF. 2241 Offset += writeEndOfFileRecord(Buf.getBufferStart() + Offset); 2242 assert(Offset == TotalSize); 2243 return Buf.commit(); 2244 } 2245 2246 Error IHexWriter::checkSection(const SectionBase &Sec) { 2247 uint64_t Addr = sectionPhysicalAddr(&Sec); 2248 if (addressOverflows32bit(Addr) || addressOverflows32bit(Addr + Sec.Size - 1)) 2249 return createStringError( 2250 errc::invalid_argument, 2251 "Section '%s' address range [0x%llx, 0x%llx] is not 32 bit", Sec.Name.c_str(), 2252 Addr, Addr + Sec.Size - 1); 2253 return Error::success(); 2254 } 2255 2256 Error IHexWriter::finalize() { 2257 bool UseSegments = false; 2258 auto ShouldWrite = [](const SectionBase &Sec) { 2259 return (Sec.Flags & ELF::SHF_ALLOC) && (Sec.Type != ELF::SHT_NOBITS); 2260 }; 2261 auto IsInPtLoad = [](const SectionBase &Sec) { 2262 return Sec.ParentSegment && Sec.ParentSegment->Type == ELF::PT_LOAD; 2263 }; 2264 2265 // We can't write 64-bit addresses. 2266 if (addressOverflows32bit(Obj.Entry)) 2267 return createStringError(errc::invalid_argument, 2268 "Entry point address 0x%llx overflows 32 bits.", 2269 Obj.Entry); 2270 2271 // If any section we're to write has segment then we 2272 // switch to using physical addresses. Otherwise we 2273 // use section virtual address. 2274 for (const SectionBase &Sec : Obj.sections()) 2275 if (ShouldWrite(Sec) && IsInPtLoad(Sec)) { 2276 UseSegments = true; 2277 break; 2278 } 2279 2280 for (const SectionBase &Sec : Obj.sections()) 2281 if (ShouldWrite(Sec) && (!UseSegments || IsInPtLoad(Sec))) { 2282 if (Error E = checkSection(Sec)) 2283 return E; 2284 Sections.insert(&Sec); 2285 } 2286 2287 IHexSectionWriterBase LengthCalc(Buf); 2288 for (const SectionBase *Sec : Sections) 2289 Sec->accept(LengthCalc); 2290 2291 // We need space to write section records + StartAddress record 2292 // (if start adress is not zero) + EndOfFile record. 2293 TotalSize = LengthCalc.getBufferOffset() + 2294 (Obj.Entry ? IHexRecord::getLineLength(4) : 0) + 2295 IHexRecord::getLineLength(0); 2296 if (Error E = Buf.allocate(TotalSize)) 2297 return E; 2298 return Error::success(); 2299 } 2300 2301 template class ELFBuilder<ELF64LE>; 2302 template class ELFBuilder<ELF64BE>; 2303 template class ELFBuilder<ELF32LE>; 2304 template class ELFBuilder<ELF32BE>; 2305 2306 template class ELFWriter<ELF64LE>; 2307 template class ELFWriter<ELF64BE>; 2308 template class ELFWriter<ELF32LE>; 2309 template class ELFWriter<ELF32BE>; 2310 2311 } // end namespace elf 2312 } // end namespace objcopy 2313 } // end namespace llvm 2314