[PATCH] D28560: [Object/ELF] - Allow to parse files with e_shstrndx set to SHN_UNDEF

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 11 06:09:30 PST 2017


grimar created this revision.
grimar added reviewers: rafael, davide.
grimar added subscribers: llvm-commits, grimar, evgeny777.

According to specification,

e_shstrndx
The section header table index of the entry that is associated with the section name string table. If the file has no section name string table, this member holds the value SHN_UNDEF.

Previously objdump just reported error on such files. Though gnu readelf is able to parse them, below
is sample output from readelf:

  Section Headers:
    [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
    [ 0] <no-name>         NULL            0000000000000000 000000 000000 00      0   0  0
    [ 1] <no-name>         PROGBITS        0000000000000000 001000 00000e 00  AX  0   0  4
    [ 2] <no-name>         PROGBITS        000000000000000e 00100e 000020 00  WA  0   0  1
    [ 3] <no-name>         PROGBITS        000000000000002e 00102e 000003 00  WA  0   0  1
    [ 4] <no-name>         NOBITS          0000000000000031 001031 000002 00  WA  0   0  1
    [ 5] <no-name>         PROGBITS        0000000000000000 001031 000008 01  MS  0   0  1
    [ 6] <no-name>         SYMTAB          0000000000000000 001040 000030 18      7   1  8
    [ 7] <no-name>         STRTAB          0000000000000000 001070 000008 00      0   0  1


https://reviews.llvm.org/D28560

Files:
  include/llvm/Object/ELF.h
  test/Object/Inputs/elf-no-section-header-table.elf-x86-64
  test/Object/elf-no-section-header-table.test


Index: test/Object/elf-no-section-header-table.test
===================================================================
--- test/Object/elf-no-section-header-table.test
+++ test/Object/elf-no-section-header-table.test
@@ -0,0 +1,8 @@
+## elf-no-section-header-table.elf-x86-64 is a simple ELF with e_shstrndx filed set
+## to SHN_UNDEF, what means file has no section name string table.
+# RUN: llvm-objdump -section-headers \
+# RUN:   %p/Inputs/elf-no-section-header-table.elf-x86-64 2>&1 | FileCheck %s
+
+# CHECK:      Sections:
+# CHECK-NEXT:  Idx Name          Size      Address          Type
+# CHECK-NEXT:    0 <no-name>     00000000 0000000000000000
Index: include/llvm/Object/ELF.h
===================================================================
--- include/llvm/Object/ELF.h
+++ include/llvm/Object/ELF.h
@@ -327,7 +327,7 @@
   if (Index == ELF::SHN_XINDEX)
     Index = Sections[0].sh_link;
 
-  if (!Index) // no section string table.
+  if (Index == ELF::SHN_UNDEF) // no section string table.
     return "";
   if (Index >= Sections.size())
     return createError("invalid section index");
@@ -491,6 +491,8 @@
   auto Table = getSectionStringTable(*SectionsOrErr);
   if (!Table)
     return Table.takeError();
+  if (Table->empty())
+    return "<no-name>";
   return getSectionName(Section, *Table);
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D28560.83966.patch
Type: text/x-patch
Size: 1328 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170111/ce90af5e/attachment.bin>


More information about the llvm-commits mailing list