Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJb Evain <jb@evain.net>2021-07-02 00:52:04 +0300
committerGitHub <noreply@github.com>2021-07-02 00:52:04 +0300
commitd820a5beca4104364178c61e1c59718fb228589e (patch)
treed3dc1e7c9d8c975536ef1754a43142a360257cfa
parentb0b93f5e29237fca6ece940cbc3a1219c387d456 (diff)
Preserve LargeAwareAddress image flag (#775)
-rw-r--r--Mono.Cecil.PE/Image.cs3
-rw-r--r--Mono.Cecil.PE/ImageReader.cs3
-rw-r--r--Mono.Cecil.PE/ImageWriter.cs12
-rw-r--r--Mono.Cecil/ModuleDefinition.cs2
-rw-r--r--Test/Mono.Cecil.Tests/ImageReadTests.cs8
-rw-r--r--Test/Resources/assemblies/anycpu32bitpreferred.exebin0 -> 3584 bytes
6 files changed, 22 insertions, 6 deletions
diff --git a/Mono.Cecil.PE/Image.cs b/Mono.Cecil.PE/Image.cs
index 1092061..97e69c0 100644
--- a/Mono.Cecil.PE/Image.cs
+++ b/Mono.Cecil.PE/Image.cs
@@ -25,9 +25,10 @@ namespace Mono.Cecil.PE {
public string FileName;
public ModuleKind Kind;
+ public uint Characteristics;
public string RuntimeVersion;
public TargetArchitecture Architecture;
- public ModuleCharacteristics Characteristics;
+ public ModuleCharacteristics DllCharacteristics;
public ushort LinkerVersion;
public ushort SubSystemMajor;
public ushort SubSystemMinor;
diff --git a/Mono.Cecil.PE/ImageReader.cs b/Mono.Cecil.PE/ImageReader.cs
index 84fdeb6..5358129 100644
--- a/Mono.Cecil.PE/ImageReader.cs
+++ b/Mono.Cecil.PE/ImageReader.cs
@@ -88,8 +88,9 @@ namespace Mono.Cecil.PE {
ReadMetadata ();
ReadDebugHeader ();
+ image.Characteristics = characteristics;
image.Kind = GetModuleKind (characteristics, subsystem);
- image.Characteristics = (ModuleCharacteristics) dll_characteristics;
+ image.DllCharacteristics = (ModuleCharacteristics) dll_characteristics;
}
TargetArchitecture ReadArchitecture ()
diff --git a/Mono.Cecil.PE/ImageWriter.cs b/Mono.Cecil.PE/ImageWriter.cs
index 7e5e923..a8a3fa8 100644
--- a/Mono.Cecil.PE/ImageWriter.cs
+++ b/Mono.Cecil.PE/ImageWriter.cs
@@ -194,12 +194,18 @@ namespace Mono.Cecil.PE {
WriteUInt32 (metadata.timestamp);
WriteUInt32 (0); // PointerToSymbolTable
WriteUInt32 (0); // NumberOfSymbols
- WriteUInt16 (SizeOfOptionalHeader ()); // SizeOfOptionalHeader
+ WriteUInt16 (SizeOfOptionalHeader ()); // SizeOfOptionalHeader
- // ExecutableImage | (pe64 ? 32BitsMachine : LargeAddressAware)
- var characteristics = (ushort) (0x0002 | (!pe64 ? 0x0100 : 0x0020));
+ const ushort LargeAddressAware = 0x0020;
+
+ // ExecutableImage | (!pe64 ? 32BitsMachine : LargeAddressAware)
+ var characteristics = (ushort) (0x0002 | (!pe64 ? 0x0100 : LargeAddressAware));
if (module.Kind == ModuleKind.Dll || module.Kind == ModuleKind.NetModule)
characteristics |= 0x2000;
+
+ if (module.Image != null && (module.Image.Characteristics & LargeAddressAware) != 0)
+ characteristics |= LargeAddressAware;
+
WriteUInt16 (characteristics); // Characteristics
}
diff --git a/Mono.Cecil/ModuleDefinition.cs b/Mono.Cecil/ModuleDefinition.cs
index 8fb35a5..b17f7c4 100644
--- a/Mono.Cecil/ModuleDefinition.cs
+++ b/Mono.Cecil/ModuleDefinition.cs
@@ -586,7 +586,7 @@ namespace Mono.Cecil {
this.RuntimeVersion = image.RuntimeVersion;
this.architecture = image.Architecture;
this.attributes = image.Attributes;
- this.characteristics = image.Characteristics;
+ this.characteristics = image.DllCharacteristics;
this.linker_version = image.LinkerVersion;
this.subsystem_major = image.SubSystemMajor;
this.subsystem_minor = image.SubSystemMinor;
diff --git a/Test/Mono.Cecil.Tests/ImageReadTests.cs b/Test/Mono.Cecil.Tests/ImageReadTests.cs
index de7a2cc..ef6ab06 100644
--- a/Test/Mono.Cecil.Tests/ImageReadTests.cs
+++ b/Test/Mono.Cecil.Tests/ImageReadTests.cs
@@ -101,6 +101,14 @@ namespace Mono.Cecil.Tests {
}
[Test]
+ public void AnyCPU32BitPreferred ()
+ {
+ TestModule ("anycpu32bitpreferred.exe", module => {
+ Assert.AreNotEqual (0, module.Image.Characteristics & 0x0020);
+ });
+ }
+
+ [Test]
public void X64ModuleTextOnlySection ()
{
TestModule ("hello.textonly.x64.exe", module => {
diff --git a/Test/Resources/assemblies/anycpu32bitpreferred.exe b/Test/Resources/assemblies/anycpu32bitpreferred.exe
new file mode 100644
index 0000000..e758a7f
--- /dev/null
+++ b/Test/Resources/assemblies/anycpu32bitpreferred.exe
Binary files differ