Fix the bug that TE image from PIC PeImage can't be dispatched by PeiCore.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 8 Jul 2009 07:54:06 +0000 (07:54 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 8 Jul 2009 07:54:06 +0000 (07:54 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1638 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFw/GenFw.c

index d8fe75f..630fa64 100644 (file)
@@ -1272,6 +1272,8 @@ Returns:
   LogLevel          = 0;\r
   OutputFileBuffer  = NULL;\r
   OutputFileLength  = 0;\r
+  Optional32        = NULL;\r
+  Optional64        = NULL;\r
   KeepExceptionTableFlag = FALSE;\r
   KeepZeroPendingFlag    = FALSE;\r
 \r
@@ -2132,7 +2134,7 @@ Returns:
   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
@@ -2344,6 +2346,20 @@ Returns:
     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