From 87280982b803cebd4b47980ec09eaa45a13d7676 Mon Sep 17 00:00:00 2001 From: Harry Liebel Date: Mon, 4 Aug 2014 08:44:11 +0000 Subject: [PATCH] BaseTools: Add AArch64 ADR_PREL_LO21 and R_AARCH64_CONDBR19 relocations - ADR_PREL_LO21: support for loading a PC relative label offset. - R_AARCH64_CONDBR19: support for conditional branch instruction (ELF64 code: 280). Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Harry Liebel Signed-off-by: Olivier Martin Reviewed-by: Yingke Liu git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15745 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/C/GenFw/Elf64Convert.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index 606c7284f7..3f9a11a4bc 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -1,7 +1,7 @@ /** @file Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
-Portions copyright (c) 2013, ARM Ltd. All rights reserved.
+Portions copyright (c) 2013-2014, ARM Ltd. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this @@ -690,6 +690,18 @@ WriteSections64 ( switch (ELF_R_TYPE(Rel->r_info)) { + case R_AARCH64_ADR_PREL_LO21: + if (Rel->r_addend != 0 ) { /* TODO */ + Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_ADR_PREL_LO21 Need to fixup with addend!."); + } + break; + + case R_AARCH64_CONDBR19: + if (Rel->r_addend != 0 ) { /* TODO */ + Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_CONDBR19 Need to fixup with addend!."); + } + break; + case R_AARCH64_LD_PREL_LO19: if (Rel->r_addend != 0 ) { /* TODO */ Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_LD_PREL_LO19 Need to fixup with addend!."); @@ -784,6 +796,12 @@ WriteRelocations64 ( } else if (mEhdr->e_machine == EM_AARCH64) { // AArch64 GCC uses RELA relocation, so all relocations has to be fixed up. ARM32 uses REL. 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; -- 2.39.2