From: "Carlos O'Donell" <carlos@redhat.com>
To: Will Newton <will.newton@linaro.org>, libc-ports@sourceware.org
Cc: Patch Tracking <patches@linaro.org>
Subject: Re: [PATCH] aarch64: Enable ifunc support.
Date: Tue, 26 Nov 2013 15:41:00 -0000 [thread overview]
Message-ID: <5294BD18.40507@redhat.com> (raw)
In-Reply-To: <5294628E.30507@linaro.org>
On 11/26/2013 03:57 AM, Will Newton wrote:
>
> Add support for handling the R_AARCH64_IRELATIVE relocation and
> STT_GNU_IFUNC symbols to the aarch64 port.
How did you test this?
> ports/ChangeLog.aarch64:
>
> 2013-11-25 Will Newton <will.newton@linaro.org>
>
> * sysdeps/aarch64/dl-irel.h: Include ldsodefs.h.
> (ELF_MACHINE_IRELA): Define. (elf_ifunc_invoke): Pass
> hwcap to ifunc resolver function. (elf_irela): New function.
> * sysdeps/aarch64/dl-machine.h: Include dl-irel.h.
> (elf_machine_rela) Handle STT_GNU_IFUNC symbols and
> R_AARCH64_IRELATIVE relocations. (elf_machine_lazy_rel):
> Handle R_AARCH64_IRELATIVE relocations.
> ---
> ports/sysdeps/aarch64/dl-irel.h | 22 +++++++++++++++++++---
> ports/sysdeps/aarch64/dl-machine.h | 20 ++++++++++++++++++++
> 2 files changed, 39 insertions(+), 3 deletions(-)
>
> diff --git a/ports/sysdeps/aarch64/dl-irel.h b/ports/sysdeps/aarch64/dl-irel.h
> index 1a3811e..f37ee39 100644
> --- a/ports/sysdeps/aarch64/dl-irel.h
> +++ b/ports/sysdeps/aarch64/dl-irel.h
> @@ -22,15 +22,31 @@
>
> #include <stdio.h>
> #include <unistd.h>
> +#include <ldsodefs.h>
>
> -/* AArch64 does not yet implement IFUNC support. However since
> - 2011-06-20 provision of a elf_ifunc_invoke has been mandatory. */
> +#define ELF_MACHINE_IRELA 1
OK.
>
> static inline ElfW(Addr)
> __attribute ((always_inline))
> elf_ifunc_invoke (ElfW(Addr) addr)
> {
> - return ((ElfW(Addr) (*) (void)) (addr)) ();
> + return ((ElfW(Addr) (*) (unsigned long int)) (addr)) (GLRO(dl_hwcap));
OK.
> +}
> +
> +static inline void
> +__attribute ((always_inline))
> +elf_irela (const ElfW(Rela) *reloc)
> +{
> + ElfW(Addr) *const reloc_addr = (void *) reloc->r_offset;
> + const unsigned long int r_type = ELFW(R_TYPE) (reloc->r_info);
> +
> + if (__glibc_likely (r_type == R_AARCH64_IRELATIVE))
> + {
> + ElfW(Addr) value = elf_ifunc_invoke (reloc->r_addend);
> + *reloc_addr = value;
> + }
> + else
> + __libc_fatal ("unexpected reloc type in static binary");
> }
OK.
>
> #endif
> diff --git a/ports/sysdeps/aarch64/dl-machine.h b/ports/sysdeps/aarch64/dl-machine.h
> index 71dd6b3..01a214f 100644
> --- a/ports/sysdeps/aarch64/dl-machine.h
> +++ b/ports/sysdeps/aarch64/dl-machine.h
> @@ -23,6 +23,7 @@
>
> #include <tls.h>
> #include <dl-tlsdesc.h>
> +#include <dl-irel.h>
>
> /* Return nonzero iff ELF header is compatible with the running host. */
> static inline int __attribute__ ((unused))
> @@ -243,6 +244,12 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
> struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
> ElfW(Addr) value = sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value;
>
> + if (sym != NULL
> + && __glibc_unlikely (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC)
> + && __glibc_likely (sym->st_shndx != SHN_UNDEF)
> + && __glibc_likely (!skip_ifunc))
> + value = elf_ifunc_invoke (value);
OK.
> +
> switch (r_type)
> {
> case R_AARCH64_COPY:
> @@ -331,6 +338,12 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
> }
> break;
>
> + case R_AARCH64_IRELATIVE:
> + value = map->l_addr + reloc->r_addend;
> + value = elf_ifunc_invoke (value);
> + *reloc_addr = value;
> + break;
OK.
> +
> default:
> _dl_reloc_bad_type (map, r_type, 0);
> break;
> @@ -374,6 +387,13 @@ elf_machine_lazy_rel (struct link_map *map,
> td->entry = (void*)(D_PTR (map, l_info[ADDRIDX (DT_TLSDESC_PLT)])
> + map->l_addr);
> }
> + else if (__glibc_unlikely (r_type == R_AARCH64_IRELATIVE))
> + {
> + ElfW(Addr) value = map->l_addr + reloc->r_addend;
> + if (__glibc_likely (!skip_ifunc))
> + value = elf_ifunc_invoke (value);
> + *reloc_addr = value;
OK.
> + }
> else
> _dl_reloc_bad_type (map, r_type, 1);
> }
>
Looks good to me as long as your testing makes sense.
Cheers,
Carlos.
next prev parent reply other threads:[~2013-11-26 15:24 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-26 11:14 Will Newton
2013-11-26 15:05 ` Marcus Shawcroft
2013-11-26 15:08 ` Will Newton
2013-11-26 15:17 ` Marcus Shawcroft
2013-11-26 15:19 ` Carlos O'Donell
2013-11-26 15:24 ` Carlos O'Donell
2013-11-26 15:41 ` Carlos O'Donell [this message]
2013-11-26 16:21 ` Will Newton
2013-11-26 16:37 ` Carlos O'Donell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5294BD18.40507@redhat.com \
--to=carlos@redhat.com \
--cc=libc-ports@sourceware.org \
--cc=patches@linaro.org \
--cc=will.newton@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).