Skip to content

Commit de51156

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 1431470 commit de51156

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
@@ -1264,9 +1264,6 @@ void ObjCProcessor::ProcessObjCData()
12641264
m_symbolQueue = new SymbolQueue();
12651265
auto addrSize = m_data->GetAddressSize();
12661266

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

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

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

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

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

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)