]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePeCoffLib/BasePeCoff.c
remove unnecessary comments introduced by tools from MdePkg. The regular express...
[mirror_edk2.git] / MdePkg / Library / BasePeCoffLib / BasePeCoff.c
index ad3635f2fbc42bce7c9e5a80a32474158967f5af..ea45ff745df2420d305bd3ea9514fe9062e511e4 100644 (file)
   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-  Module Name:  PeCoffLoader.c\r
-\r
 **/\r
 \r
+\r
+\r
+\r
 #include "BasePeCoffLibInternals.h"\r
 \r
 /**\r
@@ -268,6 +269,8 @@ PeCoffLoaderGetImageInfo (
   //\r
   if ((!(ImageContext->IsTeImage)) && ((Hdr.Pe32->FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0)) {\r
     ImageContext->RelocationsStripped = TRUE;\r
+  } else if ((ImageContext->IsTeImage) && (Hdr.Te->DataDirectory[0].Size == 0) && (Hdr.Te->DataDirectory[0].VirtualAddress == 0)) {\r
+    ImageContext->RelocationsStripped = TRUE;\r
   } else {\r
     ImageContext->RelocationsStripped = FALSE;\r
   }\r
@@ -539,11 +542,8 @@ PeCoffLoaderRelocateImage (
   //\r
   if (ImageContext->DestinationAddress != 0) {\r
     BaseAddress = ImageContext->DestinationAddress;\r
-  } else if (!(ImageContext->IsTeImage)) {\r
-    BaseAddress = ImageContext->ImageAddress;\r
   } else {\r
-    Hdr.Te      = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
-    BaseAddress = ImageContext->ImageAddress + sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize; \r
+    BaseAddress = ImageContext->ImageAddress;\r
   }\r
 \r
   if (!(ImageContext->IsTeImage)) {\r
@@ -592,8 +592,8 @@ PeCoffLoaderRelocateImage (
     }\r
   } else {\r
     Hdr.Te             = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
-    Adjust             = (UINT64) (BaseAddress - Hdr.Te->ImageBase);\r
-    Hdr.Te->ImageBase  = (UINT64) (BaseAddress);\r
+    Adjust             = (UINT64) (BaseAddress - Hdr.Te->StrippedSize + sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->ImageBase);\r
+    Hdr.Te->ImageBase  = (UINT64) (BaseAddress - Hdr.Te->StrippedSize + sizeof (EFI_TE_IMAGE_HEADER));\r
 \r
     //\r
     // Find the relocation block\r
@@ -706,6 +706,13 @@ PeCoffLoaderRelocateImage (
     RelocBase = (EFI_IMAGE_BASE_RELOCATION *) RelocEnd;\r
   }\r
 \r
+  //\r
+  // Adjust the EntryPoint to match the linked-to address\r
+  //\r
+  if (ImageContext->DestinationAddress != 0) {\r
+     ImageContext->EntryPoint -= (UINT64) ImageContext->ImageAddress;\r
+     ImageContext->EntryPoint += (UINT64) ImageContext->DestinationAddress;\r
+  }\r
   return RETURN_SUCCESS;\r
 }\r
 \r
@@ -1279,7 +1286,7 @@ PeCoffLoaderRelocateImageForRuntime (
 \r
       case EFI_IMAGE_REL_BASED_HIGHADJ:\r
         //\r
-        // Not implemented, but not used in EFI 1.0\r
+        // Not implemented, but not used in UEFI 2.0\r
         //\r
         ASSERT (FALSE);\r
         break;\r
@@ -1331,3 +1338,23 @@ PeCoffLoaderImageReadFromMemory (
   return RETURN_SUCCESS;\r
 }\r
 \r
+/**\r
+  Unloads a loaded PE/COFF image from memory and releases its taken resource.\r
+   \r
+  For NT32 emulator, the PE/COFF image loaded by system needs to release.\r
+  For real platform, the PE/COFF image loaded by Core doesn't needs to be unloaded, \r
+  this function can simply return RETURN_SUCCESS.\r
+\r
+  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF\r
+                                    image to be unloaded.\r
+\r
+  @retval RETURN_SUCCESS            The PE/COFF image was unloaded successfully.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderUnloadImage (\r
+  IN PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
+{\r
+  return RETURN_SUCCESS;\r
+}\r