LogLevel = 0;\r
OutputFileBuffer = NULL;\r
OutputFileLength = 0;\r
+ Optional32 = NULL;\r
+ Optional64 = NULL;\r
KeepExceptionTableFlag = FALSE;\r
KeepZeroPendingFlag = FALSE;\r
\r
TEImageHeader.NumberOfSections = (UINT8) PeHdr->FileHeader.NumberOfSections;\r
TEImageHeader.StrippedSize = (UINT16) ((UINTN) ((UINT8 *) &(PeHdr->OptionalHeader) + PeHdr->FileHeader.SizeOfOptionalHeader) - (UINTN) FileBuffer);\r
TEImageHeader.Subsystem = (UINT8) Type;\r
-\r
+ \r
//\r
// Patch the PE header\r
//\r
Error (NULL, 0, 3000, "Invalid", "Magic 0x%x of PeImage %s is unknown.", PeHdr->OptionalHeader.Magic, mInImageName);\r
goto Finish;\r
}\r
+ \r
+ if (((PeHdr->FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) == 0) && \\r
+ (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == 0) && \\r
+ (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size == 0)) {\r
+ //\r
+ // PeImage can be loaded into memory, but it has no relocation section. \r
+ // Fix TeImage Header to set VA of relocation data directory to not zero, the size is still zero.\r
+ //\r
+ if (Optional32 != NULL) {\r
+ TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = Optional32->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);\r
+ } else if (Optional64 != NULL) {\r
+ TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = Optional64->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);\r
+ }\r
+ }\r
\r
//\r
// Zero ExceptionTable Xdata\r