[llvm] r354661 - [obj2yaml] - Do not miss section index for special symbols.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 22 00:45:21 PST 2019


Author: grimar
Date: Fri Feb 22 00:45:21 2019
New Revision: 354661

URL: http://llvm.org/viewvc/llvm-project?rev=354661&view=rev
Log:
[obj2yaml] - Do not miss section index for special symbols.

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

Added:
    llvm/trunk/test/tools/obj2yaml/Inputs/shn_xindex.o   (with props)
    llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml
Modified:
    llvm/trunk/tools/obj2yaml/elf2yaml.cpp

Added: llvm/trunk/test/tools/obj2yaml/Inputs/shn_xindex.o
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/obj2yaml/Inputs/shn_xindex.o?rev=354661&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/obj2yaml/Inputs/shn_xindex.o
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml?rev=354661&view=auto
==============================================================================
--- llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml (added)
+++ llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml Fri Feb 22 00:45:21 2019
@@ -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.

Modified: llvm/trunk/tools/obj2yaml/elf2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/elf2yaml.cpp?rev=354661&r1=354660&r2=354661&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/elf2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/elf2yaml.cpp Fri Feb 22 00:45:21 2019
@@ -284,6 +284,13 @@ ELFDumper<ELFT>::dumpSymbol(const Elf_Sy
     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());




More information about the llvm-commits mailing list