diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -516,8 +516,17 @@ ELFFile::getSectionStringTable(Elf_Shdr_Range Sections, WarningHandler WarnHandler) const { uint32_t Index = getHeader()->e_shstrndx; - if (Index == ELF::SHN_XINDEX) + if (Index == ELF::SHN_XINDEX) { + // If the section name string table section index is greater than + // or equal to SHN_LORESERVE, then the actual index of the section name + // string table section is contained in the sh_link field of the section + // header at index 0. + if (Sections.empty()) + return createError( + "e_shstrndx == SHN_XINDEX, but the section header table is empty"); + Index = Sections[0].sh_link; + } if (!Index) // no section string table. return ""; diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections.s b/llvm/test/tools/llvm-readobj/ELF/many-sections.s --- a/llvm/test/tools/llvm-readobj/ELF/many-sections.s +++ b/llvm/test/tools/llvm-readobj/ELF/many-sections.s @@ -34,13 +34,24 @@ # RUN: yaml2obj --docnum=2 %s -o %t2 -# RUN: llvm-readelf --file-headers %t2 | FileCheck %s --check-prefix=GNU2 +# RUN: not llvm-readelf --file-headers --sections %t2 2>&1 | \ +# RUN: FileCheck %s -DFILE=%t2 --check-prefix=GNU2 # GNU2: Number of section headers: 0 # GNU2: Section header string table index: 65535 (corrupt: out of range) -# RUN: llvm-readobj --file-headers %t2 | FileCheck %s --check-prefix=LLVM2 -# LLVM2: SectionHeaderCount: 0 -# LLVM2: StringTableSectionIndex: 65535 (corrupt: out of range) +# GNU2: There are 0 section headers, starting at offset 0x0: +# GNU2-EMPTY: +# GNU2-NEXT: Section Headers: +# GNU2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# GNU2-NEXT: error: '[[FILE]]': e_shstrndx == SHN_XINDEX, but the section header table is empty + +# RUN: llvm-readobj --file-headers --sections %t2 | \ +# RUN: FileCheck %s --check-prefix=LLVM2 --implicit-check-not="warning:" +# LLVM2: SectionHeaderCount: 0 +# LLVM2: StringTableSectionIndex: 65535 (corrupt: out of range) +# LLVM2-NEXT: } +# LLVM2-NEXT: Sections [ +# LLVM2-NEXT: ] --- !ELF FileHeader: