Index: llvm/test/Object/no-section-header-string-table.test =================================================================== --- llvm/test/Object/no-section-header-string-table.test +++ /dev/null @@ -1,10 +0,0 @@ -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) Index: llvm/test/tools/llvm-readobj/ELF/sections-no-section-header-string-table.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-readobj/ELF/sections-no-section-header-string-table.test @@ -0,0 +1,61 @@ +## Check what --sections prints when there is no section header string table. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readelf --sections %t \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix=GNU +# RUN: not llvm-readobj --sections %t 2>&1 \ +# RUN: | FileCheck %s -DFILE=%t --check-prefix=LLVM + +# GNU:Section Headers: +# GNU-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# GNU-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 +# GNU-NEXT: [ 1] PROGBITS 0000000000000000 000040 000000 00 0 0 0 +# GNU-NEXT: [ 2] PROGBITS 0000000000000000 000040 000000 00 0 0 0 +# GNU-NEXT: [ 3] STRTAB 0000000000000000 000040 000001 00 0 0 1 +# GNU-NEXT: [ 4] STRTAB 0000000000000000 000041 00001d 00 0 0 1 + +# LLVM: Sections [ +# LLVM-NEXT: Section { +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Name: (0) +# LLVM-NEXT: Type: SHT_NULL (0x0) +# LLVM-NEXT: Flags [ (0x0) +# LLVM-NEXT: ] +# LLVM-NEXT: Address: 0x0 +# LLVM-NEXT: Offset: 0x0 +# LLVM-NEXT: Size: 0 +# LLVM-NEXT: Link: 0 +# LLVM-NEXT: Info: 0 +# LLVM-NEXT: AddressAlignment: 0 +# LLVM-NEXT: EntrySize: 0 +# LLVM-NEXT: } +# LLVM-NEXT: Section { +# LLVM-NEXT: Index: 1 +# LLVM-NEXT: Name: (0) +# LLVM-NEXT: Type: SHT_PROGBITS (0x1) +# LLVM-NEXT: Flags [ (0x0) +# LLVM-NEXT: ] +# LLVM-NEXT: Address: 0x0 +# LLVM-NEXT: Offset: 0x40 +# LLVM-NEXT: Size: 0 +# LLVM-NEXT: Link: 0 +# LLVM-NEXT: Info: 0 +# LLVM-NEXT: AddressAlignment: 0 +# LLVM-NEXT: EntrySize: 0 +# LLVM-NEXT: } +# LLVM-NEXT: error: '[[FILE]]': a section [index 2] has an invalid sh_name (0x1) offset which goes past the end of the section name string table + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + SHStrNdx: 0 +Sections: + - Name: .foo + Type: SHT_PROGBITS + ShName: 0 + - Name: .bar + Type: SHT_PROGBITS + ShName: 1 Index: llvm/tools/llvm-readobj/ELFDumper.cpp =================================================================== --- llvm/tools/llvm-readobj/ELFDumper.cpp +++ llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3515,11 +3515,17 @@ OS << "\n"; const ELFObjectFile *ElfObj = this->dumper()->getElfObject(); + StringRef SecStrTable = unwrapOrError( + ElfObj->getFileName(), + Obj->getSectionStringTable(Sections, this->WarningHandler)); size_t SectionIndex = 0; for (const Elf_Shdr &Sec : Sections) { Fields[0].Str = to_string(SectionIndex); - Fields[1].Str = unwrapOrError( - ElfObj->getFileName(), Obj->getSectionName(&Sec, this->WarningHandler)); + if (SecStrTable.empty()) + Fields[1].Str = ""; + else + Fields[1].Str = unwrapOrError( + ElfObj->getFileName(), Obj->getSectionName(&Sec, SecStrTable)); Fields[2].Str = getSectionTypeString(Obj->getHeader()->e_machine, Sec.sh_type); Fields[3].Str =