summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp68
1 files changed, 38 insertions, 30 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index bcdde320d31..0b8f752d076 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -247,6 +247,9 @@ class ELFObjectWriter : public MCObjectWriter {
void WriteRelocations(MCAssembler &Asm, const MCAsmLayout &Layout);
+ void
+ createSectionHeaderStringTable(MCAssembler &Asm,
+ std::vector<const MCSectionELF *> &Sections);
void CreateMetadataSections(MCAssembler &Asm, const MCAsmLayout &Layout,
std::vector<const MCSectionELF *> &Sections);
@@ -452,10 +455,8 @@ void ELFObjectWriter::WriteHeader(const MCAssembler &Asm,
Write16(NumberOfSections);
// e_shstrndx = Section # of '.shstrtab'
- if (ShstrtabIndex >= ELF::SHN_LORESERVE)
- Write16(ELF::SHN_XINDEX);
- else
- Write16(ShstrtabIndex);
+ assert(ShstrtabIndex < ELF::SHN_LORESERVE);
+ Write16(ShstrtabIndex);
}
uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &Data,
@@ -1372,6 +1373,21 @@ void ELFObjectWriter::WriteRelocationsFragment(const MCAssembler &Asm,
}
}
+void ELFObjectWriter::createSectionHeaderStringTable(
+ MCAssembler &Asm, std::vector<const MCSectionELF *> &Sections) {
+ const MCSectionELF *ShstrtabSection = Sections[ShstrtabIndex - 1];
+
+ Asm.getOrCreateSectionData(*ShstrtabSection);
+
+ for (MCSectionData &SD : Asm) {
+ const MCSectionELF &Section =
+ static_cast<const MCSectionELF &>(SD.getSection());
+ ShStrTabBuilder.add(Section.getSectionName());
+ }
+ ShStrTabBuilder.finalize(StringTableBuilder::ELF);
+ OS << ShStrTabBuilder.data();
+}
+
void ELFObjectWriter::CreateMetadataSections(
MCAssembler &Asm, const MCAsmLayout &Layout,
std::vector<const MCSectionELF *> &Sections) {
@@ -1380,14 +1396,6 @@ void ELFObjectWriter::CreateMetadataSections(
unsigned EntrySize = is64Bit() ? ELF::SYMENTRY_SIZE64 : ELF::SYMENTRY_SIZE32;
- // We construct .shstrtab, .symtab and .strtab in this order to match gnu as.
- const MCSectionELF *ShstrtabSection =
- Ctx.getELFSection(".shstrtab", ELF::SHT_STRTAB, 0);
- MCSectionData &ShstrtabSD = Asm.getOrCreateSectionData(*ShstrtabSection);
- ShstrtabSD.setAlignment(1);
- ShstrtabIndex = Sections.size() + 1;
- Sections.push_back(ShstrtabSection);
-
const MCSectionELF *SymtabSection =
Ctx.getELFSection(".symtab", ELF::SHT_SYMTAB, 0,
EntrySize, "");
@@ -1410,18 +1418,6 @@ void ELFObjectWriter::CreateMetadataSections(
F = new MCDataFragment(&StrtabSD);
F->getContents().append(StrTabBuilder.data().begin(),
StrTabBuilder.data().end());
-
- F = new MCDataFragment(&ShstrtabSD);
-
- // Section header string table.
- for (auto it = Asm.begin(), ie = Asm.end(); it != ie; ++it) {
- const MCSectionELF &Section =
- static_cast<const MCSectionELF&>(it->getSection());
- ShStrTabBuilder.add(Section.getSectionName());
- }
- ShStrTabBuilder.finalize(StringTableBuilder::ELF);
- F->getContents().append(ShStrTabBuilder.data().begin(),
- ShStrTabBuilder.data().end());
}
void ELFObjectWriter::createIndexedSections(
@@ -1430,6 +1426,12 @@ void ELFObjectWriter::createIndexedSections(
SectionIndexMapTy &SectionIndexMap) {
MCContext &Ctx = Asm.getContext();
+ const MCSectionELF *ShstrtabSection =
+ Ctx.getELFSection(".shstrtab", ELF::SHT_STRTAB, 0);
+ Sections.push_back(ShstrtabSection);
+ ShstrtabIndex = Sections.size();
+ assert(ShstrtabIndex == 1);
+
// Build the groups
for (const MCSectionData &SD : Asm) {
const MCSectionELF &Section =
@@ -1537,9 +1539,7 @@ void ELFObjectWriter::writeSectionHeader(
// Null section first.
uint64_t FirstSectionSize =
(NumSections + 1) >= ELF::SHN_LORESERVE ? NumSections + 1 : 0;
- uint32_t FirstSectionLink =
- ShstrtabIndex >= ELF::SHN_LORESERVE ? ShstrtabIndex : 0;
- WriteSecHdrEntry(0, 0, 0, 0, 0, FirstSectionSize, FirstSectionLink, 0, 0, 0);
+ WriteSecHdrEntry(0, 0, 0, 0, 0, FirstSectionSize, 0, 0, 0, 0);
for (unsigned i = 0; i < NumSections; ++i) {
const MCSectionELF &Section = *Sections[i];
@@ -1576,15 +1576,16 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
CreateMetadataSections(Asm, Layout, Sections);
- unsigned NumSections = Asm.size();
+ unsigned NumSections = Asm.size() + 1;
SectionOffsetsTy SectionOffsets;
// Write out the ELF header ...
WriteHeader(Asm, NumSections + 1);
// ... then the sections ...
- for (const MCSectionELF *Section : Sections) {
- const MCSectionData &SD = Asm.getOrCreateSectionData(*Section);
+ SectionOffsets.push_back(std::make_pair(0, 0));
+ for (auto I = ++Sections.begin(), E = Sections.end(); I != E; ++I) {
+ const MCSectionData &SD = Asm.getOrCreateSectionData(**I);
uint64_t Padding = OffsetToAlignment(OS.tell(), SD.getAlignment());
WriteZeros(Padding);
@@ -1595,6 +1596,13 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
SectionOffsets.push_back(std::make_pair(SecStart, SecEnd));
}
+ {
+ uint64_t SecStart = OS.tell();
+ createSectionHeaderStringTable(Asm, Sections);
+ uint64_t SecEnd = OS.tell();
+ SectionOffsets[0] = std::make_pair(SecStart, SecEnd);
+ }
+
uint64_t NaturalAlignment = is64Bit() ? 8 : 4;
uint64_t Padding = OffsetToAlignment(OS.tell(), NaturalAlignment);
WriteZeros(Padding);
OpenPOWER on IntegriCloud