summaryrefslogtreecommitdiff
path: root/src/tools/r2rdump/R2RReader.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/r2rdump/R2RReader.cs')
-rw-r--r--src/tools/r2rdump/R2RReader.cs32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/tools/r2rdump/R2RReader.cs b/src/tools/r2rdump/R2RReader.cs
index 549415f669..d73fdc80b1 100644
--- a/src/tools/r2rdump/R2RReader.cs
+++ b/src/tools/r2rdump/R2RReader.cs
@@ -43,6 +43,19 @@ namespace R2RDump
}
}
+ /// <summary>
+ /// based on <a href="https://github.com/dotnet/coreclr/blob/master/src/inc/pedecoder.h">src/inc/pedecoder.h</a> IMAGE_FILE_MACHINE_NATIVE_OS_OVERRIDE
+ /// </summary>
+ public enum OperatingSystem
+ {
+ Apple = 0x4644,
+ FreeBSD = 0xADC4,
+ Linux = 0x7B79,
+ NetBSD = 0x1993,
+ Windows = 0,
+ Unknown = -1
+ }
+
public class R2RReader
{
/// <summary>
@@ -76,6 +89,8 @@ namespace R2RDump
/// </summary>
public Machine Machine { get; set; }
+ public OperatingSystem OS { get; set; }
+
/// <summary>
/// The preferred address of the first byte of image when loaded into memory;
/// must be a multiple of 64K.
@@ -127,11 +142,20 @@ namespace R2RDump
throw new BadImageFormatException("The file is not a ReadyToRun image");
}
- Machine = PEReader.PEHeaders.CoffHeader.Machine;
- if (!Machine.IsDefined(typeof(Machine), Machine))
+ uint machine = (uint)PEReader.PEHeaders.CoffHeader.Machine;
+ OS = OperatingSystem.Unknown;
+ foreach(OperatingSystem os in Enum.GetValues(typeof(OperatingSystem)))
+ {
+ Machine = (Machine)(machine ^ (uint)os);
+ if (Enum.IsDefined(typeof(Machine), Machine))
+ {
+ OS = os;
+ break;
+ }
+ }
+ if (OS == OperatingSystem.Unknown)
{
- R2RDump.WriteWarning($"Invalid Machine: {Machine}");
- Machine = Machine.Amd64;
+ throw new BadImageFormatException($"Invalid Machine: {machine}");
}
ImageBase = PEReader.PEHeaders.PEHeader.ImageBase;