diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Object/ELF.h | 45 | ||||
| -rw-r--r-- | llvm/test/Object/Inputs/invalid-section-index2.elf | bin | 435 -> 0 bytes | |||
| -rw-r--r-- | llvm/test/Object/invalid.test | 1 |
3 files changed, 27 insertions, 19 deletions
diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h index 8e28b1dc2b4..3e0802e4855 100644 --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -73,7 +73,6 @@ private: const Elf_Ehdr *Header; const Elf_Shdr *SectionHeaderTable = nullptr; - StringRef DotShstrtab; // Section header string table. public: template<typename T> @@ -154,7 +153,8 @@ public: } uint64_t getNumSections() const; - uint32_t getStringTableIndex() const; + ErrorOr<StringRef> getSectionStringTable() const; + uint32_t getSectionStringTableIndex() const; uint32_t getExtendedSymbolTableIndex(const Elf_Sym *Sym, const Elf_Shdr *SymTab, ArrayRef<Elf_Word> ShndxTable) const; @@ -175,6 +175,8 @@ public: } ErrorOr<StringRef> getSectionName(const Elf_Shdr *Section) const; + ErrorOr<StringRef> getSectionName(const Elf_Shdr *Section, + StringRef DotShstrtab) const; template <typename T> ErrorOr<ArrayRef<T>> getSectionContentsAsArray(const Elf_Shdr *Sec) const; ErrorOr<ArrayRef<uint8_t> > getSectionContents(const Elf_Shdr *Sec) const; @@ -299,15 +301,26 @@ uint64_t ELFFile<ELFT>::getNumSections() const { return Header->e_shnum; } -template <class ELFT> uint32_t ELFFile<ELFT>::getStringTableIndex() const { +template <class ELFT> +uint32_t ELFFile<ELFT>::getSectionStringTableIndex() const { if (Header->e_shstrndx == ELF::SHN_XINDEX) return SectionHeaderTable->sh_link; return Header->e_shstrndx; } template <class ELFT> -ELFFile<ELFT>::ELFFile(StringRef Object, std::error_code &EC) - : Buf(Object) { +ErrorOr<StringRef> ELFFile<ELFT>::getSectionStringTable() const { + uint32_t Index = getSectionStringTableIndex(); + if (!Index) // no section string table. + return ""; + ErrorOr<const Elf_Shdr *> StrTabSecOrErr = getSection(Index); + if (std::error_code EC = StrTabSecOrErr.getError()) + return EC; + return getStringTable(*StrTabSecOrErr); +} + +template <class ELFT> +ELFFile<ELFT>::ELFFile(StringRef Object, std::error_code &EC) : Buf(Object) { const uint64_t FileSize = Buf.size(); if (sizeof(Elf_Ehdr) > FileSize) { @@ -357,19 +370,6 @@ ELFFile<ELFT>::ELFFile(StringRef Object, std::error_code &EC) return; } - // Get string table sections. - uint32_t StringTableIndex = getStringTableIndex(); - if (StringTableIndex) { - ErrorOr<const Elf_Shdr *> StrTabSecOrErr = getSection(StringTableIndex); - if ((EC = StrTabSecOrErr.getError())) - return; - - ErrorOr<StringRef> StringTableOrErr = getStringTable(*StrTabSecOrErr); - if ((EC = StringTableOrErr.getError())) - return; - DotShstrtab = *StringTableOrErr; - } - EC = std::error_code(); } @@ -472,6 +472,15 @@ ELFFile<ELFT>::getStringTableForSymtab(const Elf_Shdr &Sec) const { template <class ELFT> ErrorOr<StringRef> ELFFile<ELFT>::getSectionName(const Elf_Shdr *Section) const { + ErrorOr<StringRef> Table = getSectionStringTable(); + if (std::error_code EC = Table.getError()) + return EC; + return getSectionName(Section, *Table); +} + +template <class ELFT> +ErrorOr<StringRef> ELFFile<ELFT>::getSectionName(const Elf_Shdr *Section, + StringRef DotShstrtab) const { uint32_t Offset = Section->sh_name; if (Offset == 0) return StringRef(); diff --git a/llvm/test/Object/Inputs/invalid-section-index2.elf b/llvm/test/Object/Inputs/invalid-section-index2.elf Binary files differdeleted file mode 100644 index 92c372a25f8..00000000000 --- a/llvm/test/Object/Inputs/invalid-section-index2.elf +++ /dev/null diff --git a/llvm/test/Object/invalid.test b/llvm/test/Object/invalid.test index 057239de991..da30c64ea44 100644 --- a/llvm/test/Object/invalid.test +++ b/llvm/test/Object/invalid.test @@ -42,7 +42,6 @@ RUN: not llvm-readobj --dyn-symbols %p/Inputs/invalid-sh_entsize.elf 2>&1 | File INVALID-DYNSYM-SIZE: Invalid entity size RUN: not llvm-readobj -t %p/Inputs/invalid-section-index.elf 2>&1 | FileCheck --check-prefix=INVALID-SECTION-INDEX %s -RUN: not llvm-readobj -t %p/Inputs/invalid-section-index2.elf 2>&1 | FileCheck --check-prefix=INVALID-SECTION-INDEX %s 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 |

