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 <[email protected]>
---
 BaseTools/Source/C/GenFw/Elf64Convert.c | 22 +++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c 
b/BaseTools/Source/C/GenFw/Elf64Convert.c
index 90d80a22daf2..fb85b3821b38 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:
-- 
2.5.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to