summaryrefslogtreecommitdiff
path: root/plugins/rtti/itanium.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/rtti/itanium.cpp')
-rw-r--r--plugins/rtti/itanium.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/plugins/rtti/itanium.cpp b/plugins/rtti/itanium.cpp
index 745324c7..95122fad 100644
--- a/plugins/rtti/itanium.cpp
+++ b/plugins/rtti/itanium.cpp
@@ -330,6 +330,13 @@ std::optional<TypeInfoVariant> ReadTypeInfoVariant(BinaryView *view, uint64_t ob
auto baseSymName = baseSym->GetShortName();
if (baseSymName.find("__cxxabiv1") != std::string::npos)
{
+ // Skip char array base data variables. This fixes the root base types being constructed twice at 0x0 and +0x8.
+ // 1400f81a0 void* _typeinfo_for___cxxabiv1::__class_type_info = data_1400fce10 <---- First at 0x0
+ // 1400f81a8 struct __cxxabiv1::__class_type_info _typeinfo_for_��@ = <----- Second at 0x8
+ DataVariable baseDV;
+ if (view->GetDataVariableAtAddress(typeInfo->base, baseDV) && baseDV.type->IsArray())
+ return std::nullopt;
+
// symbol takes the form of `abi::base_name::addend`
if (baseSymName.find("si_class_type_info") != std::string::npos)
return TIVSIClass;