Patchwork [19/29,AARCH64] Add ILP32 support to elf_machine_load_address.

login
register
mail settings
Submitter Andrew Pinski
Date Oct. 27, 2014, 7:59 a.m.
Message ID <1414396793-9005-20-git-send-email-apinski@cavium.com>
Download mbox | patch
Permalink /patch/3419/
State New
Headers show

Comments

Andrew Pinski - Oct. 27, 2014, 7:59 a.m.
This adds ILP32 support to elf_machine_load_address.
Since elf_machine_load_address depends on the static address being
found without relocations, we need to use 16bit relocation which gets
resolved at link time for ILP32.  This is just like how the 32bit
relocation gets resolved at link time for LP64.

* sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Add support
for ILP32.
---
 sysdeps/aarch64/dl-machine.h |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)
Will Newton - Nov. 18, 2014, 1:55 p.m.
On 27 October 2014 07:59, Andrew Pinski <apinski@cavium.com> wrote:
> This adds ILP32 support to elf_machine_load_address.
> Since elf_machine_load_address depends on the static address being
> found without relocations, we need to use 16bit relocation which gets
> resolved at link time for ILP32.  This is just like how the 32bit
> relocation gets resolved at link time for LP64.
>
> * sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Add support
> for ILP32.
> ---
>  sysdeps/aarch64/dl-machine.h |   20 +++++++++++++++++---
>  1 files changed, 17 insertions(+), 3 deletions(-)

Looks ok to me.

> diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
> index 121b178..f3bcad1 100644
> --- a/sysdeps/aarch64/dl-machine.h
> +++ b/sysdeps/aarch64/dl-machine.h
> @@ -54,19 +54,33 @@ elf_machine_load_address (void)
>       by constructing a non GOT reference to the symbol, the dynamic
>       address of the symbol we compute using adrp/add to compute the
>       symbol's address relative to the PC.
> -     This depends on 32bit relocations being resolved at link time
> -     and that the static address fits in the 32bits.  */
> +     This depends on 32/16bit relocations being resolved at link time
> +     and that the static address fits in the 32/16 bits.  */
>
>    ElfW(Addr) static_addr;
>    ElfW(Addr) dynamic_addr;
>
>    asm ("                                       \n"
>  "      adrp    %1, _dl_start;                  \n"
> +#ifdef __LP64__
>  "       add    %1, %1, #:lo12:_dl_start        \n"
> -"       ldr    %w0, 1f                         \n"
> +#else
> +"      add     %w1, %w1, #:lo12:_dl_start       \n"
> +#endif
> +"      ldr     %w0, 1f                         \n"
>  "      b       2f                              \n"
>  "1:                                            \n"
> +#ifdef __LP64__
>  "      .word   _dl_start                       \n"
> +#else
> +# ifdef __AARCH64EB__
> +"      .short  0                               \n"
> +# endif
> +"      .short  _dl_start                       \n"
> +# ifndef __AARCH64EB__
> +"      .short  0                               \n"
> +# endif
> +#endif
>  "2:                                            \n"
>      : "=r" (static_addr),  "=r" (dynamic_addr));
>    return dynamic_addr - static_addr;
> --
> 1.7.2.5
>

Patch

diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
index 121b178..f3bcad1 100644
--- a/sysdeps/aarch64/dl-machine.h
+++ b/sysdeps/aarch64/dl-machine.h
@@ -54,19 +54,33 @@  elf_machine_load_address (void)
      by constructing a non GOT reference to the symbol, the dynamic
      address of the symbol we compute using adrp/add to compute the
      symbol's address relative to the PC.
-     This depends on 32bit relocations being resolved at link time
-     and that the static address fits in the 32bits.  */
+     This depends on 32/16bit relocations being resolved at link time
+     and that the static address fits in the 32/16 bits.  */
 
   ElfW(Addr) static_addr;
   ElfW(Addr) dynamic_addr;
 
   asm ("					\n"
 "	adrp	%1, _dl_start;			\n"
+#ifdef __LP64__
 "       add	%1, %1, #:lo12:_dl_start        \n"
-"       ldr	%w0, 1f				\n"
+#else
+"	add	%w1, %w1, #:lo12:_dl_start       \n"
+#endif
+"	ldr	%w0, 1f				\n"
 "	b	2f				\n"
 "1:						\n"
+#ifdef __LP64__
 "	.word	_dl_start			\n"
+#else
+# ifdef __AARCH64EB__
+"	.short  0                               \n"
+# endif
+"	.short  _dl_start                       \n"
+# ifndef __AARCH64EB__
+"	.short  0                               \n"
+# endif
+#endif
 "2:						\n"
     : "=r" (static_addr),  "=r" (dynamic_addr));
   return dynamic_addr - static_addr;