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
//\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
// 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
}\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
//\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