From 3f6881efa54ecb1afdf2fc1481e91e921ed7f9fc Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Tue, 21 Jul 2015 21:40:33 +0000 Subject: [PATCH] [Object][ELF] Handle files with no section header string table. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242839 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELF.h | 20 ++++++++++++------ .../no-section-header-string-table.elf-x86-64 | Bin 0 -> 1024 bytes .../no-section-header-string-table.test | 10 +++++++++ 3 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 test/Object/Inputs/no-section-header-string-table.elf-x86-64 create mode 100644 test/Object/no-section-header-string-table.test 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 0000000000000000000000000000000000000000..9024ad9b75739802e8c828d6f0089e0cf98b02e9 GIT binary patch literal 1024 zcmbVLu}T9$5S>e+21JlFDp)9pT^6H_m0Y3mK+!_PdXuc=^l~e=8;O;HlzxsMU_ilN zv9Pfh;?CV{++1Sg!0nrP^JZ^nZ|?Evv|jMMB9M7-0GiSSN7z{qk?}u9@ zq+W3Oz-4Ec!jnk^gSYZ)AfiZaT*)MAZDJl^DFawEIDWbDE5zgL7R>WK%52Ty=N+Et zDZm~|@HLuB7@|14L&G~wI)%lF6K07O0~KeVZPH_V%jCPT{s#{_3GYK5Rb}HwG<8)A zrI~^b4`aCNY6TavBhGbOB=v6G)S-+4m=-+^ERij)Ia4~Ru^O;gYQc`rE~`rO=B-JK zh?7!1bTn@ON;7Pe=brHYKHfEc6W4qS?7i6Bth>Sb-JJfKVml|c9<_OMxjjm%yoh2~ zYbELMQm{|hBMb=V3}P+LJlbjo>FQ2RpZH-8@qTcRS@rJx`*grQq3wsZb0*F*lmCyR Px@W?ZUs>uAJ!XFZ8^cx* literal 0 HcmV?d00001 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)