[llvm] llvm-objdump: ensure a MachO symbol isn't STAB before looking up secion (PR #86667)

via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 26 07:15:27 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-binary-utilities

Author: Tim Northover (TNorthover)

<details>
<summary>Changes</summary>

The section field has been repurposed for some STAB symbol types, and if we blindly look it up we'll produce an error and terminate. Logic already existed

Existing stabs test had a section that was in range. Unfortunately I don't know of an easy way to produce stabs entries in LLVM (I thought they died in the 90s until this came up) so I just binary-edited it to cause a failure on existing llvm-objdump.

---
Full diff: https://github.com/llvm/llvm-project/pull/86667.diff


2 Files Affected:

- (modified) llvm/test/tools/llvm-objdump/MachO/Inputs/macho-stabs-x86_64 () 
- (modified) llvm/tools/llvm-objdump/llvm-objdump.cpp (+11-10) 


``````````diff
diff --git a/llvm/test/tools/llvm-objdump/MachO/Inputs/macho-stabs-x86_64 b/llvm/test/tools/llvm-objdump/MachO/Inputs/macho-stabs-x86_64
index e95c8204c710e0..c41573aa4bf3b0 100755
Binary files a/llvm/test/tools/llvm-objdump/MachO/Inputs/macho-stabs-x86_64 and b/llvm/test/tools/llvm-objdump/MachO/Inputs/macho-stabs-x86_64 differ
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 78cf67b1e630bb..f9f073e586913f 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -2824,16 +2824,6 @@ void Dumper::printSymbol(const SymbolRef &Symbol,
     reportUniqueWarning(AddrOrErr.takeError());
     return;
   }
-  uint64_t Address = *AddrOrErr;
-  section_iterator SecI = unwrapOrError(Symbol.getSection(), FileName);
-  if (SecI != O.section_end() && shouldAdjustVA(*SecI))
-    Address += AdjustVMA;
-  if ((Address < StartAddress) || (Address > StopAddress))
-    return;
-  SymbolRef::Type Type =
-      unwrapOrError(Symbol.getType(), FileName, ArchiveName, ArchitectureName);
-  uint32_t Flags =
-      unwrapOrError(Symbol.getFlags(), FileName, ArchiveName, ArchitectureName);
 
   // Don't ask a Mach-O STAB symbol for its section unless you know that
   // STAB symbol's section field refers to a valid section index. Otherwise
@@ -2852,6 +2842,17 @@ void Dumper::printSymbol(const SymbolRef &Symbol,
                                  : unwrapOrError(Symbol.getSection(), FileName,
                                                  ArchiveName, ArchitectureName);
 
+  uint64_t Address = *AddrOrErr;
+  if (Section != O.section_end() && shouldAdjustVA(*Section))
+    Address += AdjustVMA;
+  if ((Address < StartAddress) || (Address > StopAddress))
+    return;
+  SymbolRef::Type Type =
+      unwrapOrError(Symbol.getType(), FileName, ArchiveName, ArchitectureName);
+  uint32_t Flags =
+      unwrapOrError(Symbol.getFlags(), FileName, ArchiveName, ArchitectureName);
+
+
   StringRef Name;
   if (Type == SymbolRef::ST_Debug && Section != O.section_end()) {
     if (Expected<StringRef> NameOrErr = Section->getName())

``````````

</details>


https://github.com/llvm/llvm-project/pull/86667


More information about the llvm-commits mailing list