From 931856314b7d824aeba8c7ded3b7ea5605f880f7 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Wed, 22 Feb 2023 18:44:16 -0500 Subject: [PATCH] GP-3125 demangler analyzer improvement to try non-primary symbols when imported primary symbol fails to demangle. --- .../analysis/AbstractDemanglerAnalyzer.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java index a5a6bfc190..6ca40bb4e2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AbstractDemanglerAnalyzer.java @@ -111,6 +111,8 @@ public abstract class AbstractDemanglerAnalyzer extends AbstractAnalyzer { int count = initialCount; SymbolTable symbolTable = program.getSymbolTable(); + // TODO: iterator will continually need to reinitialize due to symbol changes + // consider copying primary symbols to alt storage for iteration SymbolIterator it = symbolTable.getPrimarySymbolIterator(set, true); while (it.hasNext()) { monitor.checkCanceled(); @@ -129,7 +131,27 @@ public abstract class AbstractDemanglerAnalyzer extends AbstractAnalyzer { DemangledObject demangled = demangle(mangled, address, options, log); if (demangled != null) { apply(program, address, demangled, options, log, monitor); + continue; } + + // Only attempt to demangle a non-primary symbol if primary is imported and will + // not demangle. + if (symbol.getSource() != SourceType.IMPORTED) { + continue; + } + + for (Symbol altSym : symbolTable.getSymbols(address)) { + if (altSym.isPrimary() || skipSymbol(altSym)) { + continue; + } + mangled = cleanSymbol(address, altSym.getName()); + demangled = demangle(mangled, address, options, log); + if (demangled != null) { + apply(program, address, demangled, options, log, monitor); + break; + } + } + } return count; }