mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-24 13:21:22 +08:00
GP-5993 added omited purecall handling in RTTI script gcc case
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user