diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java index f24230306d..b2f8764c48 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java @@ -25,8 +25,7 @@ import ghidra.app.cmd.label.DemanglerCmd; import ghidra.app.plugin.core.analysis.ReferenceAddressPair; import ghidra.app.util.NamespaceUtils; import ghidra.app.util.PseudoDisassembler; -import ghidra.app.util.demangler.DemangledObject; -import ghidra.app.util.demangler.DemanglerUtil; +import ghidra.app.util.demangler.*; import ghidra.framework.plugintool.ServiceProvider; import ghidra.program.flatapi.FlatProgramAPI; import ghidra.program.model.address.*; @@ -2859,7 +2858,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { } mangledLabel = "_ZTS" + mangledLabel; - if (!isTypeinfoNameString(mangledLabel)) { + if (!isTypeinfoNameString(mangledLabel, typeinfoNameAddress)) { return null; } @@ -3029,15 +3028,27 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return true; } - private boolean isTypeinfoNameString(String string) { + private boolean isTypeinfoNameString(String string, Address address) { - DemangledObject demangledObject = DemanglerUtil.demangle(string); - if (demangledObject == null) { + List demangledObjects = DemanglerUtil.demangle(program, string, address); + if (demangledObjects == null || demangledObjects.isEmpty()) { return false; } - if (demangledObject.getName().equals("typeinfo-name")) { - return true; + for (DemangledObject demangledObject : demangledObjects) { + + DemanglerOptions options = demangledObject.getMangledContext().getOptions(); + + // Currently no good way to do this since this is in Decompiler package and GnuDemangler + // is in its own package. Once no longer a script but an analyzer in Base, update to + // do !(options instanceof GnuDemanglerOptions) + if (!options.toString().contains("gnu")) { + continue; + } + + if (demangledObject.getName().equals("typeinfo-name")) { + return true; + } } return false; } diff --git a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java index cbfb24b266..34add83b2d 100644 --- a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java +++ b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java @@ -23,8 +23,10 @@ import ghidra.app.cmd.data.TypeDescriptorModel; import ghidra.app.util.NamespaceUtils; import ghidra.app.util.PseudoDisassembler; import ghidra.app.util.datatype.microsoft.MSDataTypeUtils; +import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledObject; -import ghidra.app.util.demangler.DemanglerUtil; +import ghidra.app.util.demangler.microsoft.MicrosoftDemangler; +import ghidra.app.util.demangler.microsoft.MicrosoftMangledContext; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressSetView; import ghidra.program.model.listing.*; @@ -82,16 +84,22 @@ public class RttiUtil { } // check for similar symbol + MicrosoftDemangler demangler = new MicrosoftDemangler(); DemangledObject matchingDemangledObject = null; SymbolIterator symbols = symbolTable.getSymbolsAsIterator(rttiAddress); for (Symbol symbol : symbols) { String name = symbol.getName(); - - // if mangled get the matching demangled object if there is one and save for after loop - // in case symbols are not demangled yet - DemangledObject demangledObject = DemanglerUtil.demangle(name); - if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) { - matchingDemangledObject = demangledObject; + try { + MicrosoftMangledContext mangledContext = + demangler.createMangledContext(name, null, program, symbol.getAddress()); + DemangledObject demangledObject = demangler.demangle(mangledContext); + if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) { + matchingDemangledObject = demangledObject; + continue; + } + } + catch (DemangledException e) { + // Couldn't demangle. continue; }