aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYi Kong <yikong@google.com>2020-07-21 02:46:44 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2020-07-21 02:46:44 +0000
commit472bc9a55da4405a32a82cf38657d8ae3ac7ea05 (patch)
tree98127bab3d84555604cdbaf3473a6fdfcc4fbd60
parentb1b9c6d040de2e6a7e528d5a5cc03ba62af22ca9 (diff)
parent14dcca083ecda4fce44657d66fdf11432b92c673 (diff)
downloadllvm-472bc9a55da4405a32a82cf38657d8ae3ac7ea05.tar.gz
Merge "[BACKPORT] Avoid a report_fatal_error in sections()."
-rw-r--r--include/llvm/Object/ELF.h20
-rw-r--r--include/llvm/Object/ELFObjectFile.h13
-rw-r--r--test/Object/invalid.test2
-rw-r--r--tools/llvm-readobj/ARMEHABIPrinter.h4
-rw-r--r--tools/llvm-readobj/ELFDumper.cpp22
-rw-r--r--tools/obj2yaml/elf2yaml.cpp5
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: