This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 19/29] [AARCH64] Add ILP32 support to elf_machine_load_address.
- From: Will Newton <will dot newton at linaro dot org>
- To: Andrew Pinski <apinski at cavium dot com>
- Cc: libc-alpha <libc-alpha at sourceware dot org>
- Date: Tue, 18 Nov 2014 13:55:59 +0000
- Subject: Re: [PATCH 19/29] [AARCH64] Add ILP32 support to elf_machine_load_address.
- Authentication-results: sourceware.org; auth=none
- References: <1414396793-9005-1-git-send-email-apinski at cavium dot com> <1414396793-9005-20-git-send-email-apinski at cavium dot com>
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