Merge remote-tracking branch 'origin/GP-5173_ghidra007_updateRTTIAnalyzer_and_script_with_new_demangler--SQUASHED' into patch

This commit is contained in:
Ryan Kurtz
2026-02-17 15:35:30 -05:00
2 changed files with 34 additions and 15 deletions
@@ -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<DemangledObject> 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;
}
@@ -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;
}