diff options
author | Yi Kong <yikong@google.com> | 2020-07-21 02:46:44 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-07-21 02:46:44 +0000 |
commit | 472bc9a55da4405a32a82cf38657d8ae3ac7ea05 (patch) | |
tree | 98127bab3d84555604cdbaf3473a6fdfcc4fbd60 | |
parent | b1b9c6d040de2e6a7e528d5a5cc03ba62af22ca9 (diff) | |
parent | 14dcca083ecda4fce44657d66fdf11432b92c673 (diff) | |
download | llvm-472bc9a55da4405a32a82cf38657d8ae3ac7ea05.tar.gz |
Merge "[BACKPORT] Avoid a report_fatal_error in sections()."
-rw-r--r-- | include/llvm/Object/ELF.h | 20 | ||||
-rw-r--r-- | include/llvm/Object/ELFObjectFile.h | 13 | ||||
-rw-r--r-- | test/Object/invalid.test | 2 | ||||
-rw-r--r-- | tools/llvm-readobj/ARMEHABIPrinter.h | 4 | ||||
-rw-r--r-- | tools/llvm-readobj/ELFDumper.cpp | 22 | ||||
-rw-r--r-- | tools/obj2yaml/elf2yaml.cpp | 5 |
6 files changed, 32 insertions, 34 deletions
diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 80b8be03810c..e00d34f160e7 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -109,11 +109,7 @@ public: Header->getDataEncoding() == ELF::ELFDATA2LSB; } - const Elf_Shdr *section_begin() const; - const Elf_Shdr *section_end() const; - Elf_Shdr_Range sections() const { - return makeArrayRef(section_begin(), section_end()); - } + ErrorOr<Elf_Shdr_Range> sections() const; const Elf_Sym *symbol_begin(const Elf_Shdr *Sec) const { if (!Sec) @@ -389,16 +385,12 @@ static bool compareAddr(uint64_t VAddr, const Elf_Phdr_Impl<ELFT> *Phdr) { } template <class ELFT> -const typename ELFFile<ELFT>::Elf_Shdr *ELFFile<ELFT>::section_begin() const { +ErrorOr<typename ELFT::ShdrRange> ELFFile<ELFT>::sections() const { + // Invalid section header entry size (e_shentsize) in ELF header if (Header->e_shentsize != sizeof(Elf_Shdr)) - report_fatal_error( - "Invalid section header entry size (e_shentsize) in ELF header"); - return reinterpret_cast<const Elf_Shdr *>(base() + Header->e_shoff); -} - -template <class ELFT> -const typename ELFFile<ELFT>::Elf_Shdr *ELFFile<ELFT>::section_end() const { - return section_begin() + getNumSections(); + return object_error::parse_failed; + auto *Begin = reinterpret_cast<const Elf_Shdr *>(base() + Header->e_shoff); + return makeArrayRef(Begin, Begin + getNumSections()); } template <class ELFT> diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 6dcd2d486813..eaa0061ac074 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -262,7 +262,7 @@ protected: assert(SymTable->sh_type == ELF::SHT_SYMTAB || SymTable->sh_type == ELF::SHT_DYNSYM); - uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin()); + uintptr_t SHT = reinterpret_cast<uintptr_t>((*EF.sections()).begin()); unsigned SymTableIndex = (reinterpret_cast<uintptr_t>(SymTable) - SHT) / sizeof(Elf_Shdr); @@ -627,7 +627,7 @@ template <class ELFT> relocation_iterator ELFObjectFile<ELFT>::section_rel_begin(DataRefImpl Sec) const { DataRefImpl RelData; - uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin()); + uintptr_t SHT = reinterpret_cast<uintptr_t>((*EF.sections()).begin()); RelData.d.a = (Sec.p - SHT) / EF.getHeader()->e_shentsize; RelData.d.b = 0; return relocation_iterator(RelocationRef(RelData, this)); @@ -756,7 +756,10 @@ ELFObjectFile<ELFT>::ELFObjectFile(MemoryBufferRef Object, std::error_code &EC) EF(Data.getBuffer(), EC) { if (EC) return; - for (const Elf_Shdr &Sec : EF.sections()) { + auto SectionsOrErr = EF.sections(); + if ((EC = SectionsOrErr.getError())) + return; + for (const Elf_Shdr &Sec : *SectionsOrErr) { switch (Sec.sh_type) { case ELF::SHT_DYNSYM: { if (DotDynSymSec) { @@ -817,12 +820,12 @@ elf_symbol_iterator ELFObjectFile<ELFT>::dynamic_symbol_end() const { template <class ELFT> section_iterator ELFObjectFile<ELFT>::section_begin() const { - return section_iterator(SectionRef(toDRI(EF.section_begin()), this)); + return section_iterator(SectionRef(toDRI((*EF.sections()).begin()), this)); } template <class ELFT> section_iterator ELFObjectFile<ELFT>::section_end() const { - return section_iterator(SectionRef(toDRI(EF.section_end()), this)); + return section_iterator(SectionRef(toDRI((*EF.sections()).end()), this)); } template <class ELFT> diff --git a/test/Object/invalid.test b/test/Object/invalid.test index a32c621cca61..51bdee6f2784 100644 --- a/test/Object/invalid.test +++ b/test/Object/invalid.test @@ -45,7 +45,7 @@ RUN: not llvm-readobj -t %p/Inputs/invalid-section-index.elf 2>&1 | FileCheck -- INVALID-SECTION-INDEX: Invalid section index RUN: not llvm-readobj -s %p/Inputs/invalid-section-size.elf 2>&1 | FileCheck --check-prefix=INVALID-SECTION-SIZE %s -INVALID-SECTION-SIZE: Invalid section header entry size (e_shentsize) in ELF header +INVALID-SECTION-SIZE: Invalid data was encountered while parsing the file RUN: not llvm-readobj -t %p/Inputs/invalid-symbol-table-size.elf 2>&1 | FileCheck --check-prefix=INVALID-SYMTAB-SIZE %s diff --git a/tools/llvm-readobj/ARMEHABIPrinter.h b/tools/llvm-readobj/ARMEHABIPrinter.h index 59c9b713d85e..a85f987def0c 100644 --- a/tools/llvm-readobj/ARMEHABIPrinter.h +++ b/tools/llvm-readobj/ARMEHABIPrinter.h @@ -379,7 +379,7 @@ PrinterContext<ET>::FindExceptionTable(unsigned IndexSectionIndex, /// handling table. Use this symbol to recover the actual exception handling /// table. - for (const Elf_Shdr &Sec : ELF->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(ELF->sections())) { if (Sec.sh_type != ELF::SHT_REL || Sec.sh_info != IndexSectionIndex) continue; @@ -548,7 +548,7 @@ void PrinterContext<ET>::PrintUnwindInformation() const { DictScope UI(SW, "UnwindInformation"); int SectionIndex = 0; - for (const Elf_Shdr &Sec : ELF->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(ELF->sections())) { if (Sec.sh_type == ELF::SHT_ARM_EXIDX) { DictScope UIT(SW, "UnwindIndexTable"); diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 84e368e7aa36..eefcca8be32e 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -737,7 +737,7 @@ getSectionNameIndex(const ELFO &Obj, const typename ELFO::Elf_Sym *Symbol, template <class ELFO> static const typename ELFO::Elf_Shdr * findNotEmptySectionByAddress(const ELFO *Obj, uint64_t Addr) { - for (const auto &Shdr : Obj->sections()) + for (const auto &Shdr : unwrapOrError(Obj->sections())) if (Shdr.sh_addr == Addr && Shdr.sh_size > 0) return &Shdr; return nullptr; @@ -1318,7 +1318,7 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, ScopedPrinter &Writer) LoadSegments.push_back(&Phdr); } - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { switch (Sec.sh_type) { case ELF::SHT_SYMTAB: if (DotSymtabSec != nullptr) @@ -1851,7 +1851,7 @@ template <> void ELFDumper<ELFType<support::little, false>>::printAttributes() { } DictScope BA(W, "BuildAttributes"); - for (const ELFO::Elf_Shdr &Sec : Obj->sections()) { + for (const ELFO::Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { if (Sec.sh_type != ELF::SHT_ARM_ATTRIBUTES) continue; @@ -2336,7 +2336,7 @@ template <class ELFT> void ELFDumper<ELFT>::printMipsOptions() { template <class ELFT> void ELFDumper<ELFT>::printStackMap() const { const Elf_Shdr *StackMapSection = nullptr; - for (const auto &Sec : Obj->sections()) { + for (const auto &Sec : unwrapOrError(Obj->sections())) { StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); if (Name == ".llvm_stackmaps") { StackMapSection = &Sec; @@ -2423,7 +2423,7 @@ template <class ELFT> void GNUStyle<ELFT>::printFileHeaders(const ELFO *Obj) { template <class ELFT> void GNUStyle<ELFT>::printGroupSections(const ELFO *Obj) { uint32_t SectionIndex = 0; bool HasGroups = false; - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { if (Sec.sh_type == ELF::SHT_GROUP) { HasGroups = true; const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); @@ -2517,7 +2517,7 @@ static inline void printRelocHeader(raw_ostream &OS, bool Is64, bool IsRela) { template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) { bool HasRelocSections = false; - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA) continue; HasRelocSections = true; @@ -2663,7 +2663,7 @@ template <class ELFT> void GNUStyle<ELFT>::printSections(const ELFO *Obj) { printField(f); OS << "\n"; - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { Number = to_string(SectionIndex); Fields[0].Str = Number; Fields[1].Str = unwrapOrError(Obj->getSectionName(&Sec)); @@ -2941,7 +2941,7 @@ void GNUStyle<ELFT>::printProgramHeaders(const ELFO *Obj) { for (const Elf_Phdr &Phdr : Obj->program_headers()) { std::string Sections; OS << format(" %2.2d ", Phnum++); - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { // Check if each section is in a segment and then print mapping. // readelf additionally makes sure it does not print zero sized sections // at end of segments and for PT_DYNAMIC both start and end of section @@ -3209,7 +3209,7 @@ void LLVMStyle<ELFT>::printGroupSections(const ELFO *Obj) { DictScope Lists(W, "Groups"); uint32_t SectionIndex = 0; bool HasGroups = false; - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { if (Sec.sh_type == ELF::SHT_GROUP) { HasGroups = true; const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); @@ -3243,7 +3243,7 @@ template <class ELFT> void LLVMStyle<ELFT>::printRelocations(const ELFO *Obj) { ListScope D(W, "Relocations"); int SectionNumber = -1; - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { ++SectionNumber; if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA) @@ -3317,7 +3317,7 @@ template <class ELFT> void LLVMStyle<ELFT>::printSections(const ELFO *Obj) { ListScope SectionsD(W, "Sections"); int SectionIndex = -1; - for (const Elf_Shdr &Sec : Obj->sections()) { + for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { ++SectionIndex; StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); diff --git a/tools/obj2yaml/elf2yaml.cpp b/tools/obj2yaml/elf2yaml.cpp index 782832d54571..4f958e30bb67 100644 --- a/tools/obj2yaml/elf2yaml.cpp +++ b/tools/obj2yaml/elf2yaml.cpp @@ -72,7 +72,10 @@ ErrorOr<ELFYAML::Object *> ELFDumper<ELFT>::dump() { const Elf_Shdr *Symtab = nullptr; // Dump sections - for (const Elf_Shdr &Sec : Obj.sections()) { + auto SectionsOrErr = Obj.sections(); + if (std::error_code EC = SectionsOrErr.getError()) + return EC; + for (const Elf_Shdr &Sec : *SectionsOrErr) { switch (Sec.sh_type) { case ELF::SHT_NULL: case ELF::SHT_DYNSYM: |