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:
authorVitek Karas <10670590+vitek-karas@users.noreply.github.com>2021-11-29 18:30:22 +0300
committerGitHub <noreply@github.com>2021-11-29 18:30:22 +0300
commite04f1418730bdd7c8c46a13118f0cb1b5603997c (patch)
treecc66a26ed2eccd3f145ce222d766cafc728c43fa
parentff616bf90e3aff2292a0b1536f7af13cd8810276 (diff)
Fix portable PDB stamp in CodeView header (#32)
-rw-r--r--Mono.Cecil.Cil/PortablePdb.cs10
-rw-r--r--Test/Mono.Cecil.Tests/PortablePdbTests.cs38
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;
+ }
}
}