]> granicus.if.org Git - llvm/commitdiff
[obj2yaml] - Do not miss section index for special symbols.
authorGeorge Rimar <grimar@accesssoftek.com>
Fri, 22 Feb 2019 08:45:21 +0000 (08:45 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Fri, 22 Feb 2019 08:45:21 +0000 (08:45 +0000)
This fixes https://bugs.llvm.org/show_bug.cgi?id=40786
("obj2yaml symbol output missing section index for SHN_ABS and SHN_COMMON symbols")

Since SHN_ABS and SHN_COMMON symbols are special, we should preserve
the st_shndx for them. The patch does this for them and the other special symbols.

The test case is based on the test provided by James Henderson at the bug page!

Differential revision: https://reviews.llvm.org/D58498

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354661 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/obj2yaml/Inputs/shn_xindex.o [new file with mode: 0644]
test/tools/obj2yaml/special-symbol-indices.yaml [new file with mode: 0644]
tools/obj2yaml/elf2yaml.cpp

diff --git a/test/tools/obj2yaml/Inputs/shn_xindex.o b/test/tools/obj2yaml/Inputs/shn_xindex.o
new file mode 100644 (file)
index 0000000..73e2b60
Binary files /dev/null and b/test/tools/obj2yaml/Inputs/shn_xindex.o differ
diff --git a/test/tools/obj2yaml/special-symbol-indices.yaml b/test/tools/obj2yaml/special-symbol-indices.yaml
new file mode 100644 (file)
index 0000000..127dc25
--- /dev/null
@@ -0,0 +1,46 @@
+# RUN: yaml2obj %s > %t
+# RUN: obj2yaml %t | FileCheck %s
+
+## Test checks that we are able to handle symbols with special/reserved indices.
+
+# CHECK:      Symbols:
+# CHECK-NEXT:   Global:
+# CHECK-NEXT:     - Name:    absolute
+# CHECK-NEXT:       Index:   SHN_ABS
+# CHECK-NEXT:       Value:   0x0000000000001234
+# CHECK-NEXT:     - Name:    common
+# CHECK-NEXT:       Index:   SHN_COMMON
+# CHECK-NEXT:     - Name:    valid_index
+# CHECK-NEXT:       Section: .text
+# CHECK-NEXT:     - Name:    processor_specific_index
+# CHECK-NEXT:       Index:   SHN_HEXAGON_SCOMMON_1
+# CHECK-NEXT:     - Name:    unknown_index
+# CHECK-NEXT:       Index:   0x0000FFFE
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_HEXAGON
+Sections:
+  - Name: .text
+    Type: SHT_PROGBITS
+Symbols:
+  Global:
+    - Name:     absolute
+      Index:    SHN_ABS
+      Value:    0x1234
+    - Name:     common
+      Index:    SHN_COMMON
+    - Name:     valid_index
+      Index:    0x1
+    - Name:     processor_specific_index
+      Index:    SHN_HEXAGON_SCOMMON_1
+    - Name:     unknown_index
+      Index:    0xfffe
+
+## shn_xindex.o contains a symbol with st_shndx == SHN_XINDEX.
+## We do not support it at this moment.
+# RUN: not obj2yaml %S/Inputs/shn_xindex.o 2>&1 | FileCheck %s --check-prefix=ERR
+# ERR: Error reading file: {{.*}}shn_xindex.o: Feature not yet implemented.
index b02c25ad153dc686324affe5a2beaf13893b3a1c..7f5e9a28d725741b4ba3d58238dab50b216ea353 100644 (file)
@@ -284,6 +284,13 @@ ELFDumper<ELFT>::dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
     return errorToErrorCode(SymbolNameOrErr.takeError());
   S.Name = SymbolNameOrErr.get();
 
+  if (Sym->st_shndx >= ELF::SHN_LORESERVE) {
+    if (Sym->st_shndx == ELF::SHN_XINDEX)
+      return obj2yaml_error::not_implemented;
+    S.Index = (ELFYAML::ELF_SHN)Sym->st_shndx;
+    return obj2yaml_error::success;
+  }
+
   auto ShdrOrErr = Obj.getSection(Sym, SymTab, ShndxTable);
   if (!ShdrOrErr)
     return errorToErrorCode(ShdrOrErr.takeError());