sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) +\r
strlen(mInImageName) + 1;\r
\r
+ //\r
+ // Add more space in the .debug data region for the DllCharacteristicsEx\r
+ // field.\r
+ //\r
+ if (mDllCharacteristicsEx != 0) {\r
+ mCoffOffset = DebugRvaAlign(mCoffOffset) +\r
+ sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY) +\r
+ sizeof (EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY);\r
+ }\r
+\r
mCoffOffset = CoffAlign(mCoffOffset);\r
if (SectionCount == 0) {\r
mDataOffset = mCoffOffset;\r
VOID\r
)\r
{\r
- UINT32 Len;\r
- EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr;\r
- EFI_IMAGE_DATA_DIRECTORY *DataDir;\r
- EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir;\r
- EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10;\r
+ UINT32 Len;\r
+ EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr;\r
+ EFI_IMAGE_DATA_DIRECTORY *DataDir;\r
+ EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir;\r
+ EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10;\r
+ EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY *DllEntry;\r
\r
Len = strlen(mInImageName) + 1;\r
\r
+ NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset);\r
+ DataDir = &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG];\r
+ DataDir->VirtualAddress = mDebugOffset;\r
+ DataDir->Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+\r
Dir = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY*)(mCoffFile + mDebugOffset);\r
+\r
+ if (mDllCharacteristicsEx != 0) {\r
+ DataDir->Size += sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+\r
+ Dir->Type = EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS;\r
+ Dir->SizeOfData = sizeof (EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY);\r
+ Dir->FileOffset = mDebugOffset + DataDir->Size +\r
+ sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) +\r
+ DebugRvaAlign(Len);\r
+ Dir->RVA = Dir->FileOffset;\r
+\r
+ DllEntry = (VOID *)(mCoffFile + Dir->FileOffset);\r
+\r
+ DllEntry->DllCharacteristicsEx = mDllCharacteristicsEx;\r
+\r
+ Dir++;\r
+ }\r
+\r
Dir->Type = EFI_IMAGE_DEBUG_TYPE_CODEVIEW;\r
Dir->SizeOfData = sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + Len;\r
- Dir->RVA = mDebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
- Dir->FileOffset = mDebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+ Dir->RVA = mDebugOffset + DataDir->Size;\r
+ Dir->FileOffset = mDebugOffset + DataDir->Size;\r
\r
Nb10 = (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY*)(Dir + 1);\r
Nb10->Signature = CODEVIEW_SIGNATURE_NB10;\r
strcpy ((char *)(Nb10 + 1), mInImageName);\r
-\r
-\r
- NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset);\r
- DataDir = &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG];\r
- DataDir->VirtualAddress = mDebugOffset;\r
- DataDir->Size = sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
}\r
\r
STATIC\r
///\r
/// Debug Format\r
///\r
-#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2\r
+#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2\r
+#define EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20\r
\r
typedef struct {\r
UINT32 Characteristics;\r
//\r
} EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY;\r
\r
+///\r
+/// Extended DLL Characteristics\r
+///\r
+#define EFI_IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001\r
+#define EFI_IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040\r
+\r
+typedef struct {\r
+ UINT32 DllCharacteristicsEx;\r
+} EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY;\r
+\r
//\r
// .pdata entries for X64\r
//\r