This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 19/29] [AARCH64] Add ILP32 support to elf_machine_load_address.


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
>



-- 
Will Newton
Toolchain Working Group, Linaro


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]