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 @@ -1373,7 +1373,7 @@ namespace ICSharpCode.Decompiler.CSharp
}
var fieldDefinition = metadata.GetFieldDefinition((FieldDefinitionHandle)field.MetadataToken);
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)
// .field public static int32 _x at I_X
string message;

38
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1128,17 +1128,33 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1128,17 +1128,33 @@ namespace ICSharpCode.Decompiler.Disassembler
output.MarkFoldEnd();
}
if (fieldDefinition.HasFlag(FieldAttributes.HasFieldRVA)) {
BlobReader initVal;
try {
initVal = fieldDefinition.GetInitialValue(module.Reader, null);
} catch (BadImageFormatException ex) {
initVal = default;
output.WriteLine("// .data D_{0:X8} = {1}", fieldDefinition.GetRelativeVirtualAddress(), ex.Message);
}
if (initVal.Length > 0) {
output.Write(".data D_{0:X8} = bytearray ", fieldDefinition.GetRelativeVirtualAddress());
WriteBlob(initVal);
output.WriteLine();
// 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;
try {
initVal = fieldDefinition.GetInitialValue(module.Reader, null);
} catch (BadImageFormatException ex) {
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