summaryrefslogtreecommitdiff
path: root/BaseTools
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2016-02-12 10:06:58 +0100
committerHao Wu <hao.a.wu@intel.com>2016-02-24 15:31:30 +0800
commit420b02b4afce5622c239610681842912b3433964 (patch)
treedb2a4a004426b3b6b67b81177bb14fe1f7733a84 /BaseTools
parent4e564c27c424bd15e6fa1844727e54d6f67e5a74 (diff)
downloadedk2-platforms-420b02b4afce5622c239610681842912b3433964.tar.xz
BaseTools/GenFw AARCH64: add support for relative data relocations
This adds support to the ELF to PE/COFF conversion performed by GenFw for the AArch64 ELF relocation types R_AARCH64_PREL64, R_AARCH64_PREL32 and R_AARCH64_PREL16. Since we already require the ELF and PE/COFF section layouts to be identical in order to support other relative relocation types, this is simply a matter of whitelisting these new relocation types in the same way. While we're at it, clean up the code a bit, and add a comment explaining why these relocations are ignored in WriteRelocations64 (). Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> Reviewed-by: Liming Gao <liming.gao@intel.com> (cherry picked from commit 0b6249f5902f85a9c1a438878b27f8d7ef960a41)
Diffstat (limited to 'BaseTools')
-rw-r--r--BaseTools/Source/C/GenFw/Elf64Convert.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c
index 90d80a22da..fb85b3821b 100644
--- a/BaseTools/Source/C/GenFw/Elf64Convert.c
+++ b/BaseTools/Source/C/GenFw/Elf64Convert.c
@@ -767,6 +767,9 @@ WriteSections64 (
case R_AARCH64_LD_PREL_LO19:
case R_AARCH64_CALL26:
case R_AARCH64_JUMP26:
+ case R_AARCH64_PREL64:
+ case R_AARCH64_PREL32:
+ case R_AARCH64_PREL16:
//
// The GCC toolchains (i.e., binutils) may corrupt section relative
// relocations when emitting relocation sections into fully linked
@@ -855,20 +858,13 @@ WriteRelocations64 (
switch (ELF_R_TYPE(Rel->r_info)) {
case R_AARCH64_ADR_PREL_LO21:
- break;
-
case R_AARCH64_CONDBR19:
- break;
-
case R_AARCH64_LD_PREL_LO19:
- break;
-
case R_AARCH64_CALL26:
- break;
-
case R_AARCH64_JUMP26:
- break;
-
+ case R_AARCH64_PREL64:
+ case R_AARCH64_PREL32:
+ case R_AARCH64_PREL16:
case R_AARCH64_ADR_PREL_PG_HI21:
case R_AARCH64_ADD_ABS_LO12_NC:
case R_AARCH64_LDST8_ABS_LO12_NC:
@@ -876,6 +872,12 @@ WriteRelocations64 (
case R_AARCH64_LDST32_ABS_LO12_NC:
case R_AARCH64_LDST64_ABS_LO12_NC:
case R_AARCH64_LDST128_ABS_LO12_NC:
+ //
+ // No fixups are required for relative relocations, provided that
+ // the relative offsets between sections have been preserved in
+ // the ELF to PE/COFF conversion. We have already asserted that
+ // this is the case in WriteSections64 ().
+ //
break;
case R_AARCH64_ABS64: