Browse Source

FieldValueSizeDecoder: Use pointer size defined in decompiled module.

Use same prefixes for PE sections as ildasm.
pull/1556/head
Siegfried Pammer 6 years ago
parent
commit
8e7a197c8d
  1. 25
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 7
      ICSharpCode.Decompiler/SRMExtensions.cs

25
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1111,8 +1111,11 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1111,8 +1111,11 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write(' ');
var fieldName = metadata.GetString(fieldDefinition.Name);
output.Write(DisassemblerHelpers.Escape(fieldName));
char sectionPrefix = 'D';
if (fieldDefinition.HasFlag(FieldAttributes.HasFieldRVA)) {
output.Write(" at D_{0:X8}", fieldDefinition.GetRelativeVirtualAddress());
int rva = fieldDefinition.GetRelativeVirtualAddress();
sectionPrefix = GetRVASectionPrefix(module.Reader.PEHeaders, rva);
output.Write(" at {1}_{0:X8}", rva, sectionPrefix);
}
var defaultValue = fieldDefinition.GetDefaultValue();
@ -1139,7 +1142,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1139,7 +1142,7 @@ namespace ICSharpCode.Decompiler.Disassembler
initVal = fieldDefinition.GetInitialValue(module.Reader, null);
} catch (BadImageFormatException ex) {
initVal = default;
output.WriteLine("// .data D_{0:X8} = {1}", fieldDefinition.GetRelativeVirtualAddress(), ex.Message);
output.WriteLine("// .data {2}_{0:X8} = {1}", fieldDefinition.GetRelativeVirtualAddress(), ex.Message, sectionPrefix);
}
if (initVal.Length > 0) {
var sectionHeader = module.Reader.PEHeaders.SectionHeaders[sectionIndex];
@ -1151,13 +1154,29 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1151,13 +1154,29 @@ namespace ICSharpCode.Decompiler.Disassembler
} else if (sectionHeader.Name != ".data") {
output.Write($"/* {sectionHeader.Name} */ ");
}
output.Write($"D_{rva:X8} = bytearray ");
output.Write($"{sectionPrefix}_{rva:X8} = bytearray ");
WriteBlob(initVal);
output.WriteLine();
}
}
}
}
char GetRVASectionPrefix(System.Reflection.PortableExecutable.PEHeaders headers, int rva)
{
int sectionIndex = headers.GetContainingSectionIndex(rva);
if (sectionIndex < 0)
return 'D';
var sectionHeader = headers.SectionHeaders[sectionIndex];
switch (sectionHeader.Name) {
case ".tls":
return 'T';
case ".text":
return 'I';
default:
return 'D';
}
}
#endregion
#region Disassemble Property

7
ICSharpCode.Decompiler/SRMExtensions.cs

@ -387,12 +387,15 @@ namespace ICSharpCode.Decompiler @@ -387,12 +387,15 @@ namespace ICSharpCode.Decompiler
sealed class FieldValueSizeDecoder : ISignatureTypeProvider<int, GenericContext>
{
readonly MetadataModule module;
// This is the same as Cecil does, but probably not a good idea.
static readonly int pointerSize = IntPtr.Size;
readonly int pointerSize;
public FieldValueSizeDecoder(ICompilation typeSystem = null)
{
this.module = (MetadataModule)typeSystem?.MainModule;
if (module == null)
this.pointerSize = IntPtr.Size;
else
this.pointerSize = module.PEFile.Reader.PEHeaders.PEHeader.Magic == PEMagic.PE32 ? 4 : 8;
}
public int GetArrayType(int elementType, ArrayShape shape) => GetPrimitiveType(PrimitiveTypeCode.Object);

Loading…
Cancel
Save