1
1
use std:: marker:: PhantomData ;
2
+ use std:: sync:: Arc ;
2
3
3
4
use debugid:: DebugId ;
4
5
use macho_unwind_info:: UnwindInfo ;
@@ -15,6 +16,7 @@ use yoke_derive::Yokeable;
15
16
use crate :: binary_image:: BinaryImage ;
16
17
use crate :: binary_image:: BinaryImageInner ;
17
18
use crate :: debugid_util:: debug_id_for_object;
19
+ use crate :: dwarf:: Addr2lineContextData ;
18
20
use crate :: error:: Error ;
19
21
use crate :: shared:: {
20
22
FileAndPathHelper , FileContents , FileContentsWrapper , FileLocation , MultiArchDisambiguator ,
@@ -298,10 +300,35 @@ where
298
300
dylib_path : String ,
299
301
}
300
302
303
+ type FileContentsRange < ' data , T > = RangeReadRef < ' data , & ' data FileContentsWrapper < T > > ;
304
+
301
305
#[ derive( Yokeable ) ]
302
306
pub struct ObjectAndMachOData < ' data , T : FileContents + ' static > {
303
- pub object : File < ' data , RangeReadRef < ' data , & ' data FileContentsWrapper < T > > > ,
304
- pub macho_data : MachOData < ' data , RangeReadRef < ' data , & ' data FileContentsWrapper < T > > > ,
307
+ object : File < ' data , FileContentsRange < ' data , T > > ,
308
+ macho_data : MachOData < ' data , FileContentsRange < ' data , T > > ,
309
+ addr2line_context : Addr2lineContextData ,
310
+ }
311
+
312
+ impl < ' data , T : FileContents + ' static > ObjectAndMachOData < ' data , T > {
313
+ pub fn new (
314
+ object : File < ' data , FileContentsRange < ' data , T > > ,
315
+ macho_data : MachOData < ' data , FileContentsRange < ' data , T > > ,
316
+ ) -> Self {
317
+ Self {
318
+ object,
319
+ macho_data,
320
+ addr2line_context : Addr2lineContextData :: new ( ) ,
321
+ }
322
+ }
323
+
324
+ pub fn into_parts (
325
+ self ,
326
+ ) -> (
327
+ File < ' data , FileContentsRange < ' data , T > > ,
328
+ MachOData < ' data , FileContentsRange < ' data , T > > ,
329
+ ) {
330
+ ( self . object , self . macho_data )
331
+ }
305
332
}
306
333
307
334
trait MakeMachObject < T : FileContents + ' static > {
@@ -347,7 +374,7 @@ impl<T: FileContents + 'static> DyldCacheFileData<T> {
347
374
. image_data_and_offset ( )
348
375
. map_err ( Error :: MachOHeaderParseError ) ?;
349
376
let macho_data = MachOData :: new ( data, header_offset, object. is_64 ( ) ) ;
350
- Ok ( ObjectAndMachOData { object, macho_data } )
377
+ Ok ( ObjectAndMachOData :: new ( object, macho_data) )
351
378
}
352
379
}
353
380
@@ -373,13 +400,19 @@ impl<T: FileContents + 'static> FileDataAndObject<T> {
373
400
374
401
impl < T : FileContents + ' static > ObjectSymbolMapOuter < T > for FileDataAndObject < T > {
375
402
fn make_symbol_map_inner ( & self ) -> Result < ObjectSymbolMapInnerWrapper < ' _ , T > , Error > {
376
- let ObjectAndMachOData { object, macho_data } = self . 0 . get ( ) ;
403
+ let ObjectAndMachOData {
404
+ object,
405
+ macho_data,
406
+ addr2line_context,
407
+ } = self . 0 . get ( ) ;
377
408
let ( function_starts, function_ends) = compute_function_addresses_macho ( macho_data, object) ;
378
409
let debug_id = debug_id_for_object ( object)
379
410
. ok_or ( Error :: InvalidInputError ( "debug ID cannot be read" ) ) ?;
380
411
let symbol_map = ObjectSymbolMapInnerWrapper :: new (
381
412
object,
382
- None ,
413
+ addr2line_context
414
+ . make_context ( macho_data. data , object, None , None )
415
+ . ok ( ) ,
383
416
debug_id,
384
417
function_starts. as_deref ( ) ,
385
418
function_ends. as_deref ( ) ,
@@ -393,28 +426,32 @@ impl<T: FileContents + 'static> ObjectSymbolMapOuter<T> for FileDataAndObject<T>
393
426
pub fn get_symbol_map_for_macho < H : FileAndPathHelper > (
394
427
debug_file_location : H :: FL ,
395
428
file_contents : FileContentsWrapper < H :: F > ,
429
+ helper : Arc < H > ,
396
430
) -> Result < SymbolMap < H > , Error > {
397
431
let owner = FileDataAndObject :: new ( Box :: new ( MachSymbolMapData ( file_contents) ) ) ?;
398
432
let symbol_map = ObjectSymbolMap :: new ( owner) ?;
399
- Ok ( SymbolMap :: new_plain (
433
+ Ok ( SymbolMap :: new_with_external_file_support (
400
434
debug_file_location,
401
435
Box :: new ( symbol_map) ,
436
+ helper,
402
437
) )
403
438
}
404
439
405
440
pub fn get_symbol_map_for_fat_archive_member < H : FileAndPathHelper > (
406
441
debug_file_location : H :: FL ,
407
442
file_contents : FileContentsWrapper < H :: F > ,
408
443
member : FatArchiveMember ,
444
+ helper : Arc < H > ,
409
445
) -> Result < SymbolMap < H > , Error > {
410
446
let ( start_offset, range_size) = member. offset_and_size ;
411
447
let owner =
412
448
MachOFatArchiveMemberData :: new ( file_contents, start_offset, range_size, member. arch ) ;
413
449
let owner = FileDataAndObject :: new ( Box :: new ( owner) ) ?;
414
450
let symbol_map = ObjectSymbolMap :: new ( owner) ?;
415
- Ok ( SymbolMap :: new_plain (
451
+ Ok ( SymbolMap :: new_with_external_file_support (
416
452
debug_file_location,
417
453
Box :: new ( symbol_map) ,
454
+ helper,
418
455
) )
419
456
}
420
457
@@ -429,7 +466,7 @@ impl<T: FileContents + 'static> MakeMachObject<T> for MachSymbolMapData<T> {
429
466
let file_data = self . file_data ( ) ;
430
467
let object = File :: parse ( file_data) . map_err ( Error :: MachOHeaderParseError ) ?;
431
468
let macho_data = MachOData :: new ( file_data, 0 , object. is_64 ( ) ) ;
432
- Ok ( ObjectAndMachOData { object, macho_data } )
469
+ Ok ( ObjectAndMachOData :: new ( object, macho_data) )
433
470
}
434
471
}
435
472
@@ -473,7 +510,7 @@ impl<T: FileContents + 'static> MakeMachObject<T> for MachOFatArchiveMemberData<
473
510
fn make_dependent_object ( & self ) -> Result < ObjectAndMachOData < ' _ , T > , Error > {
474
511
let object = File :: parse ( self . file_data ( ) ) . map_err ( Error :: MachOHeaderParseError ) ?;
475
512
let macho_data = MachOData :: new ( self . file_data ( ) , 0 , object. is_64 ( ) ) ;
476
- Ok ( ObjectAndMachOData { object, macho_data } )
513
+ Ok ( ObjectAndMachOData :: new ( object, macho_data) )
477
514
}
478
515
}
479
516
0 commit comments