@@ -20,7 +20,7 @@ impl Mapping {
20
20
// First up we need to load the unique UUID which is stored in the macho
21
21
// header of the file we're reading, specified at `path`.
22
22
let map = super :: mmap ( path) ?;
23
- let ( macho, data) = find_header ( Bytes ( & map) ) ?;
23
+ let ( macho, data) = find_header ( & map) ?;
24
24
let endian = macho. endian ( ) . ok ( ) ?;
25
25
let uuid = macho. uuid ( endian, data) . ok ( ) ??;
26
26
@@ -40,7 +40,7 @@ impl Mapping {
40
40
// file. This should have the symbol table for at least some
41
41
// symbolication purposes.
42
42
Mapping :: mk ( map, |data, stash| {
43
- let ( macho, data) = find_header ( Bytes ( data) ) ?;
43
+ let ( macho, data) = find_header ( data) ?;
44
44
let endian = macho. endian ( ) . ok ( ) ?;
45
45
let obj = Object :: parse ( macho, endian, data) ?;
46
46
Context :: new ( stash, obj)
@@ -73,7 +73,7 @@ impl Mapping {
73
73
let entry = entry. ok ( ) ?;
74
74
let map = super :: mmap ( & entry. path ( ) ) ?;
75
75
let candidate = Mapping :: mk ( map, |data, stash| {
76
- let ( macho, data) = find_header ( Bytes ( data) ) ?;
76
+ let ( macho, data) = find_header ( data) ?;
77
77
let endian = macho. endian ( ) . ok ( ) ?;
78
78
let entry_uuid = macho. uuid ( endian, data) . ok ( ) ??;
79
79
if entry_uuid != uuid {
@@ -91,7 +91,7 @@ impl Mapping {
91
91
}
92
92
}
93
93
94
- fn find_header ( mut data : Bytes < ' _ > ) -> Option < ( & ' _ Mach , Bytes < ' _ > ) > {
94
+ fn find_header ( mut data : & [ u8 ] ) -> Option < ( & ' _ Mach , & [ u8 ] ) > {
95
95
use object:: endian:: BigEndian ;
96
96
97
97
let desired_cpu = || {
@@ -108,16 +108,15 @@ fn find_header(mut data: Bytes<'_>) -> Option<(&'_ Mach, Bytes<'_>)> {
108
108
}
109
109
} ;
110
110
111
- match data
112
- . clone ( )
111
+ match Bytes ( data)
113
112
. read :: < object:: endian:: U32 < NativeEndian > > ( )
114
113
. ok ( ) ?
115
114
. get ( NativeEndian )
116
115
{
117
116
macho:: MH_MAGIC_64 | macho:: MH_CIGAM_64 | macho:: MH_MAGIC | macho:: MH_CIGAM => { }
118
117
119
118
macho:: FAT_MAGIC | macho:: FAT_CIGAM => {
120
- let mut header_data = data;
119
+ let mut header_data = Bytes ( data) ;
121
120
let endian = BigEndian ;
122
121
let header = header_data. read :: < macho:: FatHeader > ( ) . ok ( ) ?;
123
122
let nfat = header. nfat_arch . get ( endian) ;
@@ -126,13 +125,14 @@ fn find_header(mut data: Bytes<'_>) -> Option<(&'_ Mach, Bytes<'_>)> {
126
125
. find ( |arch| desired_cpu ( ) == Some ( arch. cputype . get ( endian) ) ) ?;
127
126
let offset = arch. offset . get ( endian) ;
128
127
let size = arch. size . get ( endian) ;
129
- data = data
128
+ data = Bytes ( data)
130
129
. read_bytes_at ( offset. try_into ( ) . ok ( ) ?, size. try_into ( ) . ok ( ) ?)
131
- . ok ( ) ?;
130
+ . ok ( ) ?
131
+ . 0 ;
132
132
}
133
133
134
134
macho:: FAT_MAGIC_64 | macho:: FAT_CIGAM_64 => {
135
- let mut header_data = data;
135
+ let mut header_data = Bytes ( data) ;
136
136
let endian = BigEndian ;
137
137
let header = header_data. read :: < macho:: FatHeader > ( ) . ok ( ) ?;
138
138
let nfat = header. nfat_arch . get ( endian) ;
@@ -141,9 +141,10 @@ fn find_header(mut data: Bytes<'_>) -> Option<(&'_ Mach, Bytes<'_>)> {
141
141
. find ( |arch| desired_cpu ( ) == Some ( arch. cputype . get ( endian) ) ) ?;
142
142
let offset = arch. offset . get ( endian) ;
143
143
let size = arch. size . get ( endian) ;
144
- data = data
144
+ data = Bytes ( data)
145
145
. read_bytes_at ( offset. try_into ( ) . ok ( ) ?, size. try_into ( ) . ok ( ) ?)
146
- . ok ( ) ?;
146
+ . ok ( ) ?
147
+ . 0 ;
147
148
}
148
149
149
150
_ => return None ,
@@ -155,7 +156,7 @@ fn find_header(mut data: Bytes<'_>) -> Option<(&'_ Mach, Bytes<'_>)> {
155
156
// This is used both for executables/libraries and source object files.
156
157
pub struct Object < ' a > {
157
158
endian : NativeEndian ,
158
- data : Bytes < ' a > ,
159
+ data : & ' a [ u8 ] ,
159
160
dwarf : Option < & ' a [ MachSection ] > ,
160
161
syms : Vec < ( & ' a [ u8 ] , u64 ) > ,
161
162
syms_sort_by_name : bool ,
@@ -166,7 +167,7 @@ pub struct Object<'a> {
166
167
}
167
168
168
169
impl < ' a > Object < ' a > {
169
- fn parse ( mach : & ' a Mach , endian : NativeEndian , data : Bytes < ' a > ) -> Option < Object < ' a > > {
170
+ fn parse ( mach : & ' a Mach , endian : NativeEndian , data : & ' a [ u8 ] ) -> Option < Object < ' a > > {
170
171
let is_object = mach. filetype ( endian) == object:: macho:: MH_OBJECT ;
171
172
let mut dwarf = None ;
172
173
let mut syms = Vec :: new ( ) ;
@@ -181,7 +182,7 @@ impl<'a> Object<'a> {
181
182
dwarf = segment. sections ( endian, section_data) . ok ( ) ;
182
183
}
183
184
} else if let Some ( symtab) = command. symtab ( ) . ok ( ) ? {
184
- let symbols = symtab. symbols :: < Mach > ( endian, data) . ok ( ) ?;
185
+ let symbols = symtab. symbols :: < Mach , _ > ( endian, data) . ok ( ) ?;
185
186
syms = symbols
186
187
. iter ( )
187
188
. filter_map ( |nlist : & MachNlist | {
@@ -230,7 +231,7 @@ impl<'a> Object<'a> {
230
231
&& & section_name[ 2 ..] == & name[ 1 ..]
231
232
}
232
233
} ) ?;
233
- Some ( section. data ( self . endian , self . data ) . ok ( ) ?. 0 )
234
+ Some ( section. data ( self . endian , self . data ) . ok ( ) ?)
234
235
}
235
236
236
237
pub fn search_symtab < ' b > ( & ' b self , addr : u64 ) -> Option < & ' b [ u8 ] > {
@@ -299,9 +300,9 @@ fn object_mapping(path: &[u8]) -> Option<Mapping> {
299
300
. members ( )
300
301
. filter_map ( Result :: ok)
301
302
. find ( |m| m. name ( ) == member_name) ?;
302
- Bytes ( member. data ( ) )
303
+ member. data ( data ) . ok ( ) ?
303
304
}
304
- None => Bytes ( data) ,
305
+ None => data,
305
306
} ;
306
307
let ( macho, data) = find_header ( data) ?;
307
308
let endian = macho. endian ( ) . ok ( ) ?;
0 commit comments