]> granicus.if.org Git - llvm/commitdiff
Don't compute DotShstrtab eagerly.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 1 Nov 2016 21:33:55 +0000 (21:33 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 1 Nov 2016 21:33:55 +0000 (21:33 +0000)
This saves a field that is not always used. It also avoids failing a
program that doesn't need the section names.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285753 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/ELF.h
test/Object/Inputs/invalid-section-index2.elf [deleted file]
test/Object/invalid.test

index 8e28b1dc2b445329ef1ad128f17a1bd2c02a61ad..3e0802e48557c6949e905daefb61019e358222c3 100644 (file)
@@ -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/test/Object/Inputs/invalid-section-index2.elf b/test/Object/Inputs/invalid-section-index2.elf
deleted file mode 100644 (file)
index 92c372a..0000000
Binary files a/test/Object/Inputs/invalid-section-index2.elf and /dev/null differ
index 057239de9914fcfc32f73825d31d16cc1481ca1f..da30c64ea44bef0ecd6a085344983a3d4e8b2e0d 100644 (file)
@@ -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