From 5b8952baf851b460bab551b1ed844990d67474be Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Sat, 21 Mar 2020 08:53:11 -0500 Subject: [PATCH] ghidra: handle destructor ABI differences --- library/xml | 2 +- reversing/import_df_structures.java | 30 +++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/library/xml b/library/xml index 8e1875902..ef09097be 160000 --- a/library/xml +++ b/library/xml @@ -1 +1 @@ -Subproject commit 8e18759023229cf261bc7c3e30c6547ace4adec3 +Subproject commit ef09097be76a58b5911b5bf65bee7c3cd6d7bb16 diff --git a/reversing/import_df_structures.java b/reversing/import_df_structures.java index c8ff73e41..d0b31d40d 100644 --- a/reversing/import_df_structures.java +++ b/reversing/import_df_structures.java @@ -1214,12 +1214,38 @@ public class import_df_structures extends GhidraScript for (var vm : t.vmethods) { String mname = null; + if (vm.isDestructor) + { + mname = "~" + name; + if (baseClassPadding == 1) + { + // GCC + var mt = dtm.getPointer(createMethodDataType(name + "::" + mname, vm), currentProgram.getDefaultPointerSize()); + st.add(mt, mname, null); + st.add(mt, mname + "(deleting)", null); + } + else + { + // MSVC + if (vm.arguments.isEmpty()) + { + var arg = new TypeDef.Field(); + arg.meta = "number"; + arg.subtype = "bool"; + arg.hasName = true; + arg.name = "deleting"; + vm.arguments.add(arg); + } + var mt = dtm.getPointer(createMethodDataType(name + "::" + mname, vm), currentProgram.getDefaultPointerSize()); + st.add(mt, mname, null); + } + continue; + } + if (vm.hasName) mname = vm.name; else if (vm.hasAnonName) mname = name + "_" + vm.anonName; - else if (vm.isDestructor) - mname = "~" + name; st.add(dtm.getPointer(createMethodDataType(name + "::" + mname, vm), currentProgram.getDefaultPointerSize()), mname, null); }