GP-5993 added omited purecall handling in RTTI script gcc case

This commit is contained in:
ghidra007
2025-09-19 19:57:32 +00:00
committed by Ryan Kurtz
parent 9ec7aef06e
commit 0d07998f6b
2 changed files with 33 additions and 8 deletions
@@ -111,7 +111,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
TaskMonitor monitor) throws Exception {
super(program, serviceProvider, api, createBookmarks, useShortTemplates, nameVfunctions,
makeVfunctionsThisCalls,isDwarfLoaded, monitor);
makeVfunctionsThisCalls, isDwarfLoaded, monitor);
this.isDwarfLoaded = isDwarfLoaded;
@@ -213,6 +213,8 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
Msg.debug(this, "Processing constructors and destructors");
processConstructorAndDestructors();
identifyPureVirtualFunction(recoveredClasses);
Msg.debug(this, "Creating vftable order maps");
createVftableOrderMap(recoveredClasses);
@@ -4505,7 +4505,7 @@ public class RecoveredClassHelper {
// if the function is a purecall need to create the function definition using
// the equivalent child virtual function signature
if (nameField.contains("purecall")) {
if (nameField.contains("purecall") || nameField.contains("pure_virtual")) {
nameField = DEFAULT_VFUNCTION_PREFIX + vfunctionNumber;
@@ -4583,15 +4583,11 @@ public class RecoveredClassHelper {
List<Address> processedVftables = new ArrayList<Address>();
// get references to purecall function to figure out which classes to process
ReferenceIterator purecallRefs =
program.getReferenceManager().getReferencesTo(purecall.getEntryPoint());
HashSet<Address> purecallRefs = getPurecallRefs();
while (purecallRefs.hasNext()) {
for (Address fromAddress : purecallRefs) {
monitor.checkCancelled();
Reference purecallRef = purecallRefs.next();
Address fromAddress = purecallRef.getFromAddress();
// get data containing the purecall reference to get the vftable structure
Data data = program.getListing().getDataContaining(fromAddress);
@@ -4662,6 +4658,33 @@ public class RecoveredClassHelper {
}
// get references to purecall function to figure out which classes to process
HashSet<Address> getPurecallRefs() throws CancelledException {
HashSet<Address> purecalls = new HashSet<>();
ReferenceIterator purecallRefs =
program.getReferenceManager().getReferencesTo(purecall.getEntryPoint());
while (purecallRefs.hasNext()) {
monitor.checkCancelled();
purecalls.add(purecallRefs.next().getFromAddress());
}
Address[] functionThunkAddresses = purecall.getFunctionThunkAddresses(true);
if (functionThunkAddresses != null) {
for (Address purecallThunk : functionThunkAddresses) {
monitor.checkCancelled();
purecallRefs =
program.getReferenceManager().getReferencesTo(purecallThunk);
while (purecallRefs.hasNext()) {
monitor.checkCancelled();
purecalls.add(purecallRefs.next().getFromAddress());
}
}
}
return purecalls;
}
/**
* Method to get a child class virtual function at the given offset into the correct virtual function table
* @param recoveredClass the given class