提交 108a556b 编写于 作者: T Tomáš Matoušek

Merge pull request #1711 from tmat/PdbTimestamp

Fix timestamp written to Debug Image Directory
......@@ -58,6 +58,17 @@ internal interface ISymUnmanagedWriter2
void DefineConstant2([MarshalAs(UnmanagedType.LPWStr)] string name, VariantStructure value, uint sigToken);
}
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("98ECEE1E-752D-11d3-8D56-00C04F680B2B"), SuppressUnmanagedCodeSecurity]
internal interface IPdbWriter
{
int __SetPath(/*[in] const WCHAR* szFullPathName, [in] IStream* pIStream, [in] BOOL fFullBuild*/);
int __OpenMod(/*[in] const WCHAR* szModuleName, [in] const WCHAR* szFileName*/);
int __CloseMod();
int __GetPath(/*[in] DWORD ccData,[out] DWORD* pccData,[out, size_is(ccData),length_is(*pccData)] WCHAR szPath[]*/);
void GetSignatureAge(out uint sig, out uint age);
}
internal static class ISymUnmanagedWriter2Helper
{
public static unsafe void DefineConstant2(this ISymUnmanagedWriter2 writer, string name, object value, uint sigToken)
......
......@@ -577,7 +577,7 @@ public void SetMetadataEmitter(MetadataWriter metadataWriter)
}
}
public unsafe Guid GetDebugDirectoryGuid()
public unsafe void GetDebugDirectoryGuidAndStamp(out Guid guid, out uint stamp)
{
// See symwrite.cpp - the data byte[] doesn't depend on the content of metadata tables or IL.
// The writer only sets two values of the ImageDebugDirectory struct.
......@@ -626,7 +626,13 @@ public unsafe Guid GetDebugDirectoryGuid()
byte[] guidBytes = new byte[GuidSize];
Buffer.BlockCopy(data, 4, guidBytes, 0, guidBytes.Length);
return new Guid(guidBytes);
guid = new Guid(guidBytes);
// Retrieve the timestamp the PDB writer generates when creating a new PDB stream.
// Note that ImageDebugDirectory.TimeDateStamp is not set by GetDebugInfo,
// we need to go thru IPdbWriter interface to get it.
uint age;
((IPdbWriter)_symWriter).GetSignatureAge(out stamp, out age);
}
public void SetEntryPoint(uint entryMethodToken)
......
......@@ -1442,12 +1442,24 @@ private void WriteDebugTable(Stream peStream, MetadataSizes metadataSizes, out l
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
Guid pdbId;
uint pdbStamp;
if (_nativePdbWriterOpt != null)
{
_nativePdbWriterOpt.GetDebugDirectoryGuidAndStamp(out pdbId, out pdbStamp);
}
else
{
pdbId = Guid.NewGuid();
pdbStamp = 0;
}
// characteristics:
writer.WriteUint(0);
// timestamp from NT headers
timestampOffset = writer.BaseStream.Position + peStream.Position;
writer.WriteUint(_ntHeader.TimeDateStamp);
writer.WriteUint(pdbStamp);
// version
writer.WriteUint(0);
......@@ -1472,9 +1484,7 @@ private void WriteDebugTable(Stream peStream, MetadataSizes metadataSizes, out l
writer.WriteByte((byte)'D');
writer.WriteByte((byte)'S');
// TODO: use deterministic hash
Guid guid = _nativePdbWriterOpt?.GetDebugDirectoryGuid() ?? Guid.NewGuid();
writer.WriteBytes(guid.ToByteArray());
writer.WriteBytes(pdbId.ToByteArray());
// Age (EnC generation + 1): always 0x00000001.
// We don't emit PE files when emitting EnC deltas.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册