[PATCH] D71394: llvm-objdump should ignore Mach-O stab symbols for disassembly.

Michael Trent via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 11 23:02:55 PST 2019


mtrent created this revision.
mtrent added reviewers: pete, lhames, ab, thegameg.
Herald added subscribers: seiya, rupprecht.
Herald added a reviewer: jhenderson.
Herald added a project: LLVM.

llvm-objdump will commonly error out when disassembling a Mach-O binary with
stab symbols, or when printing a Mach-O symbol table that includesstab symbols.
That is because the Mach-O N_OSO symbol has been modified to include the
bottom 8-bit value of the Mach-O's cpusubtype value in the section field. In
general, one cannot blindly assume a stab symbol's section field is valid
unless one has actually consulted the specification for the specific stab.

Since objdump mostly just walks the symbol table to get mnemonics for code
disassembly it's best for objdump to just ignore stab symbols. llvm-nm will
do a more complete and correct job of displaying Mach-O symbol table contents.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71394

Files:
  llvm/test/tools/llvm-objdump/Inputs/macho-stabs-x86_64
  llvm/test/tools/llvm-objdump/macho-stabs.test
  llvm/tools/llvm-objdump/llvm-objdump.cpp


Index: llvm/tools/llvm-objdump/llvm-objdump.cpp
===================================================================
--- llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1148,6 +1148,18 @@
         continue;
     }
 
+    // Don't ask a MachO STAB for its section unless you know that STAB has a
+    // section, because a STAB section might not actually be a section. 
+    if (Obj->isMachO()) {
+      const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(Obj);
+      DataRefImpl SymDRI = Symbol.getRawDataRefImpl();
+      uint8_t NType = (MachO->is64Bit() ?
+                       MachO->getSymbol64TableEntry(SymDRI).n_type:
+                       MachO->getSymbolTableEntry(SymDRI).n_type);
+      if (NType & MachO::N_STAB)
+        continue;
+    }
+
     section_iterator SecI = unwrapOrError(Symbol.getSection(), FileName);
     if (SecI != Obj->section_end())
       AllSymbols[*SecI].emplace_back(Address, Name, SymbolType);
@@ -1813,8 +1825,23 @@
     SymbolRef::Type Type = unwrapOrError(Symbol.getType(), FileName,
                                          ArchiveName, ArchitectureName);
     uint32_t Flags = Symbol.getFlags();
-    section_iterator Section = unwrapOrError(Symbol.getSection(), FileName,
+
+    // Don't ask a MachO STAB for its section unless you know that STAB has a
+    // section, because a STAB section might not actually be a section. 
+    bool isSTAB = false;
+    if (O->isMachO()) {
+      const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(O);
+      DataRefImpl SymDRI = Symbol.getRawDataRefImpl();
+      uint8_t NType = (MachO->is64Bit() ?
+                       MachO->getSymbol64TableEntry(SymDRI).n_type:
+                       MachO->getSymbolTableEntry(SymDRI).n_type);
+      if (NType & MachO::N_STAB)
+        isSTAB = true;
+    }
+    section_iterator Section = isSTAB ? O->section_end() :
+                               unwrapOrError(Symbol.getSection(), FileName,
                                              ArchiveName, ArchitectureName);
+
     StringRef Name;
     if (Type == SymbolRef::ST_Debug && Section != O->section_end()) {
       if (Expected<StringRef> NameOrErr = Section->getName())
Index: llvm/test/tools/llvm-objdump/macho-stabs.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-objdump/macho-stabs.test
@@ -0,0 +1,2 @@
+# RUN: llvm-objdump --syms %p/Inputs/macho-stabs-x86_64
+# RUN: llvm-objdump -D %p/Inputs/macho-stabs-x86_64


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71394.233505.patch
Type: text/x-patch
Size: 2538 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191212/711390bb/attachment.bin>


More information about the llvm-commits mailing list