From c2b6adff3e94f8e299caa31947ad970096377e40 Mon Sep 17 00:00:00 2001 From: Sean Silva Date: Tue, 18 Jun 2013 23:37:23 +0000 Subject: [yaml2obj][ELF] Don't monkeypatch the YAML sections. Previously, we would monkeypatch the vector of YAML::Section's in order to ensure that the SHT_NULL entry is present. Now we just add it unconditionally. The proliferation of small numerical adjustments is beginning to frighten me, but I can't think of a way having a single point of truth for them without introducing a whole new layer of data structures (i.e. lots of code and complexity) between the YAML and binary ELF formats. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184260 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/yaml2obj/yaml2elf.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'tools/yaml2obj') diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index a67a275bf9..3ddbe0afee 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -209,27 +209,23 @@ static int writeELF(raw_ostream &OS, const ELFYAML::Object &Doc) { Header.e_shentsize = sizeof(Elf_Shdr); // Immediately following the ELF header. Header.e_shoff = sizeof(Header); - std::vector Sections = Doc.Sections; - if (Sections.empty() || Sections.front().Type != SHT_NULL) { - ELFYAML::Section S; - S.Type = SHT_NULL; - zero(S.Flags); - zero(S.Address); - zero(S.AddressAlign); - Sections.insert(Sections.begin(), S); - } - // "+ 2" for string table and section header string table. - Header.e_shnum = Sections.size() + 2; + const std::vector &Sections = Doc.Sections; + // "+ 3" for + // - SHT_NULL entry (placed first, i.e. 0'th entry) + // - string table (.strtab) (placed second to last) + // - section header string table. (placed last) + Header.e_shnum = Sections.size() + 3; // Place section header string table last. - Header.e_shstrndx = Sections.size() + 1; - const unsigned DotStrtabSecNo = Sections.size(); + Header.e_shstrndx = Header.e_shnum - 1; + const unsigned DotStrtabSecNo = Header.e_shnum - 2; SectionNameToIdxMap SN2I; for (unsigned i = 0, e = Sections.size(); i != e; ++i) { StringRef Name = Sections[i].Name; if (Name.empty()) continue; - if (SN2I.addName(Name, i)) { + // "+ 1" to take into account the SHT_NULL entry. + if (SN2I.addName(Name, i + 1)) { errs() << "error: Repeated section name: '" << Name << "' at YAML section number " << i << ".\n"; return 1; @@ -244,6 +240,13 @@ static int writeELF(raw_ostream &OS, const ELFYAML::Object &Doc) { Header.e_ehsize + Header.e_shentsize * Header.e_shnum; ContiguousBlobAccumulator CBA(SectionContentBeginOffset, Buf); std::vector SHeaders; + { + // Ensure SHN_UNDEF entry is present. An all-zero section header is a + // valid SHN_UNDEF entry since SHT_NULL == 0. + Elf_Shdr SHdr; + zero(SHdr); + SHeaders.push_back(SHdr); + } StringTableBuilder DotStrTab; for (unsigned i = 0, e = Sections.size(); i != e; ++i) { const ELFYAML::Section &Sec = Sections[i]; -- cgit v1.2.3