>
> CoffAddFixup() must be used for absolute symbol references only. These
> instructions contain relative symbol references, which are
> recalculated in WriteSections64().
>
> The only absolute symbol reference is the GOT entry for 'n', and your
> code (in WriteRelocations64()) calculates the address of the GOT entry
> (which is always in .text BTW) and adds a fixup for it, i.e.,
>
> + CoffAddFixup(
> + (UINT32)(UINTN)((UINT64)
> mCoffSectionsOffset[RelShdr->sh_info] + GoTPcRelPtrOffset),
> + EFI_IMAGE_REL_BASED_DIR64);
>
> This code adds a fixup to the PE/COFF .reloc section for the GOT entry
> containing the address of 'n', and the instructions perform a IP
> relative load of the contents of the GOT entry to retrieve the address
> of 'n'.
>
> By adding two fixups, the PE/COFF loader will apply the load offset
> twice, resulting in an incorrect value.
>
OK, I get your point now. Yes, the current patch could generate multiple fixups
for the same GOT relocation entry. How about we introduce a simple
IsDuplicatedCoffFixup() to check whether a converting fixup offset is
duplicated before we use CoffAddFixup() to really add it? If it is new, we add
it, otherwise just skip it.
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel