diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2016-02-12 10:06:58 +0100 |
---|---|---|
committer | Hao Wu <hao.a.wu@intel.com> | 2016-02-24 15:31:30 +0800 |
commit | 420b02b4afce5622c239610681842912b3433964 (patch) | |
tree | db2a4a004426b3b6b67b81177bb14fe1f7733a84 /BaseTools/Source/C | |
parent | 4e564c27c424bd15e6fa1844727e54d6f67e5a74 (diff) | |
download | edk2-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/Source/C')
-rw-r--r-- | BaseTools/Source/C/GenFw/Elf64Convert.c | 22 |
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:
|