> This turns off CONFIG_NEEDS_MANUAL_RELOC and turns on -pie.
> 
> The bss part of the linker script is changed to be more like arm32,
> as the previous arm64 approach was generating bad relocations (even
> readelf didn't like them).
> 
> relocate_64.S is made to look more like relocate.S, and then changed to
> support RELA style relocations rather than REL.
> 
> Signed-off-by: Scott Wood <scottw...@freescale.com>
> ---
>  arch/arm/config.mk                |  2 --
>  arch/arm/cpu/armv8/config.mk      |  1 -
>  arch/arm/cpu/armv8/u-boot.lds     | 32 +++++++++++++++++++++++-------
>  arch/arm/include/asm/config.h     |  5 -----
>  arch/arm/lib/crt0_64.S            |  7 ++-----
>  arch/arm/lib/relocate_64.S        | 41 
> ++++++++++++++++++++-------------------
>  include/configs/vexpress_aemv8a.h |  3 +++
>  7 files changed, 51 insertions(+), 40 deletions(-)
> 
> diff --git a/arch/arm/config.mk b/arch/arm/config.mk
> index 95c07ad..96d2d88 100644
> --- a/arch/arm/config.mk
> +++ b/arch/arm/config.mk
> @@ -74,9 +74,7 @@ endif
>  endif
>  
>  # needed for relocation
> -ifndef CONFIG_ARM64
>  LDFLAGS_u-boot += -pie
> -endif
>  
>  #
>  # FIXME: binutils versions < 2.22 have a bug in the assembler where
> diff --git a/arch/arm/cpu/armv8/config.mk b/arch/arm/cpu/armv8/config.mk
> index 9f36d59..027a68c 100644
> --- a/arch/arm/cpu/armv8/config.mk
> +++ b/arch/arm/cpu/armv8/config.mk
> @@ -13,4 +13,3 @@ PLATFORM_NO_UNALIGNED := $(PF_NO_UNALIGNED)
>  PF_CPPFLAGS_ARMV8 := $(call cc-option, -march=armv8-a)
>  PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_ARMV8)
>  PLATFORM_CPPFLAGS += $(PF_NO_UNALIGNED)
> -PLATFORM_CPPFLAGS += -fpic
> diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> index 328d477..4c12222 100644
> --- a/arch/arm/cpu/armv8/u-boot.lds
> +++ b/arch/arm/cpu/armv8/u-boot.lds
> @@ -41,25 +41,43 @@ SECTIONS
>       }
>  
>       . = ALIGN(8);
> -     .reloc : {
> -             __rel_got_start = .;
> -             *(.got)
> -             __rel_got_end = .;
> -     }
>  
>       .image_copy_end :
>       {
>               *(.__image_copy_end)
>       }
>  
> +     . = ALIGN(8);
> +
> +     .rel_dyn_start :
> +     {
> +             *(.__rel_dyn_start)
> +     }
> +
> +     .rela.dyn : {
> +             *(.rela*)
> +     }
> +
> +     .rel_dyn_end :
> +     {
> +             *(.__rel_dyn_end)
> +     }
> +
>       _end = .;
>  
>       . = ALIGN(8);
> +
> +     .bss_start : {
> +             KEEP(*(.__bss_start));
> +     }
> +
>       .bss : {
> -             __bss_start = .;
>               *(.bss*)
>                . = ALIGN(8);
> -             __bss_end = .;
> +     }
> +
> +     .bss_end : {
> +             KEEP(*(.__bss_end));
>       }
>  
>       /DISCARD/ : { *(.dynsym) }
> diff --git a/arch/arm/include/asm/config.h b/arch/arm/include/asm/config.h
> index 0ee131d..de4d01e 100644
> --- a/arch/arm/include/asm/config.h
> +++ b/arch/arm/include/asm/config.h
> @@ -11,11 +11,6 @@
>  #define CONFIG_SYS_BOOT_RAMDISK_HIGH
>  
>  #ifdef CONFIG_ARM64
> -/*
> - * Currently, GOT is used to relocate u-boot and
> - * configuration CONFIG_NEEDS_MANUAL_RELOC is needed.
> - */
> -#define CONFIG_NEEDS_MANUAL_RELOC
>  #define CONFIG_PHYS_64BIT
>  #endif
>  
> diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S
> index ddd46eb..7756396 100644
> --- a/arch/arm/lib/crt0_64.S
> +++ b/arch/arm/lib/crt0_64.S
> @@ -94,11 +94,8 @@ relocation_return:
>  /*
>   * Clear BSS section
>   */
> -     ldr     x9, [x18, #GD_RELOC_OFF]        /* x9 <- gd->reloc_off */
> -     ldr     x0, =__bss_start
> -     add     x0, x0, x9                      /* x0 <- __bss_start in RAM */
> -     ldr     x1, =__bss_end
> -     add     x1, x1, x9                      /* x1 <- __bss_end in RAM */
> +     ldr     x0, =__bss_start                /* this is auto-relocated! */
> +     ldr     x1, =__bss_end                  /* this is auto-relocated! */
>       mov     x2, #0
>  clear_loop:
>       str     x2, [x0]
> diff --git a/arch/arm/lib/relocate_64.S b/arch/arm/lib/relocate_64.S
> index 29c3239..7fba9e2 100644
> --- a/arch/arm/lib/relocate_64.S
> +++ b/arch/arm/lib/relocate_64.S
> @@ -16,40 +16,41 @@
>   * void relocate_code (addr_moni)
>   *
>   * This function relocates the monitor code.
> - *
> - * NOTE:
> - * GOT is used and configuration CONFIG_NEEDS_MANUAL_RELOC is needed.
> + * x0 holds the destination address.
>   */
>  ENTRY(relocate_code)
>       /*
>        * Copy u-boot from flash to RAM
>        */
> -     ldr     x1, =__image_copy_start /* x1 <- copy source */
> -     cmp     x1, x0
> +     ldr     x1, =__image_copy_start /* x1 <- SRC &__image_copy_start */
> +     subs    x9, x0, x1              /* x9 <- relocation offset */
>       b.eq    relocate_done           /* skip relocation */
> -     mov     x2, x0                  /* x2 <- copy destination */
> -     ldr     x3, =__image_copy_end   /* x3 <- source end address */
> +     ldr     x2, =__image_copy_end   /* x2 <- SRC &__image_copy_end */
>  
>  copy_loop:
>       ldp     x10, x11, [x1], #16     /* copy from source address [x1] */
> -     stp     x10, x11, [x2], #16     /* copy to   target address [x2] */
> -     cmp     x1, x3                  /* until source end address [x3] */
> +     stp     x10, x11, [x0], #16     /* copy to   target address [x0] */
> +     cmp     x1, x2                  /* until source end address [x2] */
>       b.lo    copy_loop
>  
>       /*
> -      * Fix .reloc relocations
> +      * Fix .rela.dyn relocations
>        */
> -     ldr     x9, [x18, #GD_RELOC_OFF]/* x9 <- relocation offset */
> -     ldr     x1, =__rel_got_start    /* x1 <- rel got start ofs */
> -     add     x1, x1, x9              /* x1 <- rel got start in RAM */
> -     ldr     x2, =__rel_got_end      /* x2 <- rel got end ofs */
> -     add     x2, x2, x9              /* x2 <- rel got end in RAM */
> +     ldr     x2, =__rel_dyn_start    /* x2 <- SRC &__rel_dyn_start */
> +     ldr     x3, =__rel_dyn_end      /* x3 <- SRC &__rel_dyn_end */
>  fixloop:
> -     ldr     x10, [x1]
> -     add     x10, x10, x9            /* x10 <- address to be fixed up */
> -     str     x10, [x1]
> -     add     x1, x1, #8              /* each got entry is 8 bytes */
> -     cmp     x1, x2
> +     ldp     x0, x1, [x2], #16       /* (x0,x1) <- (SRC location, fixup) */
> +     ldr     x4, [x2], #8            /* x4 <- addend */
> +     and     x1, x1, #0xffffffff
> +     cmp     x1, #1027               /* relative fixup? */
> +     bne     fixnext
> +
> +     /* relative fix: store addend plus offset at dest location */
> +     add     x0, x0, x9
> +     add     x4, x4, x9
> +     str     x4, [x0]
> +fixnext:
> +     cmp     x2, x3
>       b.lo    fixloop
>  
>  relocate_done:
> diff --git a/include/configs/vexpress_aemv8a.h 
> b/include/configs/vexpress_aemv8a.h
> index 01c95f5..3932e00 100644
> --- a/include/configs/vexpress_aemv8a.h
> +++ b/include/configs/vexpress_aemv8a.h
> @@ -10,6 +10,9 @@
>  
>  #define DEBUG
>  
> +#define CONFIG_REMAKE_ELF
> +#define CONFIG_STATIC_RELA
> +
CONFIG_STATIC_RELA is always needed, How about remove this macro.

David,





_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to