Skip to content

Commit 9aa5359

Browse files
committed
[ObjC] Fix handling of relative method selectors with MSVC
The order that the operands to `+` are evaluated in is unspecified. Clang happens to evaluate them left to right and gives the expected answer. MSVC picks the opposite order and so the value it computes is off by 4. This was resulting in missing method names when arm64 binaries containing Objective-C are analyzed on Windows.
1 parent 402cf08 commit 9aa5359

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

objectivec/objc.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -838,9 +838,14 @@ void ObjCProcessor::LoadProtocols(ObjCReader* reader, Ref<Section> listSection)
838838

839839
void ObjCProcessor::GetRelativeMethod(ObjCReader* reader, method_t& meth)
840840
{
841-
meth.name = reader->GetOffset() + reader->ReadS32();
842-
meth.types = reader->GetOffset() + reader->ReadS32();
843-
meth.imp = reader->GetOffset() + reader->ReadS32();
841+
uint64_t offset = reader->GetOffset();
842+
meth.name = offset + reader->ReadS32();
843+
844+
offset += sizeof(int32_t);
845+
meth.types = offset + reader->ReadS32();
846+
847+
offset += sizeof(int32_t);
848+
meth.imp = offset + reader->ReadS32();
844849
}
845850

846851
void ObjCProcessor::ReadListOfMethodLists(ObjCReader* reader, ClassBase& cls, std::string_view name, view_ptr_t start)

view/sharedcache/core/ObjC.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,12 @@ void SharedCacheObjCProcessor::GetRelativeMethod(ObjCReader* reader, method_t& m
9797
if (m_customRelativeMethodSelectorBase.has_value())
9898
{
9999
meth.name = m_customRelativeMethodSelectorBase.value() + reader->ReadS32();
100-
meth.types = reader->GetOffset() + reader->ReadS32();
101-
meth.imp = reader->GetOffset() + reader->ReadS32();
100+
101+
uint64_t offset = reader->GetOffset();
102+
meth.types = offset + reader->ReadS32();
103+
104+
offset += sizeof(int32_t);
105+
meth.imp = offset + reader->ReadS32();
102106
}
103107
else
104108
{

0 commit comments

Comments
 (0)