From: George Rimar Date: Tue, 19 Feb 2019 14:38:25 +0000 (+0000) Subject: Revert r354328, r354329 "[obj2yaml][yaml2obj] - Add support of parsing/dumping of... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06073912d515b37216413a850238872d629515bc;p=llvm Revert r354328, r354329 "[obj2yaml][yaml2obj] - Add support of parsing/dumping of the .gnu.version_r section." Something went wrong. Bots are unhappy: http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/44113/steps/test/logs/stdio git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354332 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ObjectYAML/ELFYAML.h b/include/llvm/ObjectYAML/ELFYAML.h index 0e8206fc36e..e194e59a485 100644 --- a/include/llvm/ObjectYAML/ELFYAML.h +++ b/include/llvm/ObjectYAML/ELFYAML.h @@ -121,7 +121,6 @@ struct Section { RawContent, Relocation, NoBits, - Verneed, MipsABIFlags }; SectionKind Kind; @@ -168,30 +167,6 @@ struct NoBitsSection : Section { } }; -struct VernauxEntry { - uint32_t Hash; - uint16_t Flags; - uint16_t Other; - StringRef Name; -}; - -struct VerneedEntry { - uint16_t Version; - StringRef File; - std::vector AuxV; -}; - -struct VerneedSection : Section { - std::vector VerneedV; - llvm::yaml::Hex64 Info; - - VerneedSection() : Section(SectionKind::Verneed) {} - - static bool classof(const Section *S) { - return S->Kind == SectionKind::Verneed; - } -}; - struct Group : Section { // Members of a group contain a flag and a list of section indices // that are part of the group. @@ -263,8 +238,6 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::DynamicEntry) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::ProgramHeader) LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Symbol) -LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::VernauxEntry) -LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::VerneedEntry) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Relocation) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::SectionOrType) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::SectionName) @@ -408,14 +381,6 @@ template <> struct MappingTraits { static void mapping(IO &IO, ELFYAML::DynamicEntry &Rel); }; -template <> struct MappingTraits { - static void mapping(IO &IO, ELFYAML::VerneedEntry &E); -}; - -template <> struct MappingTraits { - static void mapping(IO &IO, ELFYAML::VernauxEntry &E); -}; - template <> struct MappingTraits { static void mapping(IO &IO, ELFYAML::Relocation &Rel); }; diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp index 13c0bfdbaeb..cec56771e1d 100644 --- a/lib/ObjectYAML/ELFYAML.cpp +++ b/lib/ObjectYAML/ELFYAML.cpp @@ -872,12 +872,6 @@ static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) { IO.mapOptional("Size", Section.Size, Hex64(0)); } -static void sectionMapping(IO &IO, ELFYAML::VerneedSection &Section) { - commonSectionMapping(IO, Section); - IO.mapRequired("Info", Section.Info); - IO.mapRequired("Dependencies", Section.VerneedV); -} - static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) { commonSectionMapping(IO, Section); IO.mapOptional("Info", Section.RelocatableSec, StringRef()); @@ -955,11 +949,6 @@ void MappingTraits>::mapping( Section.reset(new ELFYAML::MipsABIFlags()); sectionMapping(IO, *cast(Section.get())); break; - case ELF::SHT_GNU_verneed: - if (!IO.outputting()) - Section.reset(new ELFYAML::VerneedSection()); - sectionMapping(IO, *cast(Section.get())); - break; default: if (!IO.outputting()) Section.reset(new ELFYAML::RawContentSection()); @@ -1008,25 +997,6 @@ void MappingTraits::mapping(IO &IO, IO.mapRequired("Value", Rel.Val); } -void MappingTraits::mapping(IO &IO, - ELFYAML::VerneedEntry &E) { - assert(!IO.getContext() && "The IO context is initialized already"); - - IO.mapRequired("Version", E.Version); - IO.mapRequired("File", E.File); - IO.mapRequired("Entries", E.AuxV); -} - -void MappingTraits::mapping(IO &IO, - ELFYAML::VernauxEntry &E) { - assert(!IO.getContext() && "The IO context is initialized already"); - - IO.mapRequired("Name", E.Name); - IO.mapRequired("Hash", E.Hash); - IO.mapRequired("Flags", E.Flags); - IO.mapRequired("Other", E.Other); -} - void MappingTraits::mapping(IO &IO, ELFYAML::Relocation &Rel) { const auto *Object = static_cast(IO.getContext()); diff --git a/test/tools/obj2yaml/verneed-section.yaml b/test/tools/obj2yaml/verneed-section.yaml deleted file mode 100644 index 6ca7cb2d88e..00000000000 --- a/test/tools/obj2yaml/verneed-section.yaml +++ /dev/null @@ -1,69 +0,0 @@ -# RUN: yaml2obj %s -o %t -# RUN: obj2yaml %t | FileCheck %s - -## Check we are able to yamalize SHT_GNU_verneed section. - -# CHECK: - Name: .gnu.version_r -# CHECK-NEXT: Type: SHT_GNU_verneed -# CHECK-NEXT: Flags: [ SHF_ALLOC ] -# CHECK-NEXT: Address: 0x0000000000200250 -# CHECK-NEXT: Link: .dynstr -# CHECK-NEXT: AddressAlign: 0x0000000000000004 -# CHECK-NEXT: Info: 0x0000000000000002 -# CHECK-NEXT: Dependencies: -# CHECK-NEXT: - Version: 1 -# CHECK-NEXT: File: dso.so.0 -# CHECK-NEXT: Entries: -# CHECK-NEXT: - Name: v1 -# CHECK-NEXT: Hash: 1937 -# CHECK-NEXT: Flags: 10 -# CHECK-NEXT: Other: 3 -# CHECK-NEXT: - Name: v2 -# CHECK-NEXT: Hash: 1938 -# CHECK-NEXT: Flags: 11 -# CHECK-NEXT: Other: 4 -# CHECK-NEXT: - Version: 1 -# CHECK-NEXT: File: dso.so.1 -# CHECK-NEXT: Entries: -# CHECK-NEXT: - Name: v3 -# CHECK-NEXT: Hash: 1939 -# CHECK-NEXT: Flags: 12 -# CHECK-NEXT: Other: 2 - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_EXEC - Machine: EM_X86_64 - Entry: 0x0000000000201000 -Sections: - - Name: .gnu.version_r - Type: SHT_GNU_verneed - Flags: [ SHF_ALLOC ] - Address: 0x200250 - Link: .dynstr - AddressAlign: 4 - Info: 2 - Dependencies: - - Version: 1 - File: dso.so.0 - Entries: - - Name: v1 - Hash: 1937 - Flags: 10 - Other: 3 - - Name: v2 - Hash: 1938 - Flags: 11 - Other: 4 - - Version: 1 - File: dso.so.1 - Entries: - - Name: v3 - Hash: 1939 - Flags: 12 - Other: 2 -DynamicSymbols: - Global: - - Name: f1 diff --git a/test/tools/yaml2obj/verneed-section.yaml b/test/tools/yaml2obj/verneed-section.yaml deleted file mode 100644 index 436e54ba089..00000000000 --- a/test/tools/yaml2obj/verneed-section.yaml +++ /dev/null @@ -1,73 +0,0 @@ -# RUN: yaml2obj %s -o %t -# RUN: llvm-readelf -V %t | FileCheck %s - -# Check we are able to handle the SHT_GNU_verneed sections. - -# CHECK: SHT_GNU_verneed { -# CHECK-NEXT: Dependency { -# CHECK-NEXT: Version: 1 -# CHECK-NEXT: Count: 2 -# CHECK-NEXT: FileName: dso.so.0 -# CHECK-NEXT: Entry { -# CHECK-NEXT: Hash: 1937 -# CHECK-NEXT: Flags: 0xA -# CHECK-NEXT: Index: 3 -# CHECK-NEXT: Name: v1 -# CHECK-NEXT: } -# CHECK-NEXT: Entry { -# CHECK-NEXT: Hash: 1938 -# CHECK-NEXT: Flags: 0xB -# CHECK-NEXT: Index: 4 -# CHECK-NEXT: Name: v2 -# CHECK-NEXT: } -# CHECK-NEXT: } -# CHECK-NEXT: Dependency { -# CHECK-NEXT: Version: 1 -# CHECK-NEXT: Count: 1 -# CHECK-NEXT: FileName: dso.so.1 -# CHECK-NEXT: Entry { -# CHECK-NEXT: Hash: 1939 -# CHECK-NEXT: Flags: 0xC -# CHECK-NEXT: Index: 2 -# CHECK-NEXT: Name: v3 -# CHECK-NEXT: } -# CHECK-NEXT: } -# CHECK-NEXT: } - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_EXEC - Machine: EM_X86_64 - Entry: 0x0000000000201000 -Sections: - - Name: .gnu.version_r - Type: SHT_GNU_verneed - Flags: [ SHF_ALLOC ] - Address: 0x0000000000200250 - Link: .dynstr - AddressAlign: 0x0000000000000004 - Info: 0x0000000000000002 - Dependencies: - - Version: 1 - File: dso.so.0 - Entries: - - Name: v1 - Hash: 1937 - Flags: 10 - Other: 3 - - Name: v2 - Hash: 1938 - Flags: 11 - Other: 4 - - Version: 1 - File: dso.so.1 - Entries: - - Name: v3 - Hash: 1939 - Flags: 12 - Other: 2 -DynamicSymbols: - Global: - - Name: f1 diff --git a/tools/obj2yaml/elf2yaml.cpp b/tools/obj2yaml/elf2yaml.cpp index cb18e1820df..a3fe811b9d5 100644 --- a/tools/obj2yaml/elf2yaml.cpp +++ b/tools/obj2yaml/elf2yaml.cpp @@ -57,7 +57,6 @@ class ELFDumper { ErrorOr dumpContentSection(const Elf_Shdr *Shdr); ErrorOr dumpNoBitsSection(const Elf_Shdr *Shdr); - ErrorOr dumpVerneedSection(const Elf_Shdr *Shdr); ErrorOr dumpGroup(const Elf_Shdr *Shdr); ErrorOr dumpMipsABIFlags(const Elf_Shdr *Shdr); @@ -185,13 +184,6 @@ template ErrorOr ELFDumper::dump() { Y->Sections.push_back(std::unique_ptr(S.get())); break; } - case ELF::SHT_GNU_verneed: { - ErrorOr S = dumpVerneedSection(&Sec); - if (std::error_code EC = S.getError()) - return EC; - Y->Sections.push_back(std::unique_ptr(S.get())); - break; - } default: { ErrorOr S = dumpContentSection(&Sec); if (std::error_code EC = S.getError()) @@ -451,63 +443,6 @@ ELFDumper::dumpNoBitsSection(const Elf_Shdr *Shdr) { return S.release(); } -template -ErrorOr -ELFDumper::dumpVerneedSection(const Elf_Shdr *Shdr) { - typedef typename ELFT::Verneed Elf_Verneed; - typedef typename ELFT::Vernaux Elf_Vernaux; - - auto S = make_unique(); - if (std::error_code EC = dumpCommonSection(Shdr, *S)) - return EC; - - S->Info = Shdr->sh_info; - - auto Contents = Obj.getSectionContents(Shdr); - if (!Contents) - return errorToErrorCode(Contents.takeError()); - - auto StringTableShdrOrErr = Obj.getSection(Shdr->sh_link); - if (!StringTableShdrOrErr) - return errorToErrorCode(StringTableShdrOrErr.takeError()); - - auto StringTableOrErr = Obj.getStringTable(*StringTableShdrOrErr); - if (!StringTableOrErr) - return errorToErrorCode(StringTableOrErr.takeError()); - - llvm::ArrayRef Data = *Contents; - const uint8_t *Buf = Data.data(); - while (Buf) { - const Elf_Verneed *Verneed = reinterpret_cast(Buf); - - ELFYAML::VerneedEntry Entry; - Entry.Version = Verneed->vn_version; - Entry.File = - StringRef(StringTableOrErr->drop_front(Verneed->vn_file).data()); - - const uint8_t *BufAux = Buf + Verneed->vn_aux; - while (BufAux) { - const Elf_Vernaux *Vernaux = - reinterpret_cast(BufAux); - - ELFYAML::VernauxEntry Aux; - Aux.Hash = Vernaux->vna_hash; - Aux.Flags = Vernaux->vna_flags; - Aux.Other = Vernaux->vna_other; - Aux.Name = - StringRef(StringTableOrErr->drop_front(Vernaux->vna_name).data()); - - Entry.AuxV.push_back(Aux); - BufAux = Vernaux->vna_next ? BufAux + Vernaux->vna_next : nullptr; - } - - S->VerneedV.push_back(Entry); - Buf = Verneed->vn_next ? Buf + Verneed->vn_next : nullptr; - } - - return S.release(); -} - template ErrorOr ELFDumper::dumpGroup(const Elf_Shdr *Shdr) { auto S = make_unique(); diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index beb2ea26752..ac1626aa1a3 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -156,9 +156,6 @@ class ELFState { ContiguousBlobAccumulator &CBA); bool writeSectionContent(Elf_Shdr &SHeader, const ELFYAML::Group &Group, ContiguousBlobAccumulator &CBA); - bool writeSectionContent(Elf_Shdr &SHeader, - const ELFYAML::VerneedSection &Section, - ContiguousBlobAccumulator &CBA); bool writeSectionContent(Elf_Shdr &SHeader, const ELFYAML::MipsABIFlags &Section, ContiguousBlobAccumulator &CBA); @@ -185,9 +182,6 @@ class ELFState { public: static int writeELF(raw_ostream &OS, const ELFYAML::Object &Doc); - -private: - void finalizeStrings(); }; } // end anonymous namespace @@ -303,8 +297,6 @@ bool ELFState::initSectionHeaders(std::vector &SHeaders, CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); } else if (auto S = dyn_cast(Sec.get())) { writeSectionContent(SHeader, *S, CBA); - } else if (auto S = dyn_cast(Sec.get())) { - writeSectionContent(SHeader, *S, CBA); } else llvm_unreachable("Unknown section type"); @@ -346,6 +338,15 @@ void ELFState::initSymtabSectionHeader(Elf_Shdr &SHeader, Syms.push_back(Sym); } + // Add symbol names to .strtab or .dynstr. + for (const auto &Sym : Symbols.Local) + Strtab.add(Sym.Name); + for (const auto &Sym : Symbols.Global) + Strtab.add(Sym.Name); + for (const auto &Sym : Symbols.Weak) + Strtab.add(Sym.Name); + Strtab.finalize(); + addSymbols(Symbols.Local, Syms, ELF::STB_LOCAL, Strtab); addSymbols(Symbols.Global, Syms, ELF::STB_GLOBAL, Strtab); addSymbols(Symbols.Weak, Syms, ELF::STB_WEAK, Strtab); @@ -567,54 +568,6 @@ bool ELFState::writeSectionContent(Elf_Shdr &SHeader, return true; } -template -bool ELFState::writeSectionContent(Elf_Shdr &SHeader, - const ELFYAML::VerneedSection &Section, - ContiguousBlobAccumulator &CBA) { - typedef typename ELFT::Verneed Elf_Verneed; - typedef typename ELFT::Vernaux Elf_Vernaux; - - auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); - - uint64_t AuxCnt = 0; - for (size_t I = 0; I < Section.VerneedV.size(); ++I) { - const ELFYAML::VerneedEntry &VE = Section.VerneedV[I]; - - Elf_Verneed VerNeed; - VerNeed.vn_version = VE.Version; - VerNeed.vn_file = DotDynstr.getOffset(VE.File); - if (I == Section.VerneedV.size() - 1) - VerNeed.vn_next = 0; - else - VerNeed.vn_next = - sizeof(Elf_Verneed) + VE.AuxV.size() * sizeof(Elf_Vernaux); - VerNeed.vn_cnt = VE.AuxV.size(); - VerNeed.vn_aux = sizeof(Elf_Verneed); - OS.write((const char *)&VerNeed, sizeof(Elf_Verneed)); - - for (size_t J = 0; J < VE.AuxV.size(); ++J, ++AuxCnt) { - const ELFYAML::VernauxEntry &VAuxE = VE.AuxV[J]; - - Elf_Vernaux VernAux; - VernAux.vna_hash = VAuxE.Hash; - VernAux.vna_flags = VAuxE.Flags; - VernAux.vna_other = VAuxE.Other; - VernAux.vna_name = DotDynstr.getOffset(VAuxE.Name); - if (J == VE.AuxV.size() - 1) - VernAux.vna_next = 0; - else - VernAux.vna_next = sizeof(Elf_Vernaux); - OS.write((const char *)&VernAux, sizeof(Elf_Vernaux)); - } - } - - SHeader.sh_size = Section.VerneedV.size() * sizeof(Elf_Verneed) + - AuxCnt * sizeof(Elf_Vernaux); - SHeader.sh_info = Section.Info; - - return true; -} - template bool ELFState::writeSectionContent(Elf_Shdr &SHeader, const ELFYAML::MipsABIFlags &Section, @@ -708,52 +661,9 @@ ELFState::buildSymbolIndex(std::size_t &StartIndex, return true; } -template void ELFState::finalizeStrings() { - auto AddSymbols = [](StringTableBuilder &StrTab, - const ELFYAML::LocalGlobalWeakSymbols &Symbols) { - for (const auto &Sym : Symbols.Local) - StrTab.add(Sym.Name); - for (const auto &Sym : Symbols.Global) - StrTab.add(Sym.Name); - for (const auto &Sym : Symbols.Weak) - StrTab.add(Sym.Name); - }; - - // Add the regular symbol names to .strtab section. - AddSymbols(DotStrtab, Doc.Symbols); - DotStrtab.finalize(); - - if (!hasDynamicSymbols()) - return; - - // Add the dynamic symbol names to .dynstr section. - AddSymbols(DotDynstr, Doc.DynamicSymbols); - - // SHT_GNU_verneed section also adds strings to .dynstr section. - for (const std::unique_ptr &Sec : Doc.Sections) { - auto VerNeed = dyn_cast(Sec.get()); - if (!VerNeed) - continue; - - for (const ELFYAML::VerneedEntry &VE : VerNeed->VerneedV) { - DotDynstr.add(VE.File); - for (const ELFYAML::VernauxEntry &Aux : VE.AuxV) - DotDynstr.add(Aux.Name); - } - } - - DotDynstr.finalize(); -} - template int ELFState::writeELF(raw_ostream &OS, const ELFYAML::Object &Doc) { ELFState State(Doc); - - // Finalize .strtab and .dynstr sections. We do that early because want to - // finalize the string table builders before writing the content of the - // sections that might want to use them. - State.finalizeStrings(); - if (!State.buildSectionIndex()) return 1;