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; }