1 //===- Object.cpp ---------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
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"
28 #include <unordered_set>
36 using namespace object
;
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
;
53 Error
SectionBase::removeSectionReferences(
54 bool AllowBrokenLinks
,
55 function_ref
<bool(const SectionBase
*)> ToRemove
) {
56 return Error::success();
59 Error
SectionBase::removeSymbols(function_ref
<bool(const Symbol
&)> ToRemove
) {
60 return Error::success();
63 void SectionBase::initialize(SectionTableRef SecTable
) {}
64 void SectionBase::finalize() {}
65 void SectionBase::markSymbols() {}
66 void SectionBase::replaceSectionReferences(
67 const DenseMap
<SectionBase
*, SectionBase
*> &) {}
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
;
84 template <class ELFT
> void ELFSectionSizer
<ELFT
>::visit(Section
&Sec
) {}
87 void ELFSectionSizer
<ELFT
>::visit(OwnedDataSection
&Sec
) {}
90 void ELFSectionSizer
<ELFT
>::visit(StringTableSection
&Sec
) {}
93 void ELFSectionSizer
<ELFT
>::visit(DynamicRelocationSection
&Sec
) {}
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
);
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
);
111 template <class ELFT
>
112 void ELFSectionSizer
<ELFT
>::visit(GnuDebugLinkSection
&Sec
) {}
114 template <class ELFT
> void ELFSectionSizer
<ELFT
>::visit(GroupSection
&Sec
) {}
116 template <class ELFT
>
117 void ELFSectionSizer
<ELFT
>::visit(SectionIndexSection
&Sec
) {}
119 template <class ELFT
>
120 void ELFSectionSizer
<ELFT
>::visit(CompressedSection
&Sec
) {}
122 template <class ELFT
>
123 void ELFSectionSizer
<ELFT
>::visit(DecompressedSection
&Sec
) {}
125 void BinarySectionWriter::visit(const SectionIndexSection
&Sec
) {
126 error("cannot write symbol section index table '" + Sec
.Name
+ "' ");
129 void BinarySectionWriter::visit(const SymbolTableSection
&Sec
) {
130 error("cannot write symbol table '" + Sec
.Name
+ "' out to binary");
133 void BinarySectionWriter::visit(const RelocationSection
&Sec
) {
134 error("cannot write relocation section '" + Sec
.Name
+ "' out to binary");
137 void BinarySectionWriter::visit(const GnuDebugLinkSection
&Sec
) {
138 error("cannot write '" + Sec
.Name
+ "' out to binary");
141 void BinarySectionWriter::visit(const GroupSection
&Sec
) {
142 error("cannot write '" + Sec
.Name
+ "' out to binary");
145 void SectionWriter::visit(const Section
&Sec
) {
146 if (Sec
.Type
!= SHT_NOBITS
)
147 llvm::copy(Sec
.Contents
, Out
.getBufferStart() + Sec
.Offset
);
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
;
155 template <class T
> static T
checkedGetHex(StringRef S
) {
157 bool Fail
= S
.getAsInteger(16, Value
);
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');
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);
179 uint8_t IHexRecord::getChecksum(StringRef S
) {
180 assert((S
.size() & 1) == 0);
181 uint8_t Checksum
= 0;
183 Checksum
+= checkedGetHex
<uint8_t>(S
.take_front(2));
189 IHexLineData
IHexRecord::getLine(uint8_t Type
, uint16_t Addr
,
190 ArrayRef
<uint8_t> Data
) {
191 IHexLineData
Line(getLineLength(Data
.size()));
193 auto Iter
= Line
.begin();
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);
204 assert(Iter
== Line
.end());
208 static Error
checkRecord(const IHexRecord
&R
) {
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");
216 case IHexRecord::EndOfFile
:
218 case IHexRecord::SegmentAddr
:
219 // 20-bit segment address. Data length must be 2 bytes
221 if (R
.HexData
.size() != 4)
222 return createStringError(
223 errc::invalid_argument
,
224 "segment address data should be 2 bytes in size");
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");
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");
248 // Unknown record type
249 return createStringError(errc::invalid_argument
, "unknown record type: %u",
250 static_cast<unsigned>(R
.Type
));
252 return Error::success();
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());
261 return createStringError(errc::invalid_argument
,
262 "missing ':' in the beginning of line.");
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();
271 Expected
<IHexRecord
> IHexRecord::parse(StringRef Line
) {
272 assert(!Line
.empty());
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());
279 if (Error E
= checkChars(Line
))
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
));
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);
293 if (getChecksum(Line
.drop_front(1)) != 0)
294 return createStringError(errc::invalid_argument
, "incorrect checksum.");
295 if (Error E
= checkRecord(Rec
))
300 static uint64_t sectionPhysicalAddr(const SectionBase
*Sec
) {
301 Segment
*Seg
= Sec
->ParentSegment
;
302 if (Seg
&& Seg
->Type
!= ELF::PT_LOAD
)
304 return Seg
? Seg
->PAddr
+ Sec
->OriginalOffset
- Seg
->OriginalOffset
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
319 if (SegmentAddr
!= 0)
320 SegmentAddr
= writeSegmentAddr(0U);
321 BaseAddr
= writeBaseAddr(Addr
);
323 // We can still remain 16-bit
324 SegmentAddr
= writeSegmentAddr(Addr
);
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
));
332 Data
= Data
.drop_front(DataSize
);
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
;
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
);
352 void IHexSectionWriterBase::writeData(uint8_t Type
, uint16_t Addr
,
353 ArrayRef
<uint8_t> Data
) {
354 Offset
+= IHexRecord::getLineLength(Data
.size());
357 void IHexSectionWriterBase::visit(const Section
&Sec
) {
358 writeSection(&Sec
, Sec
.Contents
);
361 void IHexSectionWriterBase::visit(const OwnedDataSection
&Sec
) {
362 writeSection(&Sec
, Sec
.Data
);
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
)});
374 void IHexSectionWriterBase::visit(const DynamicRelocationSection
&Sec
) {
375 writeSection(&Sec
, Sec
.Contents
);
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();
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
);
392 void Section::accept(SectionVisitor
&Visitor
) const { Visitor
.visit(*this); }
394 void Section::accept(MutableSectionVisitor
&Visitor
) { Visitor
.visit(*this); }
396 void SectionWriter::visit(const OwnedDataSection
&Sec
) {
397 llvm::copy(Sec
.Data
, Out
.getBufferStart() + Sec
.Offset
);
400 static constexpr std::array
<uint8_t, 4> ZlibGnuMagic
= {'Z', 'L', 'I', 'B'};
402 static bool isDataGnuCompressed(ArrayRef
<uint8_t> Data
) {
403 return Data
.size() > ZlibGnuMagic
.size() &&
404 std::equal(ZlibGnuMagic
.begin(), ZlibGnuMagic
.end(), Data
.data());
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
=
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
=
417 : reinterpret_cast<const Elf_Chdr_Impl
<ELFT
> *>(Data
.data())
420 return std::make_tuple(DecompressedSize
, DecompressedAlign
);
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
>);
429 StringRef
CompressedContent(
430 reinterpret_cast<const char *>(Sec
.OriginalData
.data()) + DataOffset
,
431 Sec
.OriginalData
.size() - DataOffset
);
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
));
438 uint8_t *Buf
= Out
.getBufferStart() + Sec
.Offset
;
439 std::copy(DecompressedContent
.begin(), DecompressedContent
.end(), Buf
);
442 void BinarySectionWriter::visit(const DecompressedSection
&Sec
) {
443 error("cannot write compressed section '" + Sec
.Name
+ "' ");
446 void DecompressedSection::accept(SectionVisitor
&Visitor
) const {
447 Visitor
.visit(*this);
450 void DecompressedSection::accept(MutableSectionVisitor
&Visitor
) {
451 Visitor
.visit(*this);
454 void OwnedDataSection::accept(SectionVisitor
&Visitor
) const {
455 Visitor
.visit(*this);
458 void OwnedDataSection::accept(MutableSectionVisitor
&Visitor
) {
459 Visitor
.visit(*this);
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);
471 void BinarySectionWriter::visit(const CompressedSection
&Sec
) {
472 error("cannot write compressed section '" + Sec
.Name
+ "' ");
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
);
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
);
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
));
500 std::copy(Sec
.CompressedData
.begin(), Sec
.CompressedData
.end(), Buf
);
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()),
511 reportError(Name
, std::move(E
));
514 if (CompressionType
== DebugCompressionType::GNU
) {
515 Name
= ".z" + Sec
.Name
.substr(1);
516 ChdrSize
= sizeof("ZLIB") - 1 + sizeof(uint64_t);
518 Flags
|= ELF::SHF_COMPRESSED
;
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
>)));
525 Size
= ChdrSize
+ CompressedData
.size();
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
;
537 void CompressedSection::accept(SectionVisitor
&Visitor
) const {
538 Visitor
.visit(*this);
541 void CompressedSection::accept(MutableSectionVisitor
&Visitor
) {
542 Visitor
.visit(*this);
545 void StringTableSection::addString(StringRef Name
) { StrTabBuilder
.add(Name
); }
547 uint32_t StringTableSection::findIndex(StringRef Name
) const {
548 return StrTabBuilder
.getOffset(Name
);
551 void StringTableSection::prepareForLayout() {
552 StrTabBuilder
.finalize();
553 Size
= StrTabBuilder
.getSize();
556 void SectionWriter::visit(const StringTableSection
&Sec
) {
557 Sec
.StrTabBuilder
.write(Out
.getBufferStart() + Sec
.Offset
);
560 void StringTableSection::accept(SectionVisitor
&Visitor
) const {
561 Visitor
.visit(*this);
564 void StringTableSection::accept(MutableSectionVisitor
&Visitor
) {
565 Visitor
.visit(*this);
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
));
574 void SectionIndexSection::initialize(SectionTableRef SecTable
) {
576 setSymTab(SecTable
.getSectionOfType
<SymbolTableSection
>(
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);
584 void SectionIndexSection::finalize() { Link
= Symbols
->Index
; }
586 void SectionIndexSection::accept(SectionVisitor
&Visitor
) const {
587 Visitor
.visit(*this);
590 void SectionIndexSection::accept(MutableSectionVisitor
&Visitor
) {
591 Visitor
.visit(*this);
594 static bool isValidReservedSectionIndex(uint16_t Index
, uint16_t Machine
) {
601 if (Machine
== EM_AMDGPU
) {
602 return Index
== SHN_AMDGPU_LDS
;
605 if (Machine
== EM_HEXAGON
) {
607 case SHN_HEXAGON_SCOMMON
:
608 case SHN_HEXAGON_SCOMMON_2
:
609 case SHN_HEXAGON_SCOMMON_4
:
610 case SHN_HEXAGON_SCOMMON_8
:
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
620 uint16_t Symbol::getShndx() const {
621 if (DefinedIn
!= nullptr) {
622 if (DefinedIn
->Index
>= SHN_LORESERVE
)
624 return DefinedIn
->Index
;
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.
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
);
639 bool Symbol::isCommon() const { return getShndx() == SHN_COMMON
; }
641 void SymbolTableSection::assignIndices() {
643 for (auto &Sym
: Symbols
)
644 Sym
->Index
= Index
++;
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
) {
652 Sym
.Name
= Name
.str();
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
);
662 Sym
.ShndxType
= SYMBOL_SIMPLE_INDEX
;
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
;
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;
686 return removeSymbols(
687 [ToRemove
](const Symbol
&Sym
) { return ToRemove(Sym
.DefinedIn
); });
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
; });
699 Error
SymbolTableSection::removeSymbols(
700 function_ref
<bool(const Symbol
&)> ToRemove
) {
702 std::remove_if(std::begin(Symbols
) + 1, std::end(Symbols
),
703 [ToRemove
](const SymPtr
&Sym
) { return ToRemove(*Sym
); }),
705 Size
= Symbols
.size() * EntrySize
;
707 return Error::success();
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
))
717 void SymbolTableSection::initialize(SectionTableRef SecTable
) {
719 setStrTab(SecTable
.getSectionOfType
<StringTableSection
>(
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"));
727 void SymbolTableSection::finalize() {
728 uint32_t MaxLocalIndex
= 0;
729 for (std::unique_ptr
<Symbol
> &Sym
: Symbols
) {
731 SymbolNames
== nullptr ? 0 : SymbolNames
->findIndex(Sym
->Name
);
732 if (Sym
->Binding
== STB_LOCAL
)
733 MaxLocalIndex
= std::max(MaxLocalIndex
, Sym
->Index
);
735 // Now we need to set the Link and Info fields.
736 Link
= SymbolNames
== nullptr ? 0 : SymbolNames
->Index
;
737 Info
= MaxLocalIndex
+ 1;
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());
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
751 if (SymbolNames
!= nullptr)
752 for (std::unique_ptr
<Symbol
> &Sym
: Symbols
)
753 SymbolNames
->addString(Sym
->Name
);
756 void SymbolTableSection::fillShndxTable() {
757 if (SectionIndexTable
== nullptr)
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
);
765 SectionIndexTable
->addIndex(SHN_UNDEF
);
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();
775 Symbol
*SymbolTableSection::getSymbolByIndex(uint32_t Index
) {
776 return const_cast<Symbol
*>(
777 static_cast<const SymbolTableSection
*>(this)->getSymbolByIndex(Index
));
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();
796 void SymbolTableSection::accept(SectionVisitor
&Visitor
) const {
797 Visitor
.visit(*this);
800 void SymbolTableSection::accept(MutableSectionVisitor
&Visitor
) {
801 Visitor
.visit(*this);
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());
817 for (const Relocation
&R
: Relocations
) {
818 if (!R
.RelocSymbol
->DefinedIn
|| !ToRemove(R
.RelocSymbol
->DefinedIn
))
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());
828 return Error::success();
831 template <class SymTabType
>
832 void RelocSectionWithSymtabBase
<SymTabType
>::initialize(
833 SectionTableRef SecTable
) {
834 if (Link
!= SHN_UNDEF
)
835 setSymTab(SecTable
.getSectionOfType
<SymTabType
>(
837 "Link field value " + Twine(Link
) + " in section " + Name
+
839 "Link field value " + Twine(Link
) + " in section " + Name
+
840 " is not a symbol table"));
842 if (Info
!= SHN_UNDEF
)
843 setSection(SecTable
.getSection(Info
, "Info field value " + Twine(Info
) +
844 " in section " + Name
+
850 template <class SymTabType
>
851 void RelocSectionWithSymtabBase
<SymTabType
>::finalize() {
852 this->Link
= Symbols
? Symbols
->Index
: 0;
854 if (SecToApplyRel
!= nullptr)
855 this->Info
= SecToApplyRel
->Index
;
858 template <class ELFT
>
859 static void setAddend(Elf_Rel_Impl
<ELFT
, false> &Rel
, uint64_t Addend
) {}
861 template <class ELFT
>
862 static void setAddend(Elf_Rel_Impl
<ELFT
, true> &Rela
, uint64_t Addend
) {
863 Rela
.r_addend
= Addend
;
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);
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
));
882 writeRel(Sec
.Relocations
, reinterpret_cast<Elf_Rela
*>(Buf
));
885 void RelocationSection::accept(SectionVisitor
&Visitor
) const {
886 Visitor
.visit(*this);
889 void RelocationSection::accept(MutableSectionVisitor
&Visitor
) {
890 Visitor
.visit(*this);
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();
904 void RelocationSection::markSymbols() {
905 for (const Relocation
&Reloc
: Relocations
)
906 Reloc
.RelocSymbol
->Referenced
= true;
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
))
916 void SectionWriter::visit(const DynamicRelocationSection
&Sec
) {
917 llvm::copy(Sec
.Contents
, Out
.getBufferStart() + Sec
.Offset
);
920 void DynamicRelocationSection::accept(SectionVisitor
&Visitor
) const {
921 Visitor
.visit(*this);
924 void DynamicRelocationSection::accept(MutableSectionVisitor
&Visitor
) {
925 Visitor
.visit(*this);
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());
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();
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;
959 return Error::success();
962 void GroupSection::finalize() {
963 this->Info
= Sym
->Index
;
964 this->Link
= SymTab
->Index
;
967 Error
GroupSection::removeSymbols(function_ref
<bool(const Symbol
&)> ToRemove
) {
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();
976 void GroupSection::markSymbols() {
978 Sym
->Referenced
= true;
981 void GroupSection::replaceSectionReferences(
982 const DenseMap
<SectionBase
*, SectionBase
*> &FromTo
) {
983 for (SectionBase
*&Sec
: GroupMembers
)
984 if (SectionBase
*To
= FromTo
.lookup(Sec
))
988 void Section::initialize(SectionTableRef SecTable
) {
989 if (Link
== ELF::SHN_UNDEF
)
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;
998 void Section::finalize() { this->Link
= LinkSection
? LinkSection
->Index
: 0; }
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.
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();
1017 GnuDebugLinkSection::GnuDebugLinkSection(StringRef File
,
1018 uint32_t PrecomputedCRC
)
1019 : FileName(File
), CRC32(PrecomputedCRC
) {
1023 template <class ELFT
>
1024 void ELFSectionWriter
<ELFT
>::visit(const GnuDebugLinkSection
&Sec
) {
1025 unsigned char *Buf
= Out
.getBufferStart() + Sec
.Offset
;
1027 reinterpret_cast<Elf_Word
*>(Buf
+ Sec
.Size
- sizeof(Elf_Word
));
1029 llvm::copy(Sec
.FileName
, Buf
);
1032 void GnuDebugLinkSection::accept(SectionVisitor
&Visitor
) const {
1033 Visitor
.visit(*this);
1036 void GnuDebugLinkSection::accept(MutableSectionVisitor
&Visitor
) {
1037 Visitor
.visit(*this);
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
);
1049 void GroupSection::accept(SectionVisitor
&Visitor
) const {
1050 Visitor
.visit(*this);
1053 void GroupSection::accept(MutableSectionVisitor
&Visitor
) {
1054 Visitor
.visit(*this);
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
1063 uint64_t SecSize
= Sec
.Size
? Sec
.Size
: 1;
1065 if (Sec
.Type
== SHT_NOBITS
) {
1066 if (!(Sec
.Flags
& SHF_ALLOC
))
1069 bool SectionIsTLS
= Sec
.Flags
& SHF_TLS
;
1070 bool SegmentIsTLS
= Seg
.Type
== PT_TLS
;
1071 if (SectionIsTLS
!= SegmentIsTLS
)
1074 return Seg
.VAddr
<= Sec
.Addr
&&
1075 Seg
.VAddr
+ Seg
.MemSize
>= Sec
.Addr
+ SecSize
;
1078 return Seg
.Offset
<= Sec
.OriginalOffset
&&
1079 Seg
.Offset
+ Seg
.FileSize
>= Sec
.OriginalOffset
+ SecSize
;
1082 // Returns true IFF a segment's original offset is inside of another segment's
1084 static bool segmentOverlapsSegment(const Segment
&Child
,
1085 const Segment
&Parent
) {
1087 return Parent
.OriginalOffset
<= Child
.OriginalOffset
&&
1088 Parent
.OriginalOffset
+ Parent
.FileSize
> Child
.OriginalOffset
;
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
)
1096 if (A
->OriginalOffset
> B
->OriginalOffset
)
1098 return A
->Index
< B
->Index
;
1101 static bool compareSegmentsByPAddr(const Segment
*A
, const Segment
*B
) {
1102 if (A
->PAddr
< B
->PAddr
)
1104 if (A
->PAddr
> B
->PAddr
)
1106 return A
->Index
< B
->Index
;
1109 void BasicELFBuilder::initFileHeader() {
1112 Obj
->OSABI
= ELFOSABI_NONE
;
1113 Obj
->ABIVersion
= 0;
1115 Obj
->Machine
= EMachine
;
1119 void BasicELFBuilder::initHeaderSegment() { Obj
->ElfHdrSegment
.Index
= 0; }
1121 StringTableSection
*BasicELFBuilder::addStrTab() {
1122 auto &StrTab
= Obj
->addSection
<StringTableSection
>();
1123 StrTab
.Name
= ".strtab";
1125 Obj
->SectionNames
= &StrTab
;
1129 SymbolTableSection
*BasicELFBuilder::addSymTab(StringTableSection
*StrTab
) {
1130 auto &SymTab
= Obj
->addSection
<SymbolTableSection
>();
1132 SymTab
.Name
= ".symtab";
1133 SymTab
.Link
= StrTab
->Index
;
1135 // The symbol table always needs a null symbol
1136 SymTab
.addSymbol("", 0, 0, nullptr, 0, 0, 0, 0);
1138 Obj
->SymbolTable
= &SymTab
;
1142 void BasicELFBuilder::initSections() {
1143 for (SectionBase
&Sec
: Obj
->sections())
1144 Sec
.initialize(Obj
->sections());
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
;
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
;
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
,
1171 std::unique_ptr
<Object
> BinaryELFBuilder::build() {
1173 initHeaderSegment();
1175 SymbolTableSection
*SymTab
= addSymTab(addStrTab());
1179 return std::move(Obj
);
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;
1189 for (const IHexRecord
&R
: Records
) {
1192 case IHexRecord::Data
:
1193 // Ignore empty data records
1194 if (R
.HexData
.empty())
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
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
);
1206 case IHexRecord::EndOfFile
:
1208 case IHexRecord::SegmentAddr
:
1209 // 20-bit segment address.
1210 SegmentAddr
= checkedGetHex
<uint16_t>(R
.HexData
) << 4;
1212 case IHexRecord::StartAddr80x86
:
1213 case IHexRecord::StartAddr
:
1214 Obj
->Entry
= checkedGetHex
<uint32_t>(R
.HexData
);
1215 assert(Obj
->Entry
<= 0xFFFFFU
);
1217 case IHexRecord::ExtendedAddr
:
1218 // 16-31 bits of linear base address
1219 BaseAddr
= checkedGetHex
<uint16_t>(R
.HexData
) << 16;
1222 llvm_unreachable("unknown record type");
1227 std::unique_ptr
<Object
> IHexELFBuilder::build() {
1229 initHeaderSegment();
1230 StringTableSection
*StrTab
= addStrTab();
1235 return std::move(Obj
);
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
;
1254 template <class ELFT
> void ELFBuilder
<ELFT
>::findEhdrOffset() {
1255 if (!ExtractPartition
)
1258 for (const SectionBase
&Sec
: Obj
.sections()) {
1259 if (Sec
.Type
== SHT_LLVM_PART_EHDR
&& Sec
.Name
== *ExtractPartition
) {
1260 EhdrOffset
= Sec
.Offset
;
1264 error("could not find partition named '" + *ExtractPartition
+ "'");
1267 template <class ELFT
>
1268 void ELFBuilder
<ELFT
>::readProgramHeaders(const ELFFile
<ELFT
> &HeadersFile
) {
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");
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
;
1297 auto &ElfHdr
= Obj
.ElfHdrSegment
;
1298 ElfHdr
.Index
= Index
++;
1299 ElfHdr
.OriginalOffset
= ElfHdr
.Offset
= EhdrOffset
;
1301 const auto &Ehdr
= *HeadersFile
.getHeader();
1302 auto &PrHdr
= Obj
.ProgramHdrSegment
;
1303 PrHdr
.Type
= PT_PHDR
;
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
1309 PrHdr
.OriginalOffset
= PrHdr
.Offset
= PrHdr
.VAddr
= EhdrOffset
+ Ehdr
.e_phoff
;
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
++;
1316 // Now we do an O(n^2) loop through the segments in order to match up
1318 for (Segment
&Child
: Obj
.segments())
1319 setParentSegment(Child
);
1320 setParentSegment(ElfHdr
);
1321 setParentSegment(PrHdr
);
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
>(
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
);
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"));
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
;
1364 auto Symbols
= unwrapOrError(ElfFile
.symbols(&Shdr
));
1365 for (const auto &Sym
: Symbols
) {
1366 SectionBase
*DefSection
= nullptr;
1367 StringRef Name
= unwrapOrError(Sym
.getName(StrTabData
));
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");
1382 Elf_Word Index
= ShndxData
[&Sym
- Symbols
.begin()];
1383 DefSection
= Obj
.sections().getSection(
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
)) {
1390 "' has unsupported value greater than or equal to SHN_LORESERVE: " +
1391 Twine(Sym
.st_shndx
));
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
));
1400 SymTab
->addSymbol(Name
, Sym
.getBinding(), Sym
.getType(), DefSection
,
1401 Sym
.getValue(), Sym
.st_other
, Sym
.st_shndx
, Sym
.st_size
);
1405 template <class ELFT
>
1406 static void getAddend(uint64_t &ToSet
, const Elf_Rel_Impl
<ELFT
, false> &Rel
) {}
1408 template <class ELFT
>
1409 static void getAddend(uint64_t &ToSet
, const Elf_Rel_Impl
<ELFT
, true> &Rela
) {
1410 ToSet
= Rela
.r_addend
;
1414 static void initRelocations(RelocationSection
*Relocs
,
1415 SymbolTableSection
*SymbolTable
, T RelRange
) {
1416 for (const auto &Rel
: RelRange
) {
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
);
1426 SectionBase
*SectionTableRef::getSection(uint32_t Index
, Twine ErrMsg
) {
1427 if (Index
== SHN_UNDEF
|| Index
> Sections
.size())
1429 return Sections
[Index
- 1].get();
1433 T
*SectionTableRef::getSectionOfType(uint32_t Index
, Twine IndexErrMsg
,
1435 if (T
*Sec
= dyn_cast
<T
>(getSection(Index
, IndexErrMsg
)))
1440 template <class ELFT
>
1441 SectionBase
&ELFBuilder
<ELFT
>::makeSection(const Elf_Shdr
&Shdr
) {
1442 ArrayRef
<uint8_t> Data
;
1443 switch (Shdr
.sh_type
) {
1446 if (Shdr
.sh_flags
& SHF_ALLOC
) {
1447 Data
= unwrapOrError(ElfFile
.getSectionContents(&Shdr
));
1448 return Obj
.addSection
<DynamicRelocationSection
>(Data
);
1450 return Obj
.addSection
<RelocationSection
>();
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
);
1459 return Obj
.addSection
<StringTableSection
>();
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
);
1467 Data
= unwrapOrError(ElfFile
.getSectionContents(&Shdr
));
1468 return Obj
.addSection
<GroupSection
>(Data
);
1470 Data
= unwrapOrError(ElfFile
.getSectionContents(&Shdr
));
1471 return Obj
.addSection
<DynamicSymbolTableSection
>(Data
);
1473 Data
= unwrapOrError(ElfFile
.getSectionContents(&Shdr
));
1474 return Obj
.addSection
<DynamicSection
>(Data
);
1476 auto &SymTab
= Obj
.addSection
<SymbolTableSection
>();
1477 Obj
.SymbolTable
= &SymTab
;
1480 case SHT_SYMTAB_SHNDX
: {
1481 auto &ShndxSection
= Obj
.addSection
<SectionIndexSection
>();
1482 Obj
.SectionIndexTable
= &ShndxSection
;
1483 return ShndxSection
;
1486 return Obj
.addSection
<Section
>(Data
);
1488 Data
= unwrapOrError(ElfFile
.getSectionContents(&Shdr
));
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
,
1499 return Obj
.addSection
<Section
>(Data
);
1504 template <class ELFT
> void ELFBuilder
<ELFT
>::readSectionHeaders() {
1506 for (const auto &Shdr
: unwrapOrError(ElfFile
.sections())) {
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
++;
1525 ArrayRef
<uint8_t>(ElfFile
.base() + Shdr
.sh_offset
,
1526 (Shdr
.sh_type
== SHT_NOBITS
) ? 0 : Shdr
.sh_size
);
1530 template <class ELFT
> void ELFBuilder
<ELFT
>::readSections() {
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
1534 if (Obj
.SectionIndexTable
)
1535 Obj
.SectionIndexTable
->initialize(Obj
.sections());
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
1540 if (Obj
.SymbolTable
) {
1541 Obj
.SymbolTable
->initialize(Obj
.sections());
1542 initSymbolTable(Obj
.SymbolTable
);
1545 // Now that all sections and symbols have been added we can add
1546 // relocations that reference symbols and set the link and info fields for
1547 // relocation sections.
1548 for (auto &Sec
: Obj
.sections()) {
1549 if (&Sec
== Obj
.SymbolTable
)
1551 Sec
.initialize(Obj
.sections());
1552 if (auto RelSec
= dyn_cast
<RelocationSection
>(&Sec
)) {
1553 auto Shdr
= unwrapOrError(ElfFile
.sections()).begin() + RelSec
->Index
;
1554 if (RelSec
->Type
== SHT_REL
)
1555 initRelocations(RelSec
, Obj
.SymbolTable
,
1556 unwrapOrError(ElfFile
.rels(Shdr
)));
1558 initRelocations(RelSec
, Obj
.SymbolTable
,
1559 unwrapOrError(ElfFile
.relas(Shdr
)));
1560 } else if (auto GroupSec
= dyn_cast
<GroupSection
>(&Sec
)) {
1561 initGroupSection(GroupSec
);
1565 uint32_t ShstrIndex
= ElfFile
.getHeader()->e_shstrndx
;
1566 if (ShstrIndex
== SHN_XINDEX
)
1567 ShstrIndex
= unwrapOrError(ElfFile
.getSection(0))->sh_link
;
1569 if (ShstrIndex
== SHN_UNDEF
)
1570 Obj
.HadShdrs
= false;
1573 Obj
.sections().template getSectionOfType
<StringTableSection
>(
1575 "e_shstrndx field value " + Twine(ShstrIndex
) + " in elf header " +
1577 "e_shstrndx field value " + Twine(ShstrIndex
) + " in elf header " +
1578 " is not a string table");
1581 template <class ELFT
> void ELFBuilder
<ELFT
>::build() {
1582 readSectionHeaders();
1585 // The ELFFile whose ELF headers and program headers are copied into the
1586 // output file. Normally the same as ElfFile, but if we're extracting a
1587 // loadable partition it will point to the partition's headers.
1588 ELFFile
<ELFT
> HeadersFile
= unwrapOrError(ELFFile
<ELFT
>::create(toStringRef(
1589 {ElfFile
.base() + EhdrOffset
, ElfFile
.getBufSize() - EhdrOffset
})));
1591 auto &Ehdr
= *HeadersFile
.getHeader();
1592 Obj
.OSABI
= Ehdr
.e_ident
[EI_OSABI
];
1593 Obj
.ABIVersion
= Ehdr
.e_ident
[EI_ABIVERSION
];
1594 Obj
.Type
= Ehdr
.e_type
;
1595 Obj
.Machine
= Ehdr
.e_machine
;
1596 Obj
.Version
= Ehdr
.e_version
;
1597 Obj
.Entry
= Ehdr
.e_entry
;
1598 Obj
.Flags
= Ehdr
.e_flags
;
1601 readProgramHeaders(HeadersFile
);
1604 Writer::~Writer() {}
1606 Reader::~Reader() {}
1608 std::unique_ptr
<Object
> BinaryReader::create() const {
1609 return BinaryELFBuilder(MInfo
.EMachine
, MemBuf
, NewSymbolVisibility
).build();
1612 Expected
<std::vector
<IHexRecord
>> IHexReader::parse() const {
1613 SmallVector
<StringRef
, 16> Lines
;
1614 std::vector
<IHexRecord
> Records
;
1615 bool HasSections
= false;
1617 MemBuf
->getBuffer().split(Lines
, '\n');
1618 Records
.reserve(Lines
.size());
1619 for (size_t LineNo
= 1; LineNo
<= Lines
.size(); ++LineNo
) {
1620 StringRef Line
= Lines
[LineNo
- 1].trim();
1624 Expected
<IHexRecord
> R
= IHexRecord::parse(Line
);
1626 return parseError(LineNo
, R
.takeError());
1627 if (R
->Type
== IHexRecord::EndOfFile
)
1629 HasSections
|= (R
->Type
== IHexRecord::Data
);
1630 Records
.push_back(*R
);
1633 return parseError(-1U, "no sections");
1635 return std::move(Records
);
1638 std::unique_ptr
<Object
> IHexReader::create() const {
1639 std::vector
<IHexRecord
> Records
= unwrapOrError(parse());
1640 return IHexELFBuilder(Records
).build();
1643 std::unique_ptr
<Object
> ELFReader::create() const {
1644 auto Obj
= std::make_unique
<Object
>();
1645 if (auto *O
= dyn_cast
<ELFObjectFile
<ELF32LE
>>(Bin
)) {
1646 ELFBuilder
<ELF32LE
> Builder(*O
, *Obj
, ExtractPartition
);
1649 } else if (auto *O
= dyn_cast
<ELFObjectFile
<ELF64LE
>>(Bin
)) {
1650 ELFBuilder
<ELF64LE
> Builder(*O
, *Obj
, ExtractPartition
);
1653 } else if (auto *O
= dyn_cast
<ELFObjectFile
<ELF32BE
>>(Bin
)) {
1654 ELFBuilder
<ELF32BE
> Builder(*O
, *Obj
, ExtractPartition
);
1657 } else if (auto *O
= dyn_cast
<ELFObjectFile
<ELF64BE
>>(Bin
)) {
1658 ELFBuilder
<ELF64BE
> Builder(*O
, *Obj
, ExtractPartition
);
1662 error("invalid file type");
1665 template <class ELFT
> void ELFWriter
<ELFT
>::writeEhdr() {
1666 Elf_Ehdr
&Ehdr
= *reinterpret_cast<Elf_Ehdr
*>(Buf
.getBufferStart());
1667 std::fill(Ehdr
.e_ident
, Ehdr
.e_ident
+ 16, 0);
1668 Ehdr
.e_ident
[EI_MAG0
] = 0x7f;
1669 Ehdr
.e_ident
[EI_MAG1
] = 'E';
1670 Ehdr
.e_ident
[EI_MAG2
] = 'L';
1671 Ehdr
.e_ident
[EI_MAG3
] = 'F';
1672 Ehdr
.e_ident
[EI_CLASS
] = ELFT::Is64Bits
? ELFCLASS64
: ELFCLASS32
;
1673 Ehdr
.e_ident
[EI_DATA
] =
1674 ELFT::TargetEndianness
== support::big
? ELFDATA2MSB
: ELFDATA2LSB
;
1675 Ehdr
.e_ident
[EI_VERSION
] = EV_CURRENT
;
1676 Ehdr
.e_ident
[EI_OSABI
] = Obj
.OSABI
;
1677 Ehdr
.e_ident
[EI_ABIVERSION
] = Obj
.ABIVersion
;
1679 Ehdr
.e_type
= Obj
.Type
;
1680 Ehdr
.e_machine
= Obj
.Machine
;
1681 Ehdr
.e_version
= Obj
.Version
;
1682 Ehdr
.e_entry
= Obj
.Entry
;
1683 // We have to use the fully-qualified name llvm::size
1684 // since some compilers complain on ambiguous resolution.
1685 Ehdr
.e_phnum
= llvm::size(Obj
.segments());
1686 Ehdr
.e_phoff
= (Ehdr
.e_phnum
!= 0) ? Obj
.ProgramHdrSegment
.Offset
: 0;
1687 Ehdr
.e_phentsize
= (Ehdr
.e_phnum
!= 0) ? sizeof(Elf_Phdr
) : 0;
1688 Ehdr
.e_flags
= Obj
.Flags
;
1689 Ehdr
.e_ehsize
= sizeof(Elf_Ehdr
);
1690 if (WriteSectionHeaders
&& Obj
.sections().size() != 0) {
1691 Ehdr
.e_shentsize
= sizeof(Elf_Shdr
);
1692 Ehdr
.e_shoff
= Obj
.SHOff
;
1694 // If the number of sections is greater than or equal to
1695 // SHN_LORESERVE (0xff00), this member has the value zero and the actual
1696 // number of section header table entries is contained in the sh_size field
1697 // of the section header at index 0.
1699 auto Shnum
= Obj
.sections().size() + 1;
1700 if (Shnum
>= SHN_LORESERVE
)
1703 Ehdr
.e_shnum
= Shnum
;
1705 // If the section name string table section index is greater than or equal
1706 // to SHN_LORESERVE (0xff00), this member has the value SHN_XINDEX (0xffff)
1707 // and the actual index of the section name string table section is
1708 // contained in the sh_link field of the section header at index 0.
1710 if (Obj
.SectionNames
->Index
>= SHN_LORESERVE
)
1711 Ehdr
.e_shstrndx
= SHN_XINDEX
;
1713 Ehdr
.e_shstrndx
= Obj
.SectionNames
->Index
;
1715 Ehdr
.e_shentsize
= 0;
1718 Ehdr
.e_shstrndx
= 0;
1722 template <class ELFT
> void ELFWriter
<ELFT
>::writePhdrs() {
1723 for (auto &Seg
: Obj
.segments())
1727 template <class ELFT
> void ELFWriter
<ELFT
>::writeShdrs() {
1728 // This reference serves to write the dummy section header at the begining
1729 // of the file. It is not used for anything else
1731 *reinterpret_cast<Elf_Shdr
*>(Buf
.getBufferStart() + Obj
.SHOff
);
1733 Shdr
.sh_type
= SHT_NULL
;
1737 // See writeEhdr for why we do this.
1738 uint64_t Shnum
= Obj
.sections().size() + 1;
1739 if (Shnum
>= SHN_LORESERVE
)
1740 Shdr
.sh_size
= Shnum
;
1743 // See writeEhdr for why we do this.
1744 if (Obj
.SectionNames
!= nullptr && Obj
.SectionNames
->Index
>= SHN_LORESERVE
)
1745 Shdr
.sh_link
= Obj
.SectionNames
->Index
;
1749 Shdr
.sh_addralign
= 0;
1750 Shdr
.sh_entsize
= 0;
1752 for (SectionBase
&Sec
: Obj
.sections())
1756 template <class ELFT
> void ELFWriter
<ELFT
>::writeSectionData() {
1757 for (SectionBase
&Sec
: Obj
.sections())
1758 // Segments are responsible for writing their contents, so only write the
1759 // section data if the section is not in a segment. Note that this renders
1760 // sections in segments effectively immutable.
1761 if (Sec
.ParentSegment
== nullptr)
1762 Sec
.accept(*SecWriter
);
1765 template <class ELFT
> void ELFWriter
<ELFT
>::writeSegmentData() {
1766 for (Segment
&Seg
: Obj
.segments()) {
1767 uint8_t *B
= Buf
.getBufferStart() + Seg
.Offset
;
1768 assert(Seg
.FileSize
== Seg
.getContents().size() &&
1769 "Segment size must match contents size");
1770 std::memcpy(B
, Seg
.getContents().data(), Seg
.FileSize
);
1773 // Iterate over removed sections and overwrite their old data with zeroes.
1774 for (auto &Sec
: Obj
.removedSections()) {
1775 Segment
*Parent
= Sec
.ParentSegment
;
1776 if (Parent
== nullptr || Sec
.Type
== SHT_NOBITS
|| Sec
.Size
== 0)
1779 Sec
.OriginalOffset
- Parent
->OriginalOffset
+ Parent
->Offset
;
1780 std::memset(Buf
.getBufferStart() + Offset
, 0, Sec
.Size
);
1784 template <class ELFT
>
1785 ELFWriter
<ELFT
>::ELFWriter(Object
&Obj
, Buffer
&Buf
, bool WSH
)
1786 : Writer(Obj
, Buf
), WriteSectionHeaders(WSH
&& Obj
.HadShdrs
) {}
1788 Error
Object::removeSections(bool AllowBrokenLinks
,
1789 std::function
<bool(const SectionBase
&)> ToRemove
) {
1791 auto Iter
= std::stable_partition(
1792 std::begin(Sections
), std::end(Sections
), [=](const SecPtr
&Sec
) {
1795 if (auto RelSec
= dyn_cast
<RelocationSectionBase
>(Sec
.get())) {
1796 if (auto ToRelSec
= RelSec
->getSection())
1797 return !ToRemove(*ToRelSec
);
1801 if (SymbolTable
!= nullptr && ToRemove(*SymbolTable
))
1802 SymbolTable
= nullptr;
1803 if (SectionNames
!= nullptr && ToRemove(*SectionNames
))
1804 SectionNames
= nullptr;
1805 if (SectionIndexTable
!= nullptr && ToRemove(*SectionIndexTable
))
1806 SectionIndexTable
= nullptr;
1807 // Now make sure there are no remaining references to the sections that will
1808 // be removed. Sometimes it is impossible to remove a reference so we emit
1809 // an error here instead.
1810 std::unordered_set
<const SectionBase
*> RemoveSections
;
1811 RemoveSections
.reserve(std::distance(Iter
, std::end(Sections
)));
1812 for (auto &RemoveSec
: make_range(Iter
, std::end(Sections
))) {
1813 for (auto &Segment
: Segments
)
1814 Segment
->removeSection(RemoveSec
.get());
1815 RemoveSections
.insert(RemoveSec
.get());
1818 // For each section that remains alive, we want to remove the dead references.
1819 // This either might update the content of the section (e.g. remove symbols
1820 // from symbol table that belongs to removed section) or trigger an error if
1821 // a live section critically depends on a section being removed somehow
1822 // (e.g. the removed section is referenced by a relocation).
1823 for (auto &KeepSec
: make_range(std::begin(Sections
), Iter
)) {
1824 if (Error E
= KeepSec
->removeSectionReferences(AllowBrokenLinks
,
1825 [&RemoveSections
](const SectionBase
*Sec
) {
1826 return RemoveSections
.find(Sec
) != RemoveSections
.end();
1831 // Transfer removed sections into the Object RemovedSections container for use
1833 std::move(Iter
, Sections
.end(), std::back_inserter(RemovedSections
));
1834 // Now finally get rid of them all together.
1835 Sections
.erase(Iter
, std::end(Sections
));
1836 return Error::success();
1839 Error
Object::removeSymbols(function_ref
<bool(const Symbol
&)> ToRemove
) {
1841 for (const SecPtr
&Sec
: Sections
)
1842 if (Error E
= Sec
->removeSymbols(ToRemove
))
1844 return Error::success();
1847 void Object::sortSections() {
1848 // Use stable_sort to maintain the original ordering as closely as possible.
1849 llvm::stable_sort(Sections
, [](const SecPtr
&A
, const SecPtr
&B
) {
1850 // Put SHT_GROUP sections first, since group section headers must come
1851 // before the sections they contain. This also matches what GNU objcopy
1853 if (A
->Type
!= B
->Type
&&
1854 (A
->Type
== ELF::SHT_GROUP
|| B
->Type
== ELF::SHT_GROUP
))
1855 return A
->Type
== ELF::SHT_GROUP
;
1856 // For all other sections, sort by offset order.
1857 return A
->OriginalOffset
< B
->OriginalOffset
;
1861 // Orders segments such that if x = y->ParentSegment then y comes before x.
1862 static void orderSegments(std::vector
<Segment
*> &Segments
) {
1863 llvm::stable_sort(Segments
, compareSegmentsByOffset
);
1866 // This function finds a consistent layout for a list of segments starting from
1867 // an Offset. It assumes that Segments have been sorted by orderSegments and
1868 // returns an Offset one past the end of the last segment.
1869 static uint64_t layoutSegments(std::vector
<Segment
*> &Segments
,
1871 assert(std::is_sorted(std::begin(Segments
), std::end(Segments
),
1872 compareSegmentsByOffset
));
1873 // The only way a segment should move is if a section was between two
1874 // segments and that section was removed. If that section isn't in a segment
1875 // then it's acceptable, but not ideal, to simply move it to after the
1876 // segments. So we can simply layout segments one after the other accounting
1878 for (Segment
*Seg
: Segments
) {
1879 // We assume that segments have been ordered by OriginalOffset and Index
1880 // such that a parent segment will always come before a child segment in
1881 // OrderedSegments. This means that the Offset of the ParentSegment should
1882 // already be set and we can set our offset relative to it.
1883 if (Seg
->ParentSegment
!= nullptr) {
1884 Segment
*Parent
= Seg
->ParentSegment
;
1886 Parent
->Offset
+ Seg
->OriginalOffset
- Parent
->OriginalOffset
;
1889 alignTo(Offset
, std::max
<uint64_t>(Seg
->Align
, 1), Seg
->VAddr
);
1891 Offset
= std::max(Offset
, Seg
->Offset
+ Seg
->FileSize
);
1896 // This function finds a consistent layout for a list of sections. It assumes
1897 // that the ->ParentSegment of each section has already been laid out. The
1898 // supplied starting Offset is used for the starting offset of any section that
1899 // does not have a ParentSegment. It returns either the offset given if all
1900 // sections had a ParentSegment or an offset one past the last section if there
1901 // was a section that didn't have a ParentSegment.
1902 template <class Range
>
1903 static uint64_t layoutSections(Range Sections
, uint64_t Offset
) {
1904 // Now the offset of every segment has been set we can assign the offsets
1905 // of each section. For sections that are covered by a segment we should use
1906 // the segment's original offset and the section's original offset to compute
1907 // the offset from the start of the segment. Using the offset from the start
1908 // of the segment we can assign a new offset to the section. For sections not
1909 // covered by segments we can just bump Offset to the next valid location.
1911 for (auto &Sec
: Sections
) {
1912 Sec
.Index
= Index
++;
1913 if (Sec
.ParentSegment
!= nullptr) {
1914 auto Segment
= *Sec
.ParentSegment
;
1916 Segment
.Offset
+ (Sec
.OriginalOffset
- Segment
.OriginalOffset
);
1918 Offset
= alignTo(Offset
, Sec
.Align
== 0 ? 1 : Sec
.Align
);
1919 Sec
.Offset
= Offset
;
1920 if (Sec
.Type
!= SHT_NOBITS
)
1927 template <class ELFT
> void ELFWriter
<ELFT
>::initEhdrSegment() {
1928 Segment
&ElfHdr
= Obj
.ElfHdrSegment
;
1929 ElfHdr
.Type
= PT_PHDR
;
1933 ElfHdr
.FileSize
= ElfHdr
.MemSize
= sizeof(Elf_Ehdr
);
1937 template <class ELFT
> void ELFWriter
<ELFT
>::assignOffsets() {
1938 // We need a temporary list of segments that has a special order to it
1939 // so that we know that anytime ->ParentSegment is set that segment has
1940 // already had its offset properly set.
1941 std::vector
<Segment
*> OrderedSegments
;
1942 for (Segment
&Segment
: Obj
.segments())
1943 OrderedSegments
.push_back(&Segment
);
1944 OrderedSegments
.push_back(&Obj
.ElfHdrSegment
);
1945 OrderedSegments
.push_back(&Obj
.ProgramHdrSegment
);
1946 orderSegments(OrderedSegments
);
1947 // Offset is used as the start offset of the first segment to be laid out.
1948 // Since the ELF Header (ElfHdrSegment) must be at the start of the file,
1949 // we start at offset 0.
1950 uint64_t Offset
= 0;
1951 Offset
= layoutSegments(OrderedSegments
, Offset
);
1952 Offset
= layoutSections(Obj
.sections(), Offset
);
1953 // If we need to write the section header table out then we need to align the
1954 // Offset so that SHOffset is valid.
1955 if (WriteSectionHeaders
)
1956 Offset
= alignTo(Offset
, sizeof(Elf_Addr
));
1960 template <class ELFT
> size_t ELFWriter
<ELFT
>::totalSize() const {
1961 // We already have the section header offset so we can calculate the total
1962 // size by just adding up the size of each section header.
1963 if (!WriteSectionHeaders
)
1965 size_t ShdrCount
= Obj
.sections().size() + 1; // Includes null shdr.
1966 return Obj
.SHOff
+ ShdrCount
* sizeof(Elf_Shdr
);
1969 template <class ELFT
> Error ELFWriter
<ELFT
>::write() {
1970 // Segment data must be written first, so that the ELF header and program
1971 // header tables can overwrite it, if covered by a segment.
1976 if (WriteSectionHeaders
)
1978 return Buf
.commit();
1981 static Error
removeUnneededSections(Object
&Obj
) {
1982 // We can remove an empty symbol table from non-relocatable objects.
1983 // Relocatable objects typically have relocation sections whose
1984 // sh_link field points to .symtab, so we can't remove .symtab
1985 // even if it is empty.
1986 if (Obj
.isRelocatable() || Obj
.SymbolTable
== nullptr ||
1987 !Obj
.SymbolTable
->empty())
1988 return Error::success();
1990 // .strtab can be used for section names. In such a case we shouldn't
1992 auto *StrTab
= Obj
.SymbolTable
->getStrTab() == Obj
.SectionNames
1994 : Obj
.SymbolTable
->getStrTab();
1995 return Obj
.removeSections(false, [&](const SectionBase
&Sec
) {
1996 return &Sec
== Obj
.SymbolTable
|| &Sec
== StrTab
;
2000 template <class ELFT
> Error ELFWriter
<ELFT
>::finalize() {
2001 // It could happen that SectionNames has been removed and yet the user wants
2002 // a section header table output. We need to throw an error if a user tries
2004 if (Obj
.SectionNames
== nullptr && WriteSectionHeaders
)
2005 return createStringError(llvm::errc::invalid_argument
,
2006 "cannot write section header table because "
2007 "section header string table was removed");
2009 if (Error E
= removeUnneededSections(Obj
))
2013 // We need to assign indexes before we perform layout because we need to know
2014 // if we need large indexes or not. We can assign indexes first and check as
2015 // we go to see if we will actully need large indexes.
2016 bool NeedsLargeIndexes
= false;
2017 if (Obj
.sections().size() >= SHN_LORESERVE
) {
2018 SectionTableRef Sections
= Obj
.sections();
2020 std::any_of(Sections
.begin() + SHN_LORESERVE
, Sections
.end(),
2021 [](const SectionBase
&Sec
) { return Sec
.HasSymbol
; });
2022 // TODO: handle case where only one section needs the large index table but
2023 // only needs it because the large index table hasn't been removed yet.
2026 if (NeedsLargeIndexes
) {
2027 // This means we definitely need to have a section index table but if we
2028 // already have one then we should use it instead of making a new one.
2029 if (Obj
.SymbolTable
!= nullptr && Obj
.SectionIndexTable
== nullptr) {
2030 // Addition of a section to the end does not invalidate the indexes of
2031 // other sections and assigns the correct index to the new section.
2032 auto &Shndx
= Obj
.addSection
<SectionIndexSection
>();
2033 Obj
.SymbolTable
->setShndxTable(&Shndx
);
2034 Shndx
.setSymTab(Obj
.SymbolTable
);
2037 // Since we don't need SectionIndexTable we should remove it and all
2038 // references to it.
2039 if (Obj
.SectionIndexTable
!= nullptr) {
2040 // We do not support sections referring to the section index table.
2041 if (Error E
= Obj
.removeSections(false /*AllowBrokenLinks*/,
2042 [this](const SectionBase
&Sec
) {
2043 return &Sec
== Obj
.SectionIndexTable
;
2049 // Make sure we add the names of all the sections. Importantly this must be
2050 // done after we decide to add or remove SectionIndexes.
2051 if (Obj
.SectionNames
!= nullptr)
2052 for (const SectionBase
&Sec
: Obj
.sections())
2053 Obj
.SectionNames
->addString(Sec
.Name
);
2057 // Before we can prepare for layout the indexes need to be finalized.
2058 // Also, the output arch may not be the same as the input arch, so fix up
2059 // size-related fields before doing layout calculations.
2061 auto SecSizer
= std::make_unique
<ELFSectionSizer
<ELFT
>>();
2062 for (SectionBase
&Sec
: Obj
.sections()) {
2063 Sec
.Index
= Index
++;
2064 Sec
.accept(*SecSizer
);
2067 // The symbol table does not update all other sections on update. For
2068 // instance, symbol names are not added as new symbols are added. This means
2069 // that some sections, like .strtab, don't yet have their final size.
2070 if (Obj
.SymbolTable
!= nullptr)
2071 Obj
.SymbolTable
->prepareForLayout();
2073 // Now that all strings are added we want to finalize string table builders,
2074 // because that affects section sizes which in turn affects section offsets.
2075 for (SectionBase
&Sec
: Obj
.sections())
2076 if (auto StrTab
= dyn_cast
<StringTableSection
>(&Sec
))
2077 StrTab
->prepareForLayout();
2081 // layoutSections could have modified section indexes, so we need
2082 // to fill the index table after assignOffsets.
2083 if (Obj
.SymbolTable
!= nullptr)
2084 Obj
.SymbolTable
->fillShndxTable();
2086 // Finally now that all offsets and indexes have been set we can finalize any
2087 // remaining issues.
2088 uint64_t Offset
= Obj
.SHOff
+ sizeof(Elf_Shdr
);
2089 for (SectionBase
&Sec
: Obj
.sections()) {
2090 Sec
.HeaderOffset
= Offset
;
2091 Offset
+= sizeof(Elf_Shdr
);
2092 if (WriteSectionHeaders
)
2093 Sec
.NameIndex
= Obj
.SectionNames
->findIndex(Sec
.Name
);
2097 if (Error E
= Buf
.allocate(totalSize()))
2099 SecWriter
= std::make_unique
<ELFSectionWriter
<ELFT
>>(Buf
);
2100 return Error::success();
2103 Error
BinaryWriter::write() {
2104 for (const SectionBase
&Sec
: Obj
.allocSections())
2105 Sec
.accept(*SecWriter
);
2106 return Buf
.commit();
2109 Error
BinaryWriter::finalize() {
2110 // We need a temporary list of segments that has a special order to it
2111 // so that we know that anytime ->ParentSegment is set that segment has
2112 // already had it's offset properly set. We only want to consider the segments
2113 // that will affect layout of allocated sections so we only add those.
2114 std::vector
<Segment
*> OrderedSegments
;
2115 for (const SectionBase
&Sec
: Obj
.allocSections())
2116 if (Sec
.ParentSegment
!= nullptr)
2117 OrderedSegments
.push_back(Sec
.ParentSegment
);
2119 // For binary output, we're going to use physical addresses instead of
2120 // virtual addresses, since a binary output is used for cases like ROM
2121 // loading and physical addresses are intended for ROM loading.
2122 // However, if no segment has a physical address, we'll fallback to using
2123 // virtual addresses for all.
2124 if (all_of(OrderedSegments
,
2125 [](const Segment
*Seg
) { return Seg
->PAddr
== 0; }))
2126 for (Segment
*Seg
: OrderedSegments
)
2127 Seg
->PAddr
= Seg
->VAddr
;
2129 llvm::stable_sort(OrderedSegments
, compareSegmentsByPAddr
);
2131 // Because we add a ParentSegment for each section we might have duplicate
2132 // segments in OrderedSegments. If there were duplicates then layoutSegments
2133 // would do very strange things.
2135 std::unique(std::begin(OrderedSegments
), std::end(OrderedSegments
));
2136 OrderedSegments
.erase(End
, std::end(OrderedSegments
));
2138 uint64_t Offset
= 0;
2140 // Modify the first segment so that there is no gap at the start. This allows
2141 // our layout algorithm to proceed as expected while not writing out the gap
2143 if (!OrderedSegments
.empty()) {
2144 Segment
*Seg
= OrderedSegments
[0];
2145 const SectionBase
*Sec
= Seg
->firstSection();
2146 auto Diff
= Sec
->OriginalOffset
- Seg
->OriginalOffset
;
2147 Seg
->OriginalOffset
+= Diff
;
2148 // The size needs to be shrunk as well.
2149 Seg
->FileSize
-= Diff
;
2150 // The PAddr needs to be increased to remove the gap before the first
2153 uint64_t LowestPAddr
= Seg
->PAddr
;
2154 for (Segment
*Segment
: OrderedSegments
) {
2155 Segment
->Offset
= Segment
->PAddr
- LowestPAddr
;
2156 Offset
= std::max(Offset
, Segment
->Offset
+ Segment
->FileSize
);
2160 layoutSections(Obj
.allocSections(), Offset
);
2162 // Now that every section has been laid out we just need to compute the total
2163 // file size. This might not be the same as the offset returned by
2164 // layoutSections, because we want to truncate the last segment to the end of
2165 // its last section, to match GNU objcopy's behaviour.
2167 for (const SectionBase
&Sec
: Obj
.allocSections())
2168 if (Sec
.Type
!= SHT_NOBITS
)
2169 TotalSize
= std::max(TotalSize
, Sec
.Offset
+ Sec
.Size
);
2171 if (Error E
= Buf
.allocate(TotalSize
))
2173 SecWriter
= std::make_unique
<BinarySectionWriter
>(Buf
);
2174 return Error::success();
2177 bool IHexWriter::SectionCompare::operator()(const SectionBase
*Lhs
,
2178 const SectionBase
*Rhs
) const {
2179 return (sectionPhysicalAddr(Lhs
) & 0xFFFFFFFFU
) <
2180 (sectionPhysicalAddr(Rhs
) & 0xFFFFFFFFU
);
2183 uint64_t IHexWriter::writeEntryPointRecord(uint8_t *Buf
) {
2184 IHexLineData HexData
;
2185 uint8_t Data
[4] = {};
2186 // We don't write entry point record if entry is zero.
2190 if (Obj
.Entry
<= 0xFFFFFU
) {
2191 Data
[0] = ((Obj
.Entry
& 0xF0000U
) >> 12) & 0xFF;
2192 support::endian::write(&Data
[2], static_cast<uint16_t>(Obj
.Entry
),
2194 HexData
= IHexRecord::getLine(IHexRecord::StartAddr80x86
, 0, Data
);
2196 support::endian::write(Data
, static_cast<uint32_t>(Obj
.Entry
),
2198 HexData
= IHexRecord::getLine(IHexRecord::StartAddr
, 0, Data
);
2200 memcpy(Buf
, HexData
.data(), HexData
.size());
2201 return HexData
.size();
2204 uint64_t IHexWriter::writeEndOfFileRecord(uint8_t *Buf
) {
2205 IHexLineData HexData
= IHexRecord::getLine(IHexRecord::EndOfFile
, 0, {});
2206 memcpy(Buf
, HexData
.data(), HexData
.size());
2207 return HexData
.size();
2210 Error
IHexWriter::write() {
2211 IHexSectionWriter
Writer(Buf
);
2213 for (const SectionBase
*Sec
: Sections
)
2214 Sec
->accept(Writer
);
2216 uint64_t Offset
= Writer
.getBufferOffset();
2217 // Write entry point address.
2218 Offset
+= writeEntryPointRecord(Buf
.getBufferStart() + Offset
);
2220 Offset
+= writeEndOfFileRecord(Buf
.getBufferStart() + Offset
);
2221 assert(Offset
== TotalSize
);
2222 return Buf
.commit();
2225 Error
IHexWriter::checkSection(const SectionBase
&Sec
) {
2226 uint64_t Addr
= sectionPhysicalAddr(&Sec
);
2227 if (addressOverflows32bit(Addr
) || addressOverflows32bit(Addr
+ Sec
.Size
- 1))
2228 return createStringError(
2229 errc::invalid_argument
,
2230 "Section '%s' address range [0x%llx, 0x%llx] is not 32 bit", Sec
.Name
.c_str(),
2231 Addr
, Addr
+ Sec
.Size
- 1);
2232 return Error::success();
2235 Error
IHexWriter::finalize() {
2236 bool UseSegments
= false;
2237 auto ShouldWrite
= [](const SectionBase
&Sec
) {
2238 return (Sec
.Flags
& ELF::SHF_ALLOC
) && (Sec
.Type
!= ELF::SHT_NOBITS
);
2240 auto IsInPtLoad
= [](const SectionBase
&Sec
) {
2241 return Sec
.ParentSegment
&& Sec
.ParentSegment
->Type
== ELF::PT_LOAD
;
2244 // We can't write 64-bit addresses.
2245 if (addressOverflows32bit(Obj
.Entry
))
2246 return createStringError(errc::invalid_argument
,
2247 "Entry point address 0x%llx overflows 32 bits.",
2250 // If any section we're to write has segment then we
2251 // switch to using physical addresses. Otherwise we
2252 // use section virtual address.
2253 for (const SectionBase
&Sec
: Obj
.sections())
2254 if (ShouldWrite(Sec
) && IsInPtLoad(Sec
)) {
2259 for (const SectionBase
&Sec
: Obj
.sections())
2260 if (ShouldWrite(Sec
) && (!UseSegments
|| IsInPtLoad(Sec
))) {
2261 if (Error E
= checkSection(Sec
))
2263 Sections
.insert(&Sec
);
2266 IHexSectionWriterBase
LengthCalc(Buf
);
2267 for (const SectionBase
*Sec
: Sections
)
2268 Sec
->accept(LengthCalc
);
2270 // We need space to write section records + StartAddress record
2271 // (if start adress is not zero) + EndOfFile record.
2272 TotalSize
= LengthCalc
.getBufferOffset() +
2273 (Obj
.Entry
? IHexRecord::getLineLength(4) : 0) +
2274 IHexRecord::getLineLength(0);
2275 if (Error E
= Buf
.allocate(TotalSize
))
2277 return Error::success();
2280 template class ELFBuilder
<ELF64LE
>;
2281 template class ELFBuilder
<ELF64BE
>;
2282 template class ELFBuilder
<ELF32LE
>;
2283 template class ELFBuilder
<ELF32BE
>;
2285 template class ELFWriter
<ELF64LE
>;
2286 template class ELFWriter
<ELF64BE
>;
2287 template class ELFWriter
<ELF32LE
>;
2288 template class ELFWriter
<ELF32BE
>;
2290 } // end namespace elf
2291 } // end namespace objcopy
2292 } // end namespace llvm