diff options
| author | Mark Rowe <mrowe@bdash.net.nz> | 2025-04-21 09:29:43 -0700 |
|---|---|---|
| committer | kat <kat@vector35.com> | 2025-05-28 09:01:15 -0400 |
| commit | cf9a634a5115d143e67616ea26df71adf7428840 (patch) | |
| tree | 0d7aa27968db27f3531afa6f6a621db03751e74b /objectivec | |
| parent | 6e4c00a80fa86bcfefba9630a1ea8e2a47bef2de (diff) | |
[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.
Diffstat (limited to 'objectivec')
| -rw-r--r-- | objectivec/objc.cpp | 33 | ||||
| -rw-r--r-- | objectivec/objc.h | 1 |
2 files changed, 20 insertions, 14 deletions
diff --git a/objectivec/objc.cpp b/objectivec/objc.cpp index 84abd142..46add246 100644 --- a/objectivec/objc.cpp +++ b/objectivec/objc.cpp @@ -1264,9 +1264,6 @@ void ObjCProcessor::ProcessObjCData() m_symbolQueue = new SymbolQueue(); auto addrSize = m_data->GetAddressSize(); - m_typeNames.relativePtr = defineTypedef(m_data, {"rptr_t"}, Type::IntegerType(4, true)); - auto rptr_t = Type::NamedType(m_data, m_typeNames.relativePtr); - m_typeNames.id = defineTypedef(m_data, {"id"}, Type::PointerType(addrSize, Type::VoidType())); m_typeNames.sel = defineTypedef(m_data, {"SEL"}, Type::PointerType(addrSize, Type::IntegerType(1, false))); @@ -1275,18 +1272,28 @@ void ObjCProcessor::ProcessObjCData() m_typeNames.nsuInteger = defineTypedef(m_data, {"NSUInteger"}, Type::IntegerType(addrSize, false)); m_typeNames.cgFloat = defineTypedef(m_data, {"CGFloat"}, Type::FloatType(addrSize)); - Ref<Type> relativeSelectorPtr; + BNPointerBaseType relativeSelectorBaseType = RelativeToVariableAddressPointerBaseType; + uint64_t relativeSelectorBaseOffset = 0; auto reader = GetReader(); if (auto objCRelativeMethodsBaseAddr = GetObjCRelativeMethodBaseAddress(reader.get())) { m_logger->LogDebug("RelativeMethodSelector Base: 0x%llx", objCRelativeMethodsBaseAddr); - - auto type = TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false))) - .SetPointerBase(RelativeToConstantPointerBaseType, objCRelativeMethodsBaseAddr) - .Finalize(); - auto relativeSelectorPtrName = defineTypedef(m_data, {"relative_SEL"}, type); - relativeSelectorPtr = Type::NamedType(m_data, relativeSelectorPtrName); + relativeSelectorBaseType = RelativeToConstantPointerBaseType; + relativeSelectorBaseOffset = objCRelativeMethodsBaseAddr; } + auto relativeSelectorPtrName = defineTypedef(m_data, {"rel_SEL"}, + TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false))) + .SetPointerBase(relativeSelectorBaseType, relativeSelectorBaseOffset) + .Finalize()); + auto relativeCharPtrName = defineTypedef(m_data, {"rel_cstr"}, + TypeBuilder::PointerType(4, Type::PointerType(addrSize, Type::IntegerType(1, false))) + .SetPointerBase(RelativeToVariableAddressPointerBaseType, 0) + .Finalize()); + auto relativeIMPPtrName = defineTypedef(m_data, {"rel_IMP"}, + TypeBuilder::PointerType(4, Type::VoidType()) + .SetPointerBase(RelativeToVariableAddressPointerBaseType, 0) + .Finalize()); + // https://github.com/apple-oss-distributions/objc4/blob/196363c165b175ed925ef6b9b99f558717923c47/runtime/objc-abi.h EnumerationBuilder imageInfoFlagBuilder; imageInfoFlagBuilder.AddMemberWithValue("IsReplacement", 1 << 0); @@ -1322,9 +1329,9 @@ void ObjCProcessor::ProcessObjCData() m_typeNames.imageInfo = imageInfoType.first; StructureBuilder methodEntry; - methodEntry.AddMember(relativeSelectorPtr ? relativeSelectorPtr : rptr_t, "name"); - methodEntry.AddMember(rptr_t, "types"); - methodEntry.AddMember(rptr_t, "imp"); + methodEntry.AddMember(Type::NamedType(m_data, relativeSelectorPtrName), "name"); + methodEntry.AddMember(Type::NamedType(m_data, relativeCharPtrName), "types"); + methodEntry.AddMember(Type::NamedType(m_data, relativeIMPPtrName), "imp"); auto type = finalizeStructureBuilder(m_data, methodEntry, "objc_method_entry_t"); m_typeNames.methodEntry = type.first; diff --git a/objectivec/objc.h b/objectivec/objc.h index dad86f08..01fb5e5a 100644 --- a/objectivec/objc.h +++ b/objectivec/objc.h @@ -252,7 +252,6 @@ namespace BinaryNinja { class ObjCProcessor { struct Types { - QualifiedName relativePtr; QualifiedName id; QualifiedName sel; QualifiedName BOOL; |
