diff options
author | Vitek Karas <10670590+vitek-karas@users.noreply.github.com> | 2021-11-29 18:30:22 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-29 18:30:22 +0300 |
commit | e04f1418730bdd7c8c46a13118f0cb1b5603997c (patch) | |
tree | cc66a26ed2eccd3f145ce222d766cafc728c43fa | |
parent | ff616bf90e3aff2292a0b1536f7af13cd8810276 (diff) |
Fix portable PDB stamp in CodeView header (#32)
-rw-r--r-- | Mono.Cecil.Cil/PortablePdb.cs | 10 | ||||
-rw-r--r-- | Test/Mono.Cecil.Tests/PortablePdbTests.cs | 38 |
2 files changed, 35 insertions, 13 deletions
diff --git a/Mono.Cecil.Cil/PortablePdb.cs b/Mono.Cecil.Cil/PortablePdb.cs index d8c43f6..f6842da 100644 --- a/Mono.Cecil.Cil/PortablePdb.cs +++ b/Mono.Cecil.Cil/PortablePdb.cs @@ -269,7 +269,7 @@ namespace Mono.Cecil.Cil { internal byte [] pdb_checksum; internal Guid pdb_id_guid; - internal uint pdb_id_age; + internal uint pdb_id_stamp; bool IsEmbedded { get { return writer == null; } } @@ -324,7 +324,7 @@ namespace Mono.Cecil.Cil { MajorVersion = 256, MinorVersion = 20557, Type = ImageDebugType.CodeView, - TimeDateStamp = (int)module.timestamp, + TimeDateStamp = (int)pdb_id_stamp, }; var buffer = new ByteBuffer (); @@ -333,7 +333,7 @@ namespace Mono.Cecil.Cil { // Module ID buffer.WriteBytes (pdb_id_guid.ToByteArray ()); // PDB Age - buffer.WriteUInt32 (pdb_id_age); + buffer.WriteUInt32 (1); // PDB Path var fileName = writer.BaseStream.GetFileName (); if (string.IsNullOrEmpty (fileName)) { @@ -462,7 +462,7 @@ namespace Mono.Cecil.Cil { var hashBytes = new ByteBuffer (pdb_checksum); pdb_id_guid = new Guid (hashBytes.ReadBytes (16)); - pdb_id_age = hashBytes.ReadUInt32 (); + pdb_id_stamp = hashBytes.ReadUInt32 (); } void WritePdbId () @@ -470,7 +470,7 @@ namespace Mono.Cecil.Cil { // PDB ID is the first 20 bytes of the PdbHeap writer.MoveToRVA (TextSegment.PdbHeap); writer.WriteBytes (pdb_id_guid.ToByteArray ()); - writer.WriteUInt32 (pdb_id_age); + writer.WriteUInt32 (pdb_id_stamp); } } diff --git a/Test/Mono.Cecil.Tests/PortablePdbTests.cs b/Test/Mono.Cecil.Tests/PortablePdbTests.cs index 1401f63..4b9d4eb 100644 --- a/Test/Mono.Cecil.Tests/PortablePdbTests.cs +++ b/Test/Mono.Cecil.Tests/PortablePdbTests.cs @@ -885,11 +885,13 @@ class Program using (var module = GetResourceModule (resource, new ReaderParameters { ReadSymbols = true })) { GetPdbChecksumData (module.GetDebugHeader (), out string algorithmName, out byte [] checksum); Assert.AreEqual ("SHA256", algorithmName); + GetCodeViewPdbId (module, out byte[] pdbId); - string pdbPath = GetDebugHeaderPdbPath (module); - CalculatePdbChecksumAndId (pdbPath, out byte [] expectedChecksum, out byte [] pdbId); + string pdbPath = Mixin.GetPdbFileName (module.FileName); + CalculatePdbChecksumAndId (pdbPath, out byte [] expectedChecksum, out byte [] expectedPdbId); CollectionAssert.AreEqual (expectedChecksum, checksum); + CollectionAssert.AreEqual (expectedPdbId, pdbId); } } @@ -902,11 +904,13 @@ class Program var debugHeader = module.GetDebugHeader (); GetPdbChecksumData (debugHeader, out string algorithmName, out byte [] checksum); Assert.AreEqual ("SHA256", algorithmName); + GetCodeViewPdbId (module, out byte [] pdbId); GetEmbeddedPdb (debugHeader, out byte [] embeddedPdb); - CalculatePdbChecksumAndId (embeddedPdb, out byte [] expectedChecksum, out byte [] pdbId); + CalculatePdbChecksumAndId (embeddedPdb, out byte [] expectedChecksum, out byte [] expectedPdbId); CollectionAssert.AreEqual (expectedChecksum, checksum); + CollectionAssert.AreEqual (expectedPdbId, pdbId); } } @@ -923,11 +927,13 @@ class Program using (var module = ModuleDefinition.ReadModule (destination, new ReaderParameters { ReadSymbols = true })) { GetPdbChecksumData (module.GetDebugHeader (), out string algorithmName, out byte [] checksum); Assert.AreEqual ("SHA256", algorithmName); + GetCodeViewPdbId (module, out byte [] pdbId); - string pdbPath = GetDebugHeaderPdbPath (module); - CalculatePdbChecksumAndId (pdbPath, out byte [] expectedChecksum, out byte [] pdbId); + string pdbPath = Mixin.GetPdbFileName (module.FileName); + CalculatePdbChecksumAndId (pdbPath, out byte [] expectedChecksum, out byte [] expectedPdbId); CollectionAssert.AreEqual (expectedChecksum, checksum); + CollectionAssert.AreEqual (expectedPdbId, pdbId); } } @@ -961,7 +967,7 @@ class Program byte [] pdbIdOne; using (var module = ModuleDefinition.ReadModule (destination, new ReaderParameters { ReadSymbols = true })) { - string pdbPath = GetDebugHeaderPdbPath (module); + string pdbPath = Mixin.GetPdbFileName (module.FileName); CalculatePdbChecksumAndId (pdbPath, out byte [] expectedChecksum, out pdbIdOne); } @@ -971,7 +977,7 @@ class Program byte [] pdbIdTwo; using (var module = ModuleDefinition.ReadModule (destination, new ReaderParameters { ReadSymbols = true })) { - string pdbPath = GetDebugHeaderPdbPath (module); + string pdbPath = Mixin.GetPdbFileName (module.FileName); CalculatePdbChecksumAndId (pdbPath, out byte [] expectedChecksum, out pdbIdTwo); } @@ -992,11 +998,13 @@ class Program var debugHeader = module.GetDebugHeader (); GetPdbChecksumData (debugHeader, out string algorithmName, out byte [] checksum); Assert.AreEqual ("SHA256", algorithmName); + GetCodeViewPdbId (module, out byte [] pdbId); GetEmbeddedPdb (debugHeader, out byte [] embeddedPdb); - CalculatePdbChecksumAndId (embeddedPdb, out byte [] expectedChecksum, out byte [] pdbId); + CalculatePdbChecksumAndId (embeddedPdb, out byte [] expectedChecksum, out byte [] expectedPdbId); CollectionAssert.AreEqual (expectedChecksum, checksum); + CollectionAssert.AreEqual (expectedPdbId, pdbId); } } @@ -1102,5 +1110,19 @@ class Program var sha256 = SHA256.Create (); pdbChecksum = sha256.ComputeHash (bytes); } + + static void GetCodeViewPdbId (ModuleDefinition module, out byte[] pdbId) + { + var header = module.GetDebugHeader (); + var cv = Mixin.GetCodeViewEntry (header); + Assert.IsNotNull (cv); + + CollectionAssert.AreEqual (new byte [] { 0x52, 0x53, 0x44, 0x53 }, cv.Data.Take (4)); + + ByteBuffer buffer = new ByteBuffer (20); + buffer.WriteBytes (cv.Data.Skip (4).Take (16).ToArray ()); + buffer.WriteInt32 (cv.Directory.TimeDateStamp); + pdbId = buffer.buffer; + } } } |