diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 775403c23df..ec7e59f9bc5 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -629,14 +629,18 @@ ELFFile::ELFFile(StringRef Object, std::error_code &EC) } // Get string table sections. - ErrorOr StrTabSecOrErr = getSection(getStringTableIndex()); - if ((EC = StrTabSecOrErr.getError())) - return; + uintX_t StringTableIndex = getStringTableIndex(); + if (StringTableIndex) { + ErrorOr StrTabSecOrErr = + getSection(getStringTableIndex()); + if ((EC = StrTabSecOrErr.getError())) + return; - ErrorOr SymtabOrErr = getStringTable(*StrTabSecOrErr); - if ((EC = SymtabOrErr.getError())) - return; - DotShstrtab = *SymtabOrErr; + ErrorOr SymtabOrErr = getStringTable(*StrTabSecOrErr); + if ((EC = SymtabOrErr.getError())) + return; + DotShstrtab = *SymtabOrErr; + } // Build symbol name side-mapping if there is one. if (SymbolTableSectionHeaderIndex) { @@ -746,6 +750,8 @@ template ErrorOr ELFFile::getSectionName(const Elf_Shdr *Section) const { uint32_t Offset = Section->sh_name; + if (Offset == 0) + return StringRef(); if (Offset >= DotShstrtab.size()) return object_error::parse_failed; return StringRef(DotShstrtab.data() + Offset); diff --git a/test/Object/Inputs/no-section-header-string-table.elf-x86-64 b/test/Object/Inputs/no-section-header-string-table.elf-x86-64 new file mode 100644 index 00000000000..9024ad9b757 Binary files /dev/null and b/test/Object/Inputs/no-section-header-string-table.elf-x86-64 differ diff --git a/test/Object/no-section-header-string-table.test b/test/Object/no-section-header-string-table.test new file mode 100644 index 00000000000..1f449328cab --- /dev/null +++ b/test/Object/no-section-header-string-table.test @@ -0,0 +1,10 @@ +RUN: llvm-readobj %p/Inputs/no-section-header-string-table.elf-x86-64 --sections \ +RUN: | FileCheck %s + +CHECK: Type: SHT_PROGBITS (0x1) +CHECK: Type: SHT_PROGBITS (0x1) +CHECK: Type: SHT_PROGBITS (0x1) +CHECK: Type: SHT_RELA (0x4) +CHECK: Type: SHT_SYMTAB (0x2) +CHECK: Type: SHT_STRTAB (0x3) +CHECK: Type: SHT_STRTAB (0x3)