Skip to content

Commit d024ba1

Browse files
committed
Fix MachOFile.DyldChainedFixups to use FileIO
1 parent 7b3f8cb commit d024ba1

File tree

2 files changed

+92
-116
lines changed

2 files changed

+92
-116
lines changed

Sources/MachOKit/MachOFile+DyldChainedFixups.swift

Lines changed: 88 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -7,54 +7,47 @@
77
//
88

99
import Foundation
10+
import FileIO
1011
import MachOKitC
1112

1213
extension MachOFile {
1314
public struct DyldChainedFixups {
14-
let data: Data
15+
typealias FileSlice = File.FileSlice
16+
17+
let fileSice: FileSlice
1518
let isSwapped: Bool
1619
}
1720
}
1821

1922
extension MachOFile.DyldChainedFixups: DyldChainedFixupsProtocol {
2023
public var header: DyldChainedFixupsHeader? {
21-
data.withUnsafeBytes {
22-
guard let basePtr = $0.baseAddress else { return nil }
23-
let ptr = UnsafeRawPointer(basePtr)
24-
let ret = ptr
25-
.assumingMemoryBound(to: DyldChainedFixupsHeader.self)
26-
.pointee
27-
return isSwapped ? ret.swapped : ret
28-
}
24+
let ret = fileSice.ptr
25+
.assumingMemoryBound(to: DyldChainedFixupsHeader.self)
26+
.pointee
27+
return isSwapped ? ret.swapped : ret
2928
}
3029

3130
public var startsInImage: DyldChainedStartsInImage? {
3231
guard let header else { return nil }
33-
return data.withUnsafeBytes {
34-
guard let basePtr = $0.baseAddress else { return nil }
35-
let offset: Int = numericCast(header.starts_offset)
36-
let ptr = UnsafeRawPointer(basePtr)
37-
.advanced(by: offset)
38-
let layout = ptr
39-
.assumingMemoryBound(to: DyldChainedStartsInImage.Layout.self)
40-
.pointee
41-
let ret: DyldChainedStartsInImage = .init(
42-
layout: layout,
43-
offset: offset
44-
)
45-
return isSwapped ? ret.swapped : ret
46-
}
32+
let offset: Int = numericCast(header.starts_offset)
33+
let ptr = fileSice.ptr
34+
.advanced(by: offset)
35+
let layout = ptr
36+
.assumingMemoryBound(to: DyldChainedStartsInImage.Layout.self)
37+
.pointee
38+
let ret: DyldChainedStartsInImage = .init(
39+
layout: layout,
40+
offset: offset
41+
)
42+
return isSwapped ? ret.swapped : ret
4743
}
4844

4945
public func startsInSegments(
5046
of startsInImage: DyldChainedStartsInImage?
5147
) -> [DyldChainedStartsInSegment] {
52-
guard let startsInImage else {
53-
return []
54-
}
55-
let offsets: [Int] = data.withUnsafeBytes {
56-
guard let basePtr = $0.baseAddress else { return [] }
57-
let ptr = UnsafeRawPointer(basePtr)
48+
guard let startsInImage else { return [] }
49+
let offsets: [Int] = {
50+
let ptr = UnsafeRawPointer(fileSice.ptr)
5851
.advanced(by: startsInImage.offset)
5952
.advanced(by: DyldChainedStartsInImage.layoutOffset(of: \.seg_info_offset))
6053
return UnsafeBufferPointer(
@@ -63,109 +56,93 @@ extension MachOFile.DyldChainedFixups: DyldChainedFixupsProtocol {
6356
)
6457
.map { isSwapped ? $0.byteSwapped : $0 }
6558
.map { numericCast($0) }
66-
}
59+
}()
6760

68-
return data.withUnsafeBytes {
69-
guard let basePtr = $0.baseAddress else { return [] }
70-
let ptr = UnsafeRawPointer(basePtr)
71-
.advanced(by: startsInImage.offset)
72-
return offsets.enumerated().map { index, offset in
73-
let layout = ptr.advanced(by: offset)
74-
.assumingMemoryBound(to: DyldChainedStartsInSegment.Layout.self)
75-
.pointee
76-
let offset: Int = startsInImage.offset + offset
77-
let ret: DyldChainedStartsInSegment = .init(
78-
layout: layout,
79-
offset: offset,
80-
segmentIndex: index
81-
)
82-
return isSwapped ? ret.swapped : ret
83-
}
61+
let ptr = UnsafeRawPointer(fileSice.ptr)
62+
.advanced(by: startsInImage.offset)
63+
return offsets.enumerated().map { index, offset in
64+
let layout = ptr.advanced(by: offset)
65+
.assumingMemoryBound(to: DyldChainedStartsInSegment.Layout.self)
66+
.pointee
67+
let offset: Int = startsInImage.offset + offset
68+
let ret: DyldChainedStartsInSegment = .init(
69+
layout: layout,
70+
offset: offset,
71+
segmentIndex: index
72+
)
73+
return isSwapped ? ret.swapped : ret
8474
}
8575
}
8676

8777
// xcrun dyld_info -fixup_chains "Path to Binary"
8878
public func pages(
8979
of startsInSegment: DyldChainedStartsInSegment?
9080
) -> [DyldChainedPage] {
91-
guard let startsInSegment else {
92-
return []
93-
}
94-
95-
return data.withUnsafeBytes {
96-
guard let basePtr = $0.baseAddress else { return [] }
97-
let ptr = UnsafeRawPointer(basePtr)
98-
.advanced(by: startsInSegment.offset)
99-
.advanced(by: startsInSegment.layoutOffset(of: \.page_start))
100-
.assumingMemoryBound(to: UInt16.self)
101-
return UnsafeBufferPointer(
102-
start: ptr,
103-
count: numericCast(
104-
startsInSegment.page_count
105-
)
81+
guard let startsInSegment else { return [] }
82+
83+
let ptr = UnsafeRawPointer(fileSice.ptr)
84+
.advanced(by: startsInSegment.offset)
85+
.advanced(by: startsInSegment.layoutOffset(of: \.page_start))
86+
.assumingMemoryBound(to: UInt16.self)
87+
return UnsafeBufferPointer(
88+
start: ptr,
89+
count: numericCast(
90+
startsInSegment.page_count
10691
)
107-
.map {
108-
isSwapped ? $0.byteSwapped : $0
109-
}
110-
.enumerated().map { .init(offset: $1, index: $0) }
92+
)
93+
.map {
94+
isSwapped ? $0.byteSwapped : $0
11195
}
96+
.enumerated().map { .init(offset: $1, index: $0) }
11297
}
11398

11499
public var imports: [DyldChainedImport] {
115100
guard let header,
116101
let importsFormat = header.importsFormat else {
117102
return []
118103
}
119-
return data.withUnsafeBytes {
120-
guard let basePtr = $0.baseAddress else { return [] }
121-
let offset: Int = numericCast(header.imports_offset)
122-
let ptr = UnsafeRawPointer(basePtr)
123-
.advanced(by: offset)
124-
let count: Int = numericCast(header.imports_count)
125-
126-
switch importsFormat {
127-
case .general:
128-
return UnsafeBufferPointer(
129-
start: ptr
130-
.assumingMemoryBound(to: DyldChainedImportGeneral.self),
131-
count: count
132-
)
133-
.map { isSwapped ? $0.swapped : $0 }
134-
.map { .general($0) }
135-
136-
case .addend:
137-
return UnsafeBufferPointer(
138-
start: ptr
139-
.assumingMemoryBound(to: DyldChainedImportAddend.self),
140-
count: count
141-
)
142-
.map { isSwapped ? $0.swapped : $0 }
143-
.map { .addend($0) }
144-
145-
case .addend64:
146-
return UnsafeBufferPointer(
147-
start: ptr
148-
.assumingMemoryBound(to: DyldChainedImportAddend64.self),
149-
count: count
150-
)
151-
.map { isSwapped ? $0.swapped : $0 }
152-
.map { .addend64($0) }
153-
}
104+
let offset: Int = numericCast(header.imports_offset)
105+
let ptr = UnsafeRawPointer(fileSice.ptr)
106+
.advanced(by: offset)
107+
let count: Int = numericCast(header.imports_count)
108+
109+
switch importsFormat {
110+
case .general:
111+
return UnsafeBufferPointer(
112+
start: ptr
113+
.assumingMemoryBound(to: DyldChainedImportGeneral.self),
114+
count: count
115+
)
116+
.map { isSwapped ? $0.swapped : $0 }
117+
.map { .general($0) }
118+
119+
case .addend:
120+
return UnsafeBufferPointer(
121+
start: ptr
122+
.assumingMemoryBound(to: DyldChainedImportAddend.self),
123+
count: count
124+
)
125+
.map { isSwapped ? $0.swapped : $0 }
126+
.map { .addend($0) }
127+
128+
case .addend64:
129+
return UnsafeBufferPointer(
130+
start: ptr
131+
.assumingMemoryBound(to: DyldChainedImportAddend64.self),
132+
count: count
133+
)
134+
.map { isSwapped ? $0.swapped : $0 }
135+
.map { .addend64($0) }
154136
}
155137
}
156138

157139
public func symbolName(for nameOffset: Int) -> String? {
158-
guard let header else {
159-
return nil
160-
}
161-
return data.withUnsafeBytes {
162-
guard let basePtr = $0.baseAddress else { return nil }
163-
let ptr = basePtr
164-
.advanced(by: numericCast(header.symbols_offset))
165-
.advanced(by: nameOffset)
166-
.assumingMemoryBound(to: CChar.self)
167-
return String(cString: ptr)
168-
}
140+
guard let header else { return nil }
141+
let ptr = fileSice.ptr
142+
.advanced(by: numericCast(header.symbols_offset))
143+
.advanced(by: nameOffset)
144+
.assumingMemoryBound(to: CChar.self)
145+
return String(cString: ptr)
169146
}
170147
}
171148

Sources/MachOKit/MachOFile.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -435,13 +435,12 @@ extension MachOFile {
435435
guard let info = loadCommands.dyldChainedFixups else {
436436
return nil
437437
}
438-
let data = fileHandle.readData(
439-
offset: UInt64(headerStartOffset) + numericCast(info.dataoff),
440-
size: numericCast(info.datasize)
441-
)
442438

443439
return .init(
444-
data: data,
440+
fileSice: try! fileHandle.fileSlice(
441+
offset: headerStartOffset + numericCast(info.dataoff),
442+
length: numericCast(info.datasize)
443+
),
445444
isSwapped: isSwapped
446445
)
447446
}

0 commit comments

Comments
 (0)