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. 18
      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;

18
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1128,6 +1128,12 @@ namespace ICSharpCode.Decompiler.Disassembler
output.MarkFoldEnd(); output.MarkFoldEnd();
} }
if (fieldDefinition.HasFlag(FieldAttributes.HasFieldRVA)) { if (fieldDefinition.HasFlag(FieldAttributes.HasFieldRVA)) {
// Field data as specified in II.16.3.1 of ECMA-335 6th edition
int rva = fieldDefinition.GetRelativeVirtualAddress();
int sectionIndex = module.Reader.PEHeaders.GetContainingSectionIndex(rva);
if (sectionIndex < 0) {
output.WriteLine($"// RVA {rva:X8} invalid (not in any section)");
} else {
BlobReader initVal; BlobReader initVal;
try { try {
initVal = fieldDefinition.GetInitialValue(module.Reader, null); initVal = fieldDefinition.GetInitialValue(module.Reader, null);
@ -1136,12 +1142,22 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine("// .data D_{0:X8} = {1}", fieldDefinition.GetRelativeVirtualAddress(), ex.Message); output.WriteLine("// .data D_{0:X8} = {1}", fieldDefinition.GetRelativeVirtualAddress(), ex.Message);
} }
if (initVal.Length > 0) { if (initVal.Length > 0) {
output.Write(".data D_{0:X8} = bytearray ", fieldDefinition.GetRelativeVirtualAddress()); 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); WriteBlob(initVal);
output.WriteLine(); output.WriteLine();
} }
} }
} }
}
#endregion #endregion
#region Disassemble Property #region Disassemble Property

Loading…
Cancel
Save