Skip to content

Commit 33f082a

Browse files
committed
[ObjC] Use relative pointer types for members of objc_method_entry_t
They were previously relying on the Objective-C workflow to render the `rptr_t` typedef. Relative pointer types are now a first class citizen and are rendered correctly without any additional work.
1 parent 67ae186 commit 33f082a

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

objectivec/objc.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,9 +1265,6 @@ void ObjCProcessor::ProcessObjCData()
12651265
m_symbolQueue = new SymbolQueue();
12661266
auto addrSize = m_data->GetAddressSize();
12671267

1268-
m_typeNames.relativePtr = defineTypedef(m_data, {"rptr_t"}, Type::IntegerType(4, true));
1269-
auto rptr_t = Type::NamedType(m_data, m_typeNames.relativePtr);
1270-
12711268
m_typeNames.id = defineTypedef(m_data, {"id"}, Type::PointerType(addrSize, Type::VoidType()));
12721269
m_typeNames.sel = defineTypedef(m_data, {"SEL"}, Type::PointerType(addrSize, Type::IntegerType(1, false)));
12731270

@@ -1276,18 +1273,28 @@ void ObjCProcessor::ProcessObjCData()
12761273
m_typeNames.nsuInteger = defineTypedef(m_data, {"NSUInteger"}, Type::IntegerType(addrSize, false));
12771274
m_typeNames.cgFloat = defineTypedef(m_data, {"CGFloat"}, Type::FloatType(addrSize));
12781275

1279-
Ref<Type> relativeSelectorPtr;
1276+
BNPointerBaseType relativeSelectorBaseType = RelativeToVariableAddressPointerBaseType;
1277+
uint64_t relativeSelectorBaseOffset = 0;
12801278
auto reader = GetReader();
12811279
if (auto objCRelativeMethodsBaseAddr = GetObjCRelativeMethodBaseAddress(reader.get())) {
12821280
m_logger->LogDebug("RelativeMethodSelector Base: 0x%llx", objCRelativeMethodsBaseAddr);
1283-
1284-
auto type = TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false)))
1285-
.SetPointerBase(RelativeToConstantPointerBaseType, objCRelativeMethodsBaseAddr)
1286-
.Finalize();
1287-
auto relativeSelectorPtrName = defineTypedef(m_data, {"relative_SEL"}, type);
1288-
relativeSelectorPtr = Type::NamedType(m_data, relativeSelectorPtrName);
1281+
relativeSelectorBaseType = RelativeToConstantPointerBaseType;
1282+
relativeSelectorBaseOffset = objCRelativeMethodsBaseAddr;
12891283
}
12901284

1285+
auto relativeSelectorPtrName = defineTypedef(m_data, {"rel_SEL"},
1286+
TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false)))
1287+
.SetPointerBase(relativeSelectorBaseType, relativeSelectorBaseOffset)
1288+
.Finalize());
1289+
auto relativeCharPtrName = defineTypedef(m_data, {"rel_cstr"},
1290+
TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false)))
1291+
.SetPointerBase(RelativeToVariableAddressPointerBaseType, 0)
1292+
.Finalize());
1293+
auto relativeIMPPtrName = defineTypedef(m_data, {"rel_IMP"},
1294+
TypeBuilder::PointerType(4, Type::VoidType())
1295+
.SetPointerBase(RelativeToVariableAddressPointerBaseType, 0)
1296+
.Finalize());
1297+
12911298
// https://github.com/apple-oss-distributions/objc4/blob/196363c165b175ed925ef6b9b99f558717923c47/runtime/objc-abi.h
12921299
EnumerationBuilder imageInfoFlagBuilder;
12931300
imageInfoFlagBuilder.AddMemberWithValue("IsReplacement", 1 << 0);
@@ -1323,9 +1330,9 @@ void ObjCProcessor::ProcessObjCData()
13231330
m_typeNames.imageInfo = imageInfoType.first;
13241331

13251332
StructureBuilder methodEntry;
1326-
methodEntry.AddMember(relativeSelectorPtr ? relativeSelectorPtr : rptr_t, "name");
1327-
methodEntry.AddMember(rptr_t, "types");
1328-
methodEntry.AddMember(rptr_t, "imp");
1333+
methodEntry.AddMember(Type::NamedType(m_data, relativeSelectorPtrName), "name");
1334+
methodEntry.AddMember(Type::NamedType(m_data, relativeCharPtrName), "types");
1335+
methodEntry.AddMember(Type::NamedType(m_data, relativeIMPPtrName), "imp");
13291336
auto type = finalizeStructureBuilder(m_data, methodEntry, "objc_method_entry_t");
13301337
m_typeNames.methodEntry = type.first;
13311338

objectivec/objc.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ namespace BinaryNinja {
252252

253253
class ObjCProcessor {
254254
struct Types {
255-
QualifiedName relativePtr;
256255
QualifiedName id;
257256
QualifiedName sel;
258257
QualifiedName BOOL;

0 commit comments

Comments
 (0)