[llvm] 84cc39c - [llvm-readobj] Don't print out section names for STABS symbols

Jez Ng via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 12 18:56:30 PDT 2020


Author: Jez Ng
Date: 2020-10-12T18:55:40-07:00
New Revision: 84cc39c329f8d4910b8f558971d715f949ce1e94

URL: https://github.com/llvm/llvm-project/commit/84cc39c329f8d4910b8f558971d715f949ce1e94
DIFF: https://github.com/llvm/llvm-project/commit/84cc39c329f8d4910b8f558971d715f949ce1e94.diff

LOG: [llvm-readobj] Don't print out section names for STABS symbols

This diff is similar to what D71394 did for `llvm-objdump` -- it avoids
trying to look up a section name for STABS symbols, since some STABS
symbol types (like `N_OSO`) use the `n_sect` field to store other data
instead of a section index.

Differential Revision: https://reviews.llvm.org/D88468

Added: 
    llvm/test/tools/llvm-readobj/MachO/stabs.yaml

Modified: 
    llvm/test/tools/llvm-objcopy/MachO/symbol-table.test
    llvm/tools/llvm-readobj/MachODumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test b/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test
index 7fec35fde1df..133f1744bb9a 100644
--- a/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test
+++ b/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test
@@ -63,7 +63,7 @@
 # CHECK-NEXT:   Symbol {
 # CHECK-NEXT:     Name: /var/folders/1d/zyfdpp7j2995h5hqspjy28bc0000gn/T/main-c5ac21.o (38)
 # CHECK-NEXT:     Type: SymDebugTable (0x66)
-# CHECK-NEXT:     Section: __got (0x3)
+# CHECK-NEXT:     Section:  (0x3)
 # CHECK-NEXT:     RefType: ReferenceFlagUndefinedLazy (0x1)
 # CHECK-NEXT:     Flags [ (0x0)
 # CHECK-NEXT:     ]
@@ -72,7 +72,7 @@
 # CHECK-NEXT:   Symbol {
 # CHECK-NEXT:     Name:  (207)
 # CHECK-NEXT:     Type: SymDebugTable (0x2E)
-# CHECK-NEXT:     Section: __text (0x1)
+# CHECK-NEXT:     Section:  (0x1)
 # CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
 # CHECK-NEXT:     Flags [ (0x0)
 # CHECK-NEXT:     ]
@@ -81,7 +81,7 @@
 # CHECK-NEXT:   Symbol {
 # CHECK-NEXT:     Name: _main (101)
 # CHECK-NEXT:     Type: SymDebugTable (0x24)
-# CHECK-NEXT:     Section: __text (0x1)
+# CHECK-NEXT:     Section:  (0x1)
 # CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
 # CHECK-NEXT:     Flags [ (0x0)
 # CHECK-NEXT:     ]
@@ -99,7 +99,7 @@
 # CHECK-NEXT:   Symbol {
 # CHECK-NEXT:     Name:  (207)
 # CHECK-NEXT:     Type: SymDebugTable (0x4E)
-# CHECK-NEXT:     Section: __text (0x1)
+# CHECK-NEXT:     Section:  (0x1)
 # CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
 # CHECK-NEXT:     Flags [ (0x0)
 # CHECK-NEXT:     ]
@@ -108,7 +108,7 @@
 # CHECK-NEXT:   Symbol {
 # CHECK-NEXT:     Name: _PrivateSymbol (169)
 # CHECK-NEXT:     Type: SymDebugTable (0x26)
-# CHECK-NEXT:     Section: __bss (0x4)
+# CHECK-NEXT:     Section:  (0x4)
 # CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
 # CHECK-NEXT:     Flags [ (0x0)
 # CHECK-NEXT:     ]
@@ -135,7 +135,7 @@
 # CHECK-NEXT:   Symbol {
 # CHECK-NEXT:     Name:  (207)
 # CHECK-NEXT:     Type: SymDebugTable (0x64)
-# CHECK-NEXT:     Section: __text (0x1)
+# CHECK-NEXT:     Section:  (0x1)
 # CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
 # CHECK-NEXT:     Flags [ (0x0)
 # CHECK-NEXT:     ]

