Skip to content

Commit bf8db99

Browse files
authored
Merge pull request #7 from p-x9/feature/absolute-vmaddr-to-file-offset
Convert raw vmaddr to file offset correctly
2 parents e0c0c20 + 446cbf3 commit bf8db99

15 files changed

+160
-77
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ let package = Package(
1717
)
1818
],
1919
dependencies: [
20-
.package(url: "https://github.com/p-x9/MachOKit.git", from: "0.27.0"),
20+
.package(url: "https://github.com/p-x9/MachOKit.git", from: "0.30.0"),
2121
.package(url: "https://github.com/p-x9/swift-objc-dump.git", from: "0.7.0")
2222
],
2323
targets: [

Sources/MachOObjCSection/MachOFile+ObjectiveC.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ extension MachOFile.ObjectiveC {
279279
)
280280

281281
return offsets
282-
.map { UInt64($0) & 0x7ffffffff }
282+
.map { machO.fileOffset(of: numericCast($0)) }
283283
.compactMap {
284284
if let cache = machO.cache {
285285
let resolved = cache.fileOffset(of: $0 + cache.mainCacheHeader.sharedRegionStart) ?? $0
@@ -318,7 +318,7 @@ extension MachOFile.ObjectiveC {
318318
)
319319

320320
return offsets
321-
.map { UInt64($0) & 0x7ffffffff }
321+
.map { machO.fileOffset(of: numericCast($0)) }
322322
.compactMap {
323323
if let cache = machO.cache {
324324
let resolved = cache.fileOffset(of: $0 + cache.mainCacheHeader.sharedRegionStart) ?? $0
@@ -353,7 +353,7 @@ extension MachOFile.ObjectiveC {
353353
)
354354

355355
return offsets
356-
.map { UInt64($0) & 0x7ffffffff }
356+
.map { machO.fileOffset(of: numericCast($0)) }
357357
.compactMap {
358358
if let cache = machO.cache {
359359
let resolved = cache.fileOffset(of: $0 + cache.mainCacheHeader.sharedRegionStart) ?? $0

Sources/MachOObjCSection/Model/Class/ObjCClass32.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,7 @@ extension ObjCClass32 {
8080
public func classRWData(in machO: MachOImage) -> ClassRWData? {
8181
if !hasRWPointer(in: machO) { return nil }
8282

83-
let FAST_DATA_MASK: UInt
84-
if machO.isPhysicalIPhone && !machO.isSimulatorIPhone {
85-
FAST_DATA_MASK = numericCast(FAST_DATA_MASK_64_IPHONE)
86-
} else {
87-
FAST_DATA_MASK = numericCast(FAST_DATA_MASK_64)
88-
}
83+
let FAST_DATA_MASK: UInt = FAST_DATA_MASK_32
8984

9085
let address: UInt = numericCast(layout.dataVMAddrAndFastFlags) & FAST_DATA_MASK
9186

@@ -144,7 +139,12 @@ extension ObjCClass32 {
144139
}
145140

146141
private func _classROData(in machO: MachOFile) -> ClassROData? {
147-
let offset: UInt64 = numericCast(layout.dataVMAddrAndFastFlags) & numericCast(FAST_DATA_MASK_32) + numericCast(machO.headerStartOffset)
142+
let FAST_DATA_MASK: UInt64 = numericCast(FAST_DATA_MASK_32)
143+
var offset: UInt64 = numericCast(layout.dataVMAddrAndFastFlags) & FAST_DATA_MASK + numericCast(machO.headerStartOffset)
144+
145+
if let resolved = resolveRebase(.dataVMAddrAndFastFlags, in: machO) {
146+
offset = machO.fileOffset(of: resolved & FAST_DATA_MASK) + numericCast(machO.headerStartOffset)
147+
}
148148

149149
var resolved = offset
150150
if let cache = machO.cache {
@@ -155,7 +155,10 @@ extension ObjCClass32 {
155155
}
156156

157157
let layout: ClassROData.Layout = machO.fileHandle.read(offset: resolved)
158-
let classData = ClassROData(layout: layout, offset: Int(offset))
158+
let classData = ClassROData(
159+
layout: layout,
160+
offset: Int(offset) - machO.headerStartOffset
161+
)
159162

160163
return classData
161164
}

Sources/MachOObjCSection/Model/Class/ObjCClass64.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,11 @@ extension ObjCClass64 {
161161
}
162162

163163
var offset: UInt64 = numericCast(layout.dataVMAddrAndFastFlags) & FAST_DATA_MASK + numericCast(machO.headerStartOffset)
164-
offset &= 0x7ffffffff
164+
offset = machO.fileOffset(of: offset)
165+
166+
if let resolved = resolveRebase(.dataVMAddrAndFastFlags, in: machO) {
167+
offset = machO.fileOffset(of: resolved & FAST_DATA_MASK) + numericCast(machO.headerStartOffset)
168+
}
165169

166170
var resolved = offset
167171
if let cache = machO.cache {
@@ -171,7 +175,10 @@ extension ObjCClass64 {
171175
resolved = _offset
172176
}
173177
let layout: ClassROData.Layout = machO.fileHandle.read(offset: resolved)
174-
let classData = ClassROData(layout: layout, offset: Int(offset))
178+
let classData = ClassROData(
179+
layout: layout,
180+
offset: Int(offset) - machO.headerStartOffset
181+
)
175182

176183
return classData
177184
}

Sources/MachOObjCSection/Model/Method/ObjCMethodList.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,9 @@ extension ObjCMethodList {
156156
)
157157
return sequence
158158
.map {
159-
var name = UInt64($0.name) & 0x7ffffffff
160-
var types = UInt64($0.types) & 0x7ffffffff
161-
let imp = UInt64($0.imp) & 0x7ffffffff
159+
var name = machO.fileOffset(of: numericCast($0.name))
160+
var types = machO.fileOffset(of: numericCast($0.types))
161+
let imp = machO.fileOffset(of: numericCast($0.imp))
162162

163163
var nameFileHandle = machO.fileHandle
164164
var typesFileHandle = machO.fileHandle
@@ -237,9 +237,11 @@ extension ObjCMethodList {
237237
return sequence.enumerated()
238238
.map {
239239
let offset = numericCast(offset) + $0 * size
240-
let name: UInt64 = machO.fileHandle.read(
241-
offset: numericCast(offset) + numericCast($1.name.offset)
242-
) & 0x7ffffffff
240+
let name: UInt64 = machO.fileOffset(
241+
of: machO.fileHandle.read(
242+
offset: numericCast(offset) + numericCast($1.name.offset)
243+
)
244+
)
243245
let types: Int64 = numericCast(offset) + numericCast($1.types.offset) + 4
244246
let imp: UInt64 = numericCast(offset + numericCast($1.imp.offset)) + 8
245247

Sources/MachOObjCSection/Model/Property/ObjCPropertyList.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ extension ObjCPropertyList {
9494
)
9595
return sequence
9696
.compactMap {
97-
var name = UInt64($0.name) & 0x7ffffffff
98-
var attributes = UInt64($0.attributes) & 0x7ffffffff
97+
var name = machO.fileOffset(of: numericCast($0.name))
98+
var attributes = machO.fileOffset(of: numericCast($0.attributes))
9999

100100
var nameFileHandle = machO.fileHandle
101101
var attributesFileHandle = machO.fileHandle

Sources/MachOObjCSection/Model/Protocol/ObjCProtocolList32.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@ extension ObjCProtocolList32 {
7676
offset: numericCast(resolvedOffset),
7777
swapHandler: { _ in }
7878
)
79-
return .init(layout: layout, offset: numericCast(offset))
79+
return .init(
80+
layout: layout,
81+
offset: numericCast(offset) - machO.headerStartOffset
82+
)
8083
}
8184
}
8285
}

Sources/MachOObjCSection/Model/Protocol/ObjCProtocolList64.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ extension ObjCProtocolList64 {
6060

6161
return sequnece
6262
.map {
63-
let offset = $0 & 0x7ffffffff + numericCast(headerStartOffset)
63+
let offset = machO.fileOffset(of: $0) + numericCast(headerStartOffset)
6464
var resolvedOffset = offset
6565

6666
var fileHandle = machO.fileHandle
@@ -76,7 +76,10 @@ extension ObjCProtocolList64 {
7676
offset: numericCast(resolvedOffset),
7777
swapHandler: { _ in }
7878
)
79-
return .init(layout: layout, offset: numericCast(offset))
79+
return .init(
80+
layout: layout,
81+
offset: numericCast(offset) - machO.headerStartOffset
82+
)
8083
}
8184
}
8285
}

Sources/MachOObjCSection/Protocol/Category/ObjCCategoryProtocol.swift

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ public protocol ObjCCategoryProtocol: _FixupResolvable where LayoutField == ObjC
4646

4747
extension ObjCCategoryProtocol {
4848
public func name(in machO: MachOFile) -> String? {
49-
var offset: UInt64 = numericCast(layout.name) & 0x7ffffffff + numericCast(machO.headerStartOffset)
49+
var offset: UInt64 = machO.fileOffset(
50+
of: numericCast(layout.name)
51+
) + numericCast(machO.headerStartOffset)
5052
if let cache = machO.cache {
5153
guard let _offset = cache.fileOffset(of: offset + cache.mainCacheHeader.sharedRegionStart) else {
5254
return nil
@@ -266,10 +268,12 @@ extension ObjCCategoryProtocol {
266268
in machO: MachOFile
267269
) -> ObjCClass? {
268270
guard offset > 0 else { return nil }
269-
var offset: UInt64 = numericCast(offset) & 0x7ffffffff + numericCast(machO.headerStartOffset)
271+
var offset: UInt64 = machO.fileOffset(
272+
of: numericCast(offset)
273+
) + numericCast(machO.headerStartOffset)
270274

271275
if let resolved = resolveRebase(field, in: machO) {
272-
offset = resolved & 0x7ffffffff + numericCast(machO.headerStartOffset)
276+
offset = machO.fileOffset(of: resolved) + numericCast(machO.headerStartOffset)
273277
}
274278
if isBind(field, in: machO) { return nil }
275279

@@ -282,7 +286,10 @@ extension ObjCCategoryProtocol {
282286
}
283287

284288
let layout: ObjCClass.Layout = machO.fileHandle.read(offset: resolvedOffset)
285-
return .init(layout: layout, offset: numericCast(offset))
289+
return .init(
290+
layout: layout,
291+
offset: numericCast(offset) - machO.headerStartOffset
292+
)
286293
}
287294

288295
func _readStubClass(
@@ -291,10 +298,13 @@ extension ObjCCategoryProtocol {
291298
in machO: MachOFile
292299
) -> ObjCStubClass? {
293300
guard offset > 0 else { return nil }
294-
var offset: UInt64 = numericCast(offset) & 0x7ffffffff + numericCast(machO.headerStartOffset)
301+
var offset: UInt64 = machO.fileOffset(
302+
of: numericCast(offset)
303+
) + numericCast(machO.headerStartOffset)
304+
295305

296306
if let resolved = resolveRebase(field, in: machO) {
297-
offset = resolved & 0x7ffffffff + numericCast(machO.headerStartOffset)
307+
offset = machO.fileOffset(of: resolved) + numericCast(machO.headerStartOffset)
298308
}
299309
if isBind(field, in: machO) { return nil }
300310

@@ -307,7 +317,10 @@ extension ObjCCategoryProtocol {
307317
}
308318

309319
let layout: ObjCStubClass.Layout = machO.fileHandle.read(offset: resolvedOffset)
310-
return .init(layout: layout, offset: numericCast(offset))
320+
return .init(
321+
layout: layout,
322+
offset: numericCast(offset) - machO.headerStartOffset
323+
)
311324
}
312325

313326
private func _readClassName(
@@ -342,11 +355,13 @@ extension ObjCCategoryProtocol {
342355
guard offset > 0 else { return nil }
343356
guard offset & 1 == 0 else { return nil }
344357

345-
var offset: UInt64 = numericCast(offset) & 0x7ffffffff + numericCast(machO.headerStartOffset)
358+
var offset: UInt64 = machO.fileOffset(
359+
of: numericCast(offset)
360+
) + numericCast(machO.headerStartOffset)
346361

347362
if let resolved = resolveRebase(field, in: machO),
348363
resolved != offset {
349-
offset = resolved & 0x7ffffffff + numericCast(machO.headerStartOffset)
364+
offset = machO.fileOffset(of: resolved) + numericCast(machO.headerStartOffset)
350365
}
351366
// if isBind(\.baseMethods, in: machO) { return nil }
352367

@@ -385,11 +400,13 @@ extension ObjCCategoryProtocol {
385400
guard offset > 0 else { return nil }
386401
guard offset & 1 == 0 else { return nil }
387402

388-
var offset: UInt64 = numericCast(offset) & 0x7ffffffff + numericCast(machO.headerStartOffset)
403+
var offset: UInt64 = machO.fileOffset(
404+
of: numericCast(offset)
405+
) + numericCast(machO.headerStartOffset)
389406

390407
if let resolved = resolveRebase(field, in: machO),
391408
resolved != offset {
392-
offset = resolved & 0x7ffffffff + numericCast(machO.headerStartOffset)
409+
offset = machO.fileOffset(of: resolved) + numericCast(machO.headerStartOffset)
393410
}
394411
// if isBind(\.baseProperties, in: machO) { return nil }
395412

@@ -430,11 +447,13 @@ extension ObjCCategoryProtocol {
430447
guard offset > 0 else { return nil }
431448
guard offset & 1 == 0 else { return nil }
432449

433-
var offset: UInt64 = numericCast(offset) & 0x7ffffffff + numericCast(machO.headerStartOffset)
450+
var offset: UInt64 = machO.fileOffset(
451+
of: numericCast(offset)
452+
) + numericCast(machO.headerStartOffset)
434453

435454
if let resolved = resolveRebase(field, in: machO),
436455
resolved != offset {
437-
offset = resolved & 0x7ffffffff + numericCast(machO.headerStartOffset)
456+
offset = machO.fileOffset(of: resolved) + numericCast(machO.headerStartOffset)
438457
}
439458
// if isBind(\.baseProtocols, in: machO) { return nil }
440459

0 commit comments

Comments
 (0)