]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiPayloadPkg/PayloadLoaderPeim/ElfLib/Elf64Lib.c
UefiPayloadPkg/PayloadLoader: Fix bug in locating relocation section
[mirror_edk2.git] / UefiPayloadPkg / PayloadLoaderPeim / ElfLib / Elf64Lib.c
index e364807007e7a8d8ac79fee2d94723e945f587d2..3f4f12903cec39c1e4e0e261b302deea5b9ade35 100644 (file)
@@ -215,7 +215,7 @@ RelocateElf64Dynamic (
   Elf64_Shdr                   *DynShdr;\r
   Elf64_Shdr                   *RelShdr;\r
   Elf64_Dyn                    *Dyn;\r
-  UINT64                       RelaOffset;\r
+  UINT64                       RelaAddress;\r
   UINT64                       RelaCount;\r
   UINT64                       RelaSize;\r
   UINT64                       RelaEntrySize;\r
@@ -255,7 +255,7 @@ RelocateElf64Dynamic (
   //\r
   // 2. Locate the relocation section from the dynamic section.\r
   //\r
-  RelaOffset    = MAX_UINT64;\r
+  RelaAddress    = MAX_UINT64;\r
   RelaSize      = 0;\r
   RelaCount     = 0;\r
   RelaEntrySize = 0;\r
@@ -274,8 +274,8 @@ RelocateElf64Dynamic (
         // based on the original file value and the memory base address.\r
         // For consistency, files do not contain relocation entries to ``correct'' addresses in the dynamic structure.\r
         //\r
-        RelaOffset = Dyn->d_un.d_ptr - (UINTN) ElfCt->PreferredImageAddress;\r
-        RelaType   = (Dyn->d_tag == DT_RELA) ? SHT_RELA: SHT_REL;\r
+        RelaAddress = Dyn->d_un.d_ptr;\r
+        RelaType    = (Dyn->d_tag == DT_RELA) ? SHT_RELA: SHT_REL;\r
         break;\r
       case DT_RELACOUNT:\r
       case DT_RELCOUNT:\r
@@ -294,7 +294,7 @@ RelocateElf64Dynamic (
     }\r
   }\r
 \r
-  if (RelaOffset == MAX_UINT64) {\r
+  if (RelaAddress == MAX_UINT64) {\r
     ASSERT (RelaCount     == 0);\r
     ASSERT (RelaEntrySize == 0);\r
     ASSERT (RelaSize      == 0);\r
@@ -307,8 +307,16 @@ RelocateElf64Dynamic (
   //\r
   // Verify the existence of the relocation section.\r
   //\r
-  RelShdr = GetElf64SectionByRange (ElfCt->FileBase, RelaOffset, RelaSize);\r
-  ASSERT (RelShdr != NULL);\r
+  RelShdr = NULL;\r
+  for (Index = 0; Index < ElfCt->ShNum; Index++) {\r
+    RelShdr = GetElf64SectionByIndex (ElfCt->FileBase, Index);\r
+    ASSERT (RelShdr != NULL);\r
+    if ((RelShdr->sh_addr == RelaAddress) && (RelShdr->sh_size == RelaSize)) {\r
+      break;\r
+    }\r
+    RelShdr = NULL;\r
+  }\r
+\r
   if (RelShdr == NULL) {\r
     return EFI_UNSUPPORTED;\r
   }\r