summaryrefslogtreecommitdiff
path: root/packaging/0001-Fix-crossgen-debug-directory-generation-problems.-12.patch
blob: 292a01a424fac5504622c857e97be1ecf90c695e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
From 2ae797a1e975e42dd448e7a345c698c98cd18ca6 Mon Sep 17 00:00:00 2001
From: Mike McLaughlin <mikem@microsoft.com>
Date: Tue, 11 Jul 2017 09:58:49 -0700
Subject: [PATCH] Fix crossgen debug directory generation problems. (#12715)

* Fix crossgen debug directory generation problems.

The first problem was that when the existing/incoming PDB debug
directory entry was a portable PDB (MinorVersion == 0x504d), the
ngen/native PDB added had the same MinorVersion indicating that
it was a portable PDB (but it never can be).

This was fixed by setting MinorVersion to 0 when creating the
ngen PDB debug directory entry.

The second problem was that the ngen PDB entry was being created
even when crossgen was run on linux/mac, etc.

The fix was to ifdef NO_NGENPDB the save ngen PDB entry code.
---
 src/zap/zapheaders.cpp | 6 ++++++
 src/zap/zapheaders.h   | 5 +++++
 2 files changed, 11 insertions(+)

diff --git a/src/zap/zapheaders.cpp b/src/zap/zapheaders.cpp
index 8960798..f3dab63 100644
--- a/src/zap/zapheaders.cpp
+++ b/src/zap/zapheaders.cpp
@@ -282,6 +282,7 @@ void ZapDebugDirectory::SaveOriginalDebugDirectoryEntry(ZapWriter *pZapWriter)
 
 void ZapDebugDirectory::SaveNGenDebugDirectoryEntry(ZapWriter *pZapWriter)
 {
+#if !defined(NO_NGENPDB)
     _ASSERTE(pZapWriter);
 
     IMAGE_DEBUG_DIRECTORY debugDirectory = {0};
@@ -292,6 +293,10 @@ void ZapDebugDirectory::SaveNGenDebugDirectoryEntry(ZapWriter *pZapWriter)
     debugDirectory.Type = IMAGE_DEBUG_TYPE_CODEVIEW;
     debugDirectory.SizeOfData = m_pNGenPdbDebugData->GetSize();
     debugDirectory.AddressOfRawData = m_pNGenPdbDebugData->GetRVA();
+    // Make sure the "is portable pdb" indicator (MinorVersion == 0x504d) is clear
+    // for the NGen debug directory entry since this debug directory is copied
+    // from an existing entry which could be a portable pdb.
+    debugDirectory.MinorVersion = 0;
     {
         ZapPhysicalSection *pPhysicalSection = ZapImage::GetImage(pZapWriter)->m_pTextSection;
         DWORD dwOffset = m_pNGenPdbDebugData->GetRVA() - pPhysicalSection->GetRVA();
@@ -299,6 +304,7 @@ void ZapDebugDirectory::SaveNGenDebugDirectoryEntry(ZapWriter *pZapWriter)
         debugDirectory.PointerToRawData = pPhysicalSection->GetFilePos() + dwOffset;
     }
     pZapWriter->Write(&debugDirectory, sizeof(debugDirectory));
+#endif // NO_NGENPDB
 }
 
 void ZapDebugDirectory::Save(ZapWriter * pZapWriter)
diff --git a/src/zap/zapheaders.h b/src/zap/zapheaders.h
index 0755c0e..f966ced 100644
--- a/src/zap/zapheaders.h
+++ b/src/zap/zapheaders.h
@@ -249,7 +249,12 @@ public:
 
     virtual DWORD GetSize()
     {
+#if defined(NO_NGENPDB)
+        return sizeof(IMAGE_DEBUG_DIRECTORY) * m_nDebugDirectory;
+#else
+        // Add one for NGen PDB debug directory entry
         return sizeof(IMAGE_DEBUG_DIRECTORY) * (m_nDebugDirectory + 1);
+#endif // NO_NGENPDB
     }
 
     virtual UINT GetAlignment()
-- 
2.7.4