@@ -487,51 +487,97 @@ public PinningReference(object o)
487
487
}
488
488
private unsafe void Initialize ( IAssemblyMetadata metadata )
489
489
{
490
- _assemblyCache = new List < IAssemblyMetadata > ( ) ;
491
-
492
- if ( CompositeReader == null )
490
+ try
493
491
{
494
- Image ??= File . ReadAllBytes ( Filename ) ;
495
- ImageReader = new NativeReader ( new MemoryStream ( Image ) ) ;
496
- byte [ ] image = Image ;
497
- ImagePin = new PinningReference ( image ) ;
498
- CompositeReader = new PEReader ( Unsafe . As < byte [ ] , ImmutableArray < byte > > ( ref image ) ) ;
492
+ _assemblyCache = new List < IAssemblyMetadata > ( ) ;
493
+
494
+ if ( CompositeReader == null )
495
+ {
496
+ Image ??= File . ReadAllBytes ( Filename ) ;
497
+ ImageReader = new NativeReader ( new MemoryStream ( Image ) ) ;
498
+ byte [ ] image = Image ;
499
+ ImagePin = new PinningReference ( image ) ;
500
+ CompositeReader = new PEReader ( Unsafe . As < byte [ ] , ImmutableArray < byte > > ( ref image ) ) ;
501
+ }
502
+ else
503
+ {
504
+ ImmutableArray < byte > content = CompositeReader . GetEntireImage ( ) . GetContent ( ) ;
505
+ Image = Unsafe . As < ImmutableArray < byte > , byte [ ] > ( ref content ) ;
506
+ ImageReader = new NativeReader ( new MemoryStream ( Image ) ) ;
507
+ ImagePin = new PinningReference ( Image ) ;
508
+ }
509
+
510
+ if ( metadata == null && CompositeReader . HasMetadata )
511
+ {
512
+ metadata = new StandaloneAssemblyMetadata ( CompositeReader ) ;
513
+ }
514
+
515
+ if ( metadata != null )
516
+ {
517
+ if ( ( CompositeReader . PEHeaders . CorHeader . Flags & CorFlags . ILLibrary ) == 0 )
518
+ {
519
+ if ( ! TryLocateNativeReadyToRunHeader ( ) )
520
+ {
521
+ DumpImageInformation ( ) ;
522
+
523
+ throw new BadImageFormatException ( "The file is not a ReadyToRun image" ) ;
524
+ }
525
+
526
+ Debug . Assert ( Composite ) ;
527
+ }
528
+ else
529
+ {
530
+ _assemblyCache . Add ( metadata ) ;
531
+
532
+ DirectoryEntry r2rHeaderDirectory = CompositeReader . PEHeaders . CorHeader . ManagedNativeHeaderDirectory ;
533
+ _readyToRunHeaderRVA = r2rHeaderDirectory . RelativeVirtualAddress ;
534
+ Debug . Assert ( ! Composite ) ;
535
+ }
536
+
537
+ }
538
+ else if ( ! TryLocateNativeReadyToRunHeader ( ) )
539
+ {
540
+ throw new BadImageFormatException ( $ "ECMA metadata / RTR_HEADER not found in file '{ Filename } '") ;
541
+ }
499
542
}
500
- else
543
+ catch ( BadImageFormatException )
501
544
{
502
- ImmutableArray < byte > content = CompositeReader . GetEntireImage ( ) . GetContent ( ) ;
503
- Image = Unsafe . As < ImmutableArray < byte > , byte [ ] > ( ref content ) ;
504
- ImageReader = new NativeReader ( new MemoryStream ( Image ) ) ;
505
- ImagePin = new PinningReference ( Image ) ;
545
+ if ( CompositeReader != null )
546
+ DumpImageInformation ( ) ;
547
+ throw ;
506
548
}
549
+ }
507
550
508
- if ( metadata == null && CompositeReader . HasMetadata )
551
+ internal void DumpImageInformation ( )
552
+ {
553
+ try
509
554
{
510
- metadata = new StandaloneAssemblyMetadata ( CompositeReader ) ;
511
- }
555
+ Console . Error . WriteLine ( $ "Image file '{ Filename } ' information:") ;
556
+ Console . Error . WriteLine ( $ "Size: { Image . Length } byte(s)") ;
557
+ Console . Error . WriteLine ( $ "MetadataSize: { CompositeReader . PEHeaders . MetadataSize } byte(s)") ;
512
558
513
- if ( metadata != null )
514
- {
515
- if ( ( CompositeReader . PEHeaders . CorHeader . Flags & CorFlags . ILLibrary ) == 0 )
559
+ if ( CompositeReader . PEHeaders . PEHeader is PEHeader header )
516
560
{
517
- if ( ! TryLocateNativeReadyToRunHeader ( ) )
518
- throw new BadImageFormatException ( "The file is not a ReadyToRun image ") ;
519
-
520
- Debug . Assert ( Composite ) ;
561
+ Console . Error . WriteLine ( $ "SizeOfImage: { header . SizeOfImage } byte(s)" ) ;
562
+ Console . Error . WriteLine ( $ "ImageBase: 0x { header . ImageBase : X } ") ;
563
+ Console . Error . WriteLine ( $ "FileAlignment: 0x { header . FileAlignment : X } " ) ;
564
+ Console . Error . WriteLine ( $ "SectionAlignment: 0x { header . SectionAlignment : X } " ) ;
521
565
}
522
566
else
523
- {
524
- _assemblyCache . Add ( metadata ) ;
567
+ Console . Error . WriteLine ( "No PEHeader" ) ;
525
568
526
- DirectoryEntry r2rHeaderDirectory = CompositeReader . PEHeaders . CorHeader . ManagedNativeHeaderDirectory ;
527
- _readyToRunHeaderRVA = r2rHeaderDirectory . RelativeVirtualAddress ;
528
- Debug . Assert ( ! Composite ) ;
529
- }
569
+ Console . Error . WriteLine ( $ "CorHeader.Flags: { CompositeReader . PEHeaders . CorHeader ? . Flags } ") ;
530
570
571
+ Console . Error . WriteLine ( "Sections:" ) ;
572
+ foreach ( var section in CompositeReader . PEHeaders . SectionHeaders )
573
+ Console . Error . WriteLine ( $ " { section . Name } { section . VirtualAddress } - { ( section . VirtualAddress + section . VirtualSize ) } ") ;
574
+
575
+ var exportTable = CompositeReader . GetExportTable ( ) ;
576
+ exportTable . DumpToConsoleError ( ) ;
531
577
}
532
- else if ( ! TryLocateNativeReadyToRunHeader ( ) )
578
+ catch ( Exception exc )
533
579
{
534
- throw new BadImageFormatException ( $ "ECMA metadata / RTR_HEADER not found in file ' { Filename } ' ") ;
580
+ Console . Error . WriteLine ( $ "Unhandled exception while dumping image information: { exc } ") ;
535
581
}
536
582
}
537
583
@@ -1430,10 +1476,23 @@ private void FindOwnerCompositeExecutable()
1430
1476
}
1431
1477
}
1432
1478
1479
+ private void EnsureImportSections ( )
1480
+ {
1481
+ try
1482
+ {
1483
+ EnsureImportSectionsImpl ( ) ;
1484
+ }
1485
+ catch ( BadImageFormatException )
1486
+ {
1487
+ DumpImageInformation ( ) ;
1488
+ throw ;
1489
+ }
1490
+ }
1491
+
1433
1492
/// <summary>
1434
1493
/// based on <a href="https://github.com/dotnet/coreclr/blob/master/src/zap/zapimport.cpp">ZapImportSectionsTable::Save</a>
1435
1494
/// </summary>
1436
- private void EnsureImportSections ( )
1495
+ private void EnsureImportSectionsImpl ( )
1437
1496
{
1438
1497
if ( _importSections != null )
1439
1498
{
0 commit comments