]> git.proxmox.com Git - mirror_edk2.git/commit
BaseTools X64: fold PLT relocations into simple relative references
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 4 Aug 2016 08:39:29 +0000 (10:39 +0200)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 8 Aug 2016 06:26:41 +0000 (08:26 +0200)
commitc9f297559be5fd60aefda24b18e77a4208c8dede
treec4676cdcd8b52079c62723ee12b9d3a7b60a8dbe
parent74bbe31b8d485da26ec7ffad5e78b8384a9eb9a5
BaseTools X64: fold PLT relocations into simple relative references

For X64/GCC, we use position independent code with hidden visibility
to inform the compiler that symbol references are never resolved at
runtime, which removes the need for PLTs and GOTs. However, in some
cases, GCC has been reported to still emit PLT based relocations, which
we need to handle in the ELF to PE/COFF perform by GenFw.

Unlike GOT based relocations, which are non-trivial to handle since the
indirections in the code can not be fixed up easily (although relocation
types exist for X64 that annotate relocation targets as suitable for
relaxation), PLT relocations simply point to jump targets, and we can
relax such relocations by resolving them using the symbol directly rather
than via a PLT entry that does nothing more than tail call the function
we already know it is going to call (since all symbol references are
resolved in the same module).

So handle R_X86_64_PLT32 as a R_X86_64_PC32 relocation.

Suggested-by: Steven Shi <steven.shi@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/C/GenFw/Elf64Convert.c