Skip to content

Commit 31ef836

Browse files
committed
Replace bad auto symbol for Itanium RTTI
1 parent 7794bcf commit 31ef836

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

plugins/rtti/itanium.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -247,17 +247,15 @@ std::optional<ClassInfo> ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr)
247247
return std::nullopt;
248248

249249
auto typeInfo = TypeInfo(m_view, objectAddr);
250-
auto className = DemangleNameGNU3(m_view, allowMangledClassNames, typeInfo.type_name);
250+
auto className = DemangleNameItanium(m_view, allowMangledClassNames, typeInfo.type_name);
251251
if (!className.has_value())
252252
return std::nullopt;
253253
auto classInfo = ClassInfo{className.value()};
254254

255-
// TODO: className starts with 7, 9, 14
256-
// 7 == class_type
257-
// 9 == si_class_type
258-
// 14 == vmi_class_type
259-
260255
auto typeInfoName = fmt::format("_typeinfo_for_{}", classInfo.className);
256+
auto typeInfoSymbol = m_view->GetSymbolByAddress(objectAddr);
257+
if (typeInfoSymbol != nullptr)
258+
m_view->UndefineAutoSymbol(typeInfoSymbol);
261259
m_view->DefineAutoSymbol(new Symbol{DataSymbol, typeInfoName, objectAddr});
262260

263261
if (typeInfoVariant == TIVSIClass)
@@ -269,7 +267,7 @@ std::optional<ClassInfo> ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr)
269267
return std::nullopt;
270268
auto subTypeInfo = TypeInfo(m_view, siClassTypeInfo.base_type);
271269
// Demangle base class name and set
272-
auto baseClassName = DemangleNameGNU3(m_view, allowMangledClassNames, subTypeInfo.type_name);
270+
auto baseClassName = DemangleNameItanium(m_view, allowMangledClassNames, subTypeInfo.type_name);
273271
if (!baseClassName.has_value())
274272
{
275273
m_logger->LogWarn("Skipping base class with mangled name %llx", siClassTypeInfo.base_type);

plugins/rtti/rtti.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,26 @@ std::optional<std::string> RTTI::DemangleNameMS(BinaryView* view, bool allowMang
1414
}
1515

1616

17-
std::optional<std::string> RTTI::DemangleNameGNU3(BinaryView* view, bool allowMangled, const std::string &mangledName)
17+
std::string RemoveItaniumPrefix(const std::string& name) {
18+
// Remove class prefixes.
19+
// 7 is class_type
20+
// 9 is si_class_type
21+
// 14 is vmi_class_type
22+
if (name.rfind('7', 0) == 0)
23+
return name.substr(1);
24+
if (name.rfind('9', 0) == 0)
25+
return name.substr(1);
26+
if (name.rfind("14", 0) == 0)
27+
return name.substr(2);
28+
return name;
29+
}
30+
31+
32+
std::optional<std::string> RTTI::DemangleNameItanium(BinaryView* view, bool allowMangled, const std::string &mangledName)
1833
{
19-
QualifiedName demangledName = {};
20-
Ref<Type> outType = {};
21-
if (!DemangleGNU3(view->GetDefaultArchitecture(), mangledName, outType, demangledName, true))
22-
return DemangleNameLLVM(allowMangled, mangledName);
23-
return demangledName.GetString();
34+
if (auto demangledName = DemangleNameLLVM(allowMangled, mangledName))
35+
return RemoveItaniumPrefix(demangledName.value());
36+
return std::nullopt;
2437
}
2538

2639

plugins/rtti/rtti.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ constexpr int RTTI_CONFIDENCE = 100;
88
namespace BinaryNinja::RTTI {
99
std::optional<std::string> DemangleNameMS(BinaryView* view, bool allowMangled, const std::string &mangledName);
1010

11-
std::optional<std::string> DemangleNameGNU3(BinaryView* view, bool allowMangled, const std::string &mangledName);
11+
std::optional<std::string> DemangleNameItanium(BinaryView* view, bool allowMangled, const std::string &mangledName);
1212

1313
std::optional<std::string> DemangleNameLLVM(bool allowMangled, const std::string &mangledName);
1414

0 commit comments

Comments
 (0)