Skip to content

Commit dc00334

Browse files
authored
Diagnostic changes to R2R for issues #106675 and #108255 (#118370)
Add diagnostic output when failing to read a R2R header or getting a bad image exception in parts of R2RDump initialization
1 parent ca9b916 commit dc00334

File tree

2 files changed

+119
-32
lines changed

2 files changed

+119
-32
lines changed

src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/PEReaderExtensions.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ namespace ILCompiler.Reflection.ReadyToRun
1616
{
1717
public class PEExportTable
1818
{
19+
public readonly bool HasExportTable;
20+
public readonly int ExportTableHeaderLength;
21+
1922
private readonly Dictionary<string, int> _namedExportRva;
2023
private readonly Dictionary<int, int> _ordinalRva;
2124

@@ -28,13 +31,17 @@ private PEExportTable(PEReader peReader)
2831
if ((exportTable.Size == 0) || (exportTable.RelativeVirtualAddress == 0))
2932
return;
3033

34+
HasExportTable = true;
35+
3136
PEMemoryBlock peImage = peReader.GetEntireImage();
3237
BlobReader exportTableHeader = peImage.GetReader(peReader.GetOffset(exportTable.RelativeVirtualAddress), exportTable.Size);
3338
if (exportTableHeader.Length == 0)
3439
{
3540
return;
3641
}
3742

43+
ExportTableHeaderLength = exportTableHeader.Length;
44+
3845
// +0x00: reserved
3946
exportTableHeader.ReadUInt32();
4047
// +0x04: TODO: time/date stamp
@@ -89,6 +96,10 @@ private PEExportTable(PEReader peReader)
8996
}
9097
_namedExportRva.Add(nameBuilder.ToString(), addressTable[ordinalTable[entryIndex]]);
9198
}
99+
else
100+
{
101+
Console.Error.WriteLine($"Found a zero RVA when reading name pointers for entry #{entryIndex}/{namePointerCount}");
102+
}
92103
}
93104
}
94105

@@ -97,6 +108,23 @@ public static PEExportTable Parse(PEReader peReader)
97108
return new PEExportTable(peReader);
98109
}
99110

111+
public void DumpToConsoleError()
112+
{
113+
Console.Error.WriteLine($"HasExportTable: {HasExportTable}");
114+
Console.Error.WriteLine($"ExportTableHeaderLength: {ExportTableHeaderLength}");
115+
Console.Error.WriteLine($"_namedExportRva: {_namedExportRva.Count} item(s)");
116+
int i = 0;
117+
foreach (var kvp in _namedExportRva)
118+
{
119+
Console.Error.WriteLine($" '{kvp.Key}': {kvp.Value}");
120+
if (i++ > 64)
121+
{
122+
Console.Error.WriteLine(" ... stopped dumping named exports because there are too many.");
123+
break;
124+
}
125+
}
126+
}
127+
100128
public bool TryGetValue(string exportName, out int rva) => _namedExportRva.TryGetValue(exportName, out rva);
101129
public bool TryGetValue(int ordinal, out int rva) => _ordinalRva.TryGetValue(ordinal, out rva);
102130
}

src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs

Lines changed: 91 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -487,51 +487,97 @@ public PinningReference(object o)
487487
}
488488
private unsafe void Initialize(IAssemblyMetadata metadata)
489489
{
490-
_assemblyCache = new List<IAssemblyMetadata>();
491-
492-
if (CompositeReader == null)
490+
try
493491
{
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+
}
499542
}
500-
else
543+
catch (BadImageFormatException)
501544
{
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;
506548
}
549+
}
507550

508-
if (metadata == null && CompositeReader.HasMetadata)
551+
internal void DumpImageInformation()
552+
{
553+
try
509554
{
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)");
512558

513-
if (metadata != null)
514-
{
515-
if ((CompositeReader.PEHeaders.CorHeader.Flags & CorFlags.ILLibrary) == 0)
559+
if (CompositeReader.PEHeaders.PEHeader is PEHeader header)
516560
{
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}");
521565
}
522566
else
523-
{
524-
_assemblyCache.Add(metadata);
567+
Console.Error.WriteLine("No PEHeader");
525568

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}");
530570

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();
531577
}
532-
else if (!TryLocateNativeReadyToRunHeader())
578+
catch (Exception exc)
533579
{
534-
throw new BadImageFormatException($"ECMA metadata / RTR_HEADER not found in file '{Filename}'");
580+
Console.Error.WriteLine($"Unhandled exception while dumping image information: {exc}");
535581
}
536582
}
537583

@@ -1430,10 +1476,23 @@ private void FindOwnerCompositeExecutable()
14301476
}
14311477
}
14321478

1479+
private void EnsureImportSections()
1480+
{
1481+
try
1482+
{
1483+
EnsureImportSectionsImpl();
1484+
}
1485+
catch (BadImageFormatException)
1486+
{
1487+
DumpImageInformation();
1488+
throw;
1489+
}
1490+
}
1491+
14331492
/// <summary>
14341493
/// based on <a href="https://github.com/dotnet/coreclr/blob/master/src/zap/zapimport.cpp">ZapImportSectionsTable::Save</a>
14351494
/// </summary>
1436-
private void EnsureImportSections()
1495+
private void EnsureImportSectionsImpl()
14371496
{
14381497
if (_importSections != null)
14391498
{

0 commit comments

Comments
 (0)