Browse Source

Use ".data cil" if data is in text section.

pull/1556/head
Daniel Grunwald 6 years ago
parent
commit
ef035e6e02
  1. 2
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  2. 38
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

2
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -1373,7 +1373,7 @@ namespace ICSharpCode.Decompiler.CSharp
} }
var fieldDefinition = metadata.GetFieldDefinition((FieldDefinitionHandle)field.MetadataToken); var fieldDefinition = metadata.GetFieldDefinition((FieldDefinitionHandle)field.MetadataToken);
if (fieldDefinition.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA)) { if (fieldDefinition.HasFlag(System.Reflection.FieldAttributes.HasFieldRVA)) {
// Field data as specified in II.16.3.2 of ECMA-335 6th edition: // Field data as specified in II.16.3.1 of ECMA-335 6th edition:
// .data I_X = int32(123) // .data I_X = int32(123)
// .field public static int32 _x at I_X // .field public static int32 _x at I_X
string message; string message;

38
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1128,17 +1128,33 @@ namespace ICSharpCode.Decompiler.Disassembler
output.MarkFoldEnd(); output.MarkFoldEnd();
} }
if (fieldDefinition.HasFlag(FieldAttributes.HasFieldRVA)) { if (fieldDefinition.HasFlag(FieldAttributes.HasFieldRVA)) {
BlobReader initVal; // Field data as specified in II.16.3.1 of ECMA-335 6th edition
try { int rva = fieldDefinition.GetRelativeVirtualAddress();
initVal = fieldDefinition.GetInitialValue(module.Reader, null); int sectionIndex = module.Reader.PEHeaders.GetContainingSectionIndex(rva);
} catch (BadImageFormatException ex) { if (sectionIndex < 0) {
initVal = default; output.WriteLine($"// RVA {rva:X8} invalid (not in any section)");
output.WriteLine("// .data D_{0:X8} = {1}", fieldDefinition.GetRelativeVirtualAddress(), ex.Message); } else {
} BlobReader initVal;
if (initVal.Length > 0) { try {
output.Write(".data D_{0:X8} = bytearray ", fieldDefinition.GetRelativeVirtualAddress()); initVal = fieldDefinition.GetInitialValue(module.Reader, null);
WriteBlob(initVal); } catch (BadImageFormatException ex) {
output.WriteLine(); initVal = default;
output.WriteLine("// .data D_{0:X8} = {1}", fieldDefinition.GetRelativeVirtualAddress(), ex.Message);
}
if (initVal.Length > 0) {
var sectionHeader = module.Reader.PEHeaders.SectionHeaders[sectionIndex];
output.Write(".data ");
if (sectionHeader.Name == ".text") {
output.Write("cil ");
} else if (sectionHeader.Name == ".tls") {
output.Write("tls ");
} else if (sectionHeader.Name != ".data") {
output.Write($"/* {sectionHeader.Name} */ ");
}
output.Write($"D_{rva:X8} = bytearray ");
WriteBlob(initVal);
output.WriteLine();
}
} }
} }
} }

Loading…
Cancel
Save