diff  --git a/llvm/test/tools/llvm-readobj/MachO/stabs.yaml b/llvm/test/tools/llvm-readobj/MachO/stabs.yaml
new file mode 100644
index 000000000000..2e4b4715eb00
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/MachO/stabs.yaml
@@ -0,0 +1,129 @@
+## Verify that llvm-readobj can dump files containing stabs symbols,
+## particularly symbols of type N_OSO which have repurposed the n_sect field
+## to store a non-section-index value.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj --syms %t | FileCheck %s
+
+# CHECK:      Symbols [
+# CHECK-NEXT:   Symbol {
+# CHECK-NEXT:     Name: /Volumes/Sandbox/ (2)
+# CHECK-NEXT:     Type: SymDebugTable (0x64)
+# CHECK-NEXT:     Section:  (0x0)
+# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
+# CHECK-NEXT:     Flags [ (0x0)
+# CHECK-NEXT:     ]
+# CHECK-NEXT:     Value: 0x0
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Symbol {
+# CHECK-NEXT:     Name: /Volumes/Sandbox/test.o (20)
+# CHECK-NEXT:     Type: SymDebugTable (0x66)
+# CHECK-NEXT:     Section:  (0x3)
+# CHECK-NEXT:     RefType: ReferenceFlagUndefinedLazy (0x1)
+# CHECK-NEXT:     Flags [ (0x0)
+# CHECK-NEXT:     ]
+# CHECK-NEXT:     Value: 0x5F72D5E2
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Symbol {
+# CHECK-NEXT:     Name:  (1)
+# CHECK-NEXT:     Type: SymDebugTable (0x2E)
+# CHECK-NEXT:     Section:  (0x1)
+# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
+# CHECK-NEXT:     Flags [ (0x0)
+# CHECK-NEXT:     ]
+# CHECK-NEXT:     Value: 0x100000FA0
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Symbol {
+# CHECK-NEXT:     Name: _foo (44)
+# CHECK-NEXT:     Type: SymDebugTable (0x24)
+# CHECK-NEXT:     Section:  (0x1)
+# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
+# CHECK-NEXT:     Flags [ (0x0)
+# CHECK-NEXT:     ]
+# CHECK-NEXT:     Value: 0x100000FA0
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Symbol {
+# CHECK-NEXT:     Name:  (1)
+# CHECK-NEXT:     Type: SymDebugTable (0x4E)
+# CHECK-NEXT:     Section:  (0x1)
+# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
+# CHECK-NEXT:     Flags [ (0x0)
+# CHECK-NEXT:     ]
+# CHECK-NEXT:     Value: 0xF
+# CHECK-NEXT:   }
+# CHECK-NEXT: ]
+
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000002
+  ncmds:           2
+  sizeofcmds:      744
+  flags:           0x00200085
+  reserved:        0x00000000
+LoadCommands:
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         232
+    segname:         __TEXT
+    vmaddr:          4294967296
+    vmsize:          4096
+    fileoff:         0
+    filesize:        4096
+    maxprot:         5
+    initprot:        5
+    nsects:          1
+    flags:           0
+    Sections:
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x00000000
+        size:            0
+        offset:          0x00000000
+        align:           4
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          4152
+    nsyms:           5
+    stroff:          4328
+    strsize:         49
+LinkEditData:
+  NameList:
+    - n_strx:          2
+      n_type:          0x64 ## N_SO
+      n_sect:          0
+      n_desc:          0
+      n_value:         0
+    - n_strx:          20
+      n_type:          0x66 ## N_OSO
+      n_sect:          3
+      n_desc:          1
+      n_value:         1601361378
+    - n_strx:          1
+      n_type:          0x2E ## N_BNSYM
+      n_sect:          1
+      n_desc:          0
+      n_value:         4294971296
+    - n_strx:          44
+      n_type:          0x24 ## N_FUN
+      n_sect:          1
+      n_desc:          0
+      n_value:         4294971296
+    - n_strx:          1
+      n_type:          0x4E ## N_ENSYM
+      n_sect:          1
+      n_desc:          0
+      n_value:         15
+  StringTable:
+    - ' '
+    - '/Volumes/Sandbox/'
+    - '/Volumes/Sandbox/test.o'
+    - _foo
+...

diff  --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp
index a60fb8cef6a7..5c4960804e8f 100644
--- a/llvm/tools/llvm-readobj/MachODumper.cpp
+++ b/llvm/tools/llvm-readobj/MachODumper.cpp
@@ -623,13 +623,20 @@ void MachODumper::printSymbol(const SymbolRef &Symbol) {
   getSymbol(Obj, Symbol.getRawDataRefImpl(), MOSymbol);
 
   StringRef SectionName = "";
-  Expected<section_iterator> SecIOrErr = Symbol.getSection();
-  if (!SecIOrErr)
-    reportError(SecIOrErr.takeError(), Obj->getFileName());
-
-  section_iterator SecI = *SecIOrErr;
-  if (SecI != Obj->section_end())
-    SectionName = unwrapOrError(Obj->getFileName(), SecI->getName());
+  // Don't ask a Mach-O STABS symbol for its section unless we know that
+  // STAB symbol's section field refers to a valid section index. Otherwise
+  // the symbol may error trying to load a section that does not exist.
+  // TODO: Add a whitelist of STABS symbol types that contain valid section
+  // indices.
+  if (!(MOSymbol.Type & MachO::N_STAB)) {
+    Expected<section_iterator> SecIOrErr = Symbol.getSection();
+    if (!SecIOrErr)
+      reportError(SecIOrErr.takeError(), Obj->getFileName());
+
+    section_iterator SecI = *SecIOrErr;
+    if (SecI != Obj->section_end())
+      SectionName = unwrapOrError(Obj->getFileName(), SecI->getName());
+  }
 
   DictScope D(W, "Symbol");
   W.printNumber("Name", SymbolName, MOSymbol.StringIndex);


        


More information about the llvm-commits mailing list