7
7
//
8
8
9
9
import Foundation
10
+ import FileIO
10
11
import MachOKitC
11
12
12
13
extension MachOFile {
13
14
public struct DyldChainedFixups {
14
- let data : Data
15
+ typealias FileSlice = File . FileSlice
16
+
17
+ let fileSice : FileSlice
15
18
let isSwapped : Bool
16
19
}
17
20
}
18
21
19
22
extension MachOFile . DyldChainedFixups : DyldChainedFixupsProtocol {
20
23
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
29
28
}
30
29
31
30
public var startsInImage : DyldChainedStartsInImage ? {
32
31
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
47
43
}
48
44
49
45
public func startsInSegments(
50
46
of startsInImage: DyldChainedStartsInImage ?
51
47
) -> [ 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)
58
51
. advanced ( by: startsInImage. offset)
59
52
. advanced ( by: DyldChainedStartsInImage . layoutOffset ( of: \. seg_info_offset) )
60
53
return UnsafeBufferPointer (
@@ -63,109 +56,93 @@ extension MachOFile.DyldChainedFixups: DyldChainedFixupsProtocol {
63
56
)
64
57
. map { isSwapped ? $0. byteSwapped : $0 }
65
58
. map { numericCast ( $0) }
66
- }
59
+ } ( )
67
60
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
84
74
}
85
75
}
86
76
87
77
// xcrun dyld_info -fixup_chains "Path to Binary"
88
78
public func pages(
89
79
of startsInSegment: DyldChainedStartsInSegment ?
90
80
) -> [ 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
106
91
)
107
- . map {
108
- isSwapped ? $0. byteSwapped : $0
109
- }
110
- . enumerated ( ) . map { . init( offset: $1, index: $0) }
92
+ )
93
+ . map {
94
+ isSwapped ? $0. byteSwapped : $0
111
95
}
96
+ . enumerated ( ) . map { . init( offset: $1, index: $0) }
112
97
}
113
98
114
99
public var imports : [ DyldChainedImport ] {
115
100
guard let header,
116
101
let importsFormat = header. importsFormat else {
117
102
return [ ]
118
103
}
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) }
154
136
}
155
137
}
156
138
157
139
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)
169
146
}
170
147
}
171
148
0 commit comments