GP-5173 replaced deprecated demangler methods in rttiutil and rtti gnu script with new ones.

This commit is contained in:
ghidra007
2026-02-17 20:30:02 +00:00
parent c0fe936573
commit 9f68946141
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.plugin.core.analysis.ReferenceAddressPair;
import ghidra.app.util.NamespaceUtils; import ghidra.app.util.NamespaceUtils;
import ghidra.app.util.PseudoDisassembler; import ghidra.app.util.PseudoDisassembler;
import ghidra.app.util.demangler.DemangledObject; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.DemanglerUtil;
import ghidra.framework.plugintool.ServiceProvider; import ghidra.framework.plugintool.ServiceProvider;
import ghidra.program.flatapi.FlatProgramAPI; import ghidra.program.flatapi.FlatProgramAPI;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
@@ -2859,7 +2858,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
} }
mangledLabel = "_ZTS" + mangledLabel; mangledLabel = "_ZTS" + mangledLabel;
if (!isTypeinfoNameString(mangledLabel)) { if (!isTypeinfoNameString(mangledLabel, typeinfoNameAddress)) {
return null; return null;
} }
@@ -3029,15 +3028,27 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
return true; return true;
} }
private boolean isTypeinfoNameString(String string) { private boolean isTypeinfoNameString(String string, Address address) {
DemangledObject demangledObject = DemanglerUtil.demangle(string); List<DemangledObject> demangledObjects = DemanglerUtil.demangle(program, string, address);
if (demangledObject == null) { if (demangledObjects == null || demangledObjects.isEmpty()) {
return false; return false;
} }
if (demangledObject.getName().equals("typeinfo-name")) { for (DemangledObject demangledObject : demangledObjects) {
return true;
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; return false;
} }
@@ -23,8 +23,10 @@ import ghidra.app.cmd.data.TypeDescriptorModel;
import ghidra.app.util.NamespaceUtils; import ghidra.app.util.NamespaceUtils;
import ghidra.app.util.PseudoDisassembler; import ghidra.app.util.PseudoDisassembler;
import ghidra.app.util.datatype.microsoft.MSDataTypeUtils; import ghidra.app.util.datatype.microsoft.MSDataTypeUtils;
import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.DemangledObject; 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.Address;
import ghidra.program.model.address.AddressSetView; import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
@@ -82,16 +84,22 @@ public class RttiUtil {
} }
// check for similar symbol // check for similar symbol
MicrosoftDemangler demangler = new MicrosoftDemangler();
DemangledObject matchingDemangledObject = null; DemangledObject matchingDemangledObject = null;
SymbolIterator symbols = symbolTable.getSymbolsAsIterator(rttiAddress); SymbolIterator symbols = symbolTable.getSymbolsAsIterator(rttiAddress);
for (Symbol symbol : symbols) { for (Symbol symbol : symbols) {
String name = symbol.getName(); String name = symbol.getName();
try {
// if mangled get the matching demangled object if there is one and save for after loop MicrosoftMangledContext mangledContext =
// in case symbols are not demangled yet demangler.createMangledContext(name, null, program, symbol.getAddress());
DemangledObject demangledObject = DemanglerUtil.demangle(name); DemangledObject demangledObject = demangler.demangle(mangledContext);
if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) { if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) {
matchingDemangledObject = demangledObject; matchingDemangledObject = demangledObject;
continue;
}
}
catch (DemangledException e) {
// Couldn't demangle.
continue; continue;
} }