diff options
author | Tim Northover <t.p.northover@gmail.com> | 2024-08-15 19:19:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-15 11:19:30 -0700 |
commit | 52337d5f9d108f04b2ed06069b21a255c232dc1f (patch) | |
tree | a09f78a9cb8c698b963b2155abb3cf443daee93d /llvm/tools/llvm-objdump | |
parent | 7493ea22f8027dc163ca521a71150d264891853c (diff) | |
download | llvm-52337d5f9d108f04b2ed06069b21a255c232dc1f.zip llvm-52337d5f9d108f04b2ed06069b21a255c232dc1f.tar.gz llvm-52337d5f9d108f04b2ed06069b21a255c232dc1f.tar.bz2 |
llvm-objdump: ensure a MachO symbol isn't STAB before looking up secion (#86667)
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.
Diffstat (limited to 'llvm/tools/llvm-objdump')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 768a976..b69d14b 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -2885,16 +2885,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 @@ -2913,6 +2903,16 @@ 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()) |