public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] riscv: add support for GNU indirect function
@ 2020-12-15  9:16 Vincent Chen
  2020-12-15  9:16 ` [PATCH v2 1/2] riscv: support " Vincent Chen
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Vincent Chen @ 2020-12-15  9:16 UTC (permalink / raw)
  To: libc-alpha, palmer, darius, dj
  Cc: nelson.chu, jimw, paul.walmsley, Vincent Chen

The riscv Binutils supported GNU indirect function in the commit 
02dd9d25. To make the entire mechanism work, these patches adds the
required ports to enable Glibc to address the IRELATIVE relocation.

Because the dynamic linker resolves the IRELATIVE relocation before
jumping into the executable program, the $gp register is not initialized
when executing the IFUNC resolver function. It may cause some unexpected
error to occur when the dynamic loader resolves the IREALTIVE relocation
of the position-dependent executable program. To solve this issue, the
second patch enables dynamic linker to look for the __global_pointer$
symbol and use it to initialize $gp before resolving the IREALTIVE
relocation of the PDE program.


Changes since v1:
1. Move the riscv entry to the end of libc-abis file
2. Add the second input argument to IFUNC resolver to preserve the
   extension flexibility
3. Enable ld.so to initilize $gp by __global_pointer$ symbol instead
   of the DT_RISCV_GP dynamic entry to avoid to modify the riscv ELF
   psABI specification.


Vincent Chen (2):
  riscv: support GNU indirect function
  riscv: Initialize $gp before resolving the IRELATIVE relocation

 libc-abis                  |  1 +
 sysdeps/riscv/dl-irel.h    | 56 ++++++++++++++++++++++++++++++++++++++
 sysdeps/riscv/dl-machine.h | 44 +++++++++++++++++++++++++++++-
 3 files changed, 100 insertions(+), 1 deletion(-)
 create mode 100644 sysdeps/riscv/dl-irel.h

-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 1/2] riscv: support GNU indirect function
  2020-12-15  9:16 [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
@ 2020-12-15  9:16 ` Vincent Chen
  2020-12-15  9:16 ` [PATCH v2 2/2] riscv: Initialize $gp before resolving the IRELATIVE relocation Vincent Chen
  2021-01-04  1:38 ` [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
  2 siblings, 0 replies; 10+ messages in thread
From: Vincent Chen @ 2020-12-15  9:16 UTC (permalink / raw)
  To: libc-alpha, palmer, darius, dj
  Cc: nelson.chu, jimw, paul.walmsley, Vincent Chen

Enable riscv glibc to support GNU indirect function
---
 libc-abis                  |  1 +
 sysdeps/riscv/dl-irel.h    | 56 ++++++++++++++++++++++++++++++++++++++
 sysdeps/riscv/dl-machine.h | 22 +++++++++++++++
 3 files changed, 79 insertions(+)
 create mode 100644 sysdeps/riscv/dl-irel.h

diff --git a/libc-abis b/libc-abis
index e702f6ae24..70b154de4b 100644
--- a/libc-abis
+++ b/libc-abis
@@ -48,3 +48,4 @@ IFUNC		sparc64-*-linux*
 IFUNC		sparc-*-linux*
 # Absolute (SHN_ABS) symbols working correctly.
 ABSOLUTE
+IFUNC		riscv*-linux*
diff --git a/sysdeps/riscv/dl-irel.h b/sysdeps/riscv/dl-irel.h
new file mode 100644
index 0000000000..cad9cc87b1
--- /dev/null
+++ b/sysdeps/riscv/dl-irel.h
@@ -0,0 +1,56 @@
+/* Machine-dependent ELF indirect relocation inline functions.
+   RISC-V version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _DL_IREL_H
+#define _DL_IREL_H
+
+#include <stdio.h>
+#include <unistd.h>
+#include <ldsodefs.h>
+#include <sysdep.h>
+
+#define ELF_MACHINE_IRELA	1
+
+static inline ElfW(Addr)
+__attribute ((always_inline))
+elf_ifunc_invoke (ElfW(Addr) addr)
+{
+  /* The second argument is a void pointer to preserve the extension
+     fexibility.  */
+  return ((ElfW(Addr) (*) (uint64_t, void *)) (addr))
+	 (GLRO(dl_hwcap), NULL);
+}
+
+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_RISCV_IRELATIVE))
+    {
+      ElfW(Addr) value = elf_ifunc_invoke (reloc->r_addend);
+      *reloc_addr = value;
+    }
+  else
+    __libc_fatal ("Unexpected reloc type in static binary.\n");
+}
+
+#endif
diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
index 511140864e..0ae45dd0c3 100644
--- a/sysdeps/riscv/dl-machine.h
+++ b/sysdeps/riscv/dl-machine.h
@@ -25,6 +25,7 @@
 #include <elf/elf.h>
 #include <sys/asm.h>
 #include <dl-tls.h>
+#include <dl-irel.h>
 
 #ifndef _RTLD_PROLOGUE
 # define _RTLD_PROLOGUE(entry)						\
@@ -176,6 +177,13 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
   if (sym_map != NULL)
     value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
 
+  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);
+
+
   switch (r_type)
     {
 #ifndef RTLD_BOOTSTRAP
@@ -251,6 +259,13 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
     }
 #endif
 
+    case R_RISCV_IRELATIVE:
+      value = map->l_addr + reloc->r_addend;
+      if (__glibc_likely (!skip_ifunc))
+        value = elf_ifunc_invoke (value);
+      *addr_field = value;
+      break;
+
     case R_RISCV_JUMP_SLOT:
     case __WORDSIZE == 64 ? R_RISCV_64 : R_RISCV_32:
       *addr_field = value;
@@ -292,6 +307,13 @@ elf_machine_lazy_rel (struct link_map *map, ElfW(Addr) l_addr,
       else
 	*reloc_addr = map->l_mach.plt;
     }
+  else if (__glibc_unlikely (r_type == R_RISCV_IRELATIVE))
+    {
+      ElfW(Addr) value = map->l_addr + reloc->r_addend;
+      if (__glibc_likely (!skip_ifunc))
+        value = elf_ifunc_invoke (value);
+      *reloc_addr = value;
+    }
   else
     _dl_reloc_bad_type (map, r_type, 1);
 }
-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 2/2] riscv: Initialize $gp before resolving the IRELATIVE relocation
  2020-12-15  9:16 [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
  2020-12-15  9:16 ` [PATCH v2 1/2] riscv: support " Vincent Chen
@ 2020-12-15  9:16 ` Vincent Chen
  2021-01-04  1:38 ` [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
  2 siblings, 0 replies; 10+ messages in thread
From: Vincent Chen @ 2020-12-15  9:16 UTC (permalink / raw)
  To: libc-alpha, palmer, darius, dj
  Cc: nelson.chu, jimw, paul.walmsley, Vincent Chen

The $gp register may be used to access the global variable in
the PDE program, so the $gp register should be initialized before
executing the IFUNC resolver of PDE program to avoid unexpected
error occurs.
---
 sysdeps/riscv/dl-machine.h | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
index 0ae45dd0c3..211835f0e6 100644
--- a/sysdeps/riscv/dl-machine.h
+++ b/sysdeps/riscv/dl-machine.h
@@ -339,8 +339,28 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
       gotplt[0] = (ElfW(Addr)) &_dl_runtime_resolve;
       gotplt[1] = (ElfW(Addr)) l;
     }
-#endif
 
+  if (l->l_type == lt_executable)
+    {
+      /* The __global_pointer$ may not be defined by the linker if the
+	 $gp register does not be used to access the global variable
+	 in the executable program. Therefore, the search symbol is
+	 set to a weak symbol to avoid we error out if the
+	 __global_pointer$ is not found.  */
+      ElfW(Sym) gp_sym = { 0 };
+      gp_sym.st_info = (unsigned char) ELFW (ST_INFO (STB_WEAK, STT_NOTYPE));
+
+      const ElfW(Sym) *ref = &gp_sym;
+      _dl_lookup_symbol_x ("__global_pointer$", l, &ref,
+			   l->l_scope, NULL, 0, 0, NULL);
+      if (ref)
+        asm (
+          "mv gp, %0\n"
+          :
+          : "r" (ref->st_value)
+        );
+    }
+#endif
   return lazy;
 }
 
-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 0/2] riscv: add support for GNU indirect function
  2020-12-15  9:16 [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
  2020-12-15  9:16 ` [PATCH v2 1/2] riscv: support " Vincent Chen
  2020-12-15  9:16 ` [PATCH v2 2/2] riscv: Initialize $gp before resolving the IRELATIVE relocation Vincent Chen
@ 2021-01-04  1:38 ` Vincent Chen
  2021-01-05  1:53   ` Jim Wilson
  2021-01-11  2:29   ` DJ Delorie
  2 siblings, 2 replies; 10+ messages in thread
From: Vincent Chen @ 2021-01-04  1:38 UTC (permalink / raw)
  To: GNU C Library, Palmer Dabbelt, Darius Rad, DJ Delorie
  Cc: Nelson Chu, Jim Wilson, Paul Walmsley

On Tue, Dec 15, 2020 at 5:16 PM Vincent Chen <vincent.chen@sifive.com> wrote:
>
> The riscv Binutils supported GNU indirect function in the commit
> 02dd9d25. To make the entire mechanism work, these patches adds the
> required ports to enable Glibc to address the IRELATIVE relocation.
>
> Because the dynamic linker resolves the IRELATIVE relocation before
> jumping into the executable program, the $gp register is not initialized
> when executing the IFUNC resolver function. It may cause some unexpected
> error to occur when the dynamic loader resolves the IREALTIVE relocation
> of the position-dependent executable program. To solve this issue, the
> second patch enables dynamic linker to look for the __global_pointer$
> symbol and use it to initialize $gp before resolving the IREALTIVE
> relocation of the PDE program.
>
>
> Changes since v1:
> 1. Move the riscv entry to the end of libc-abis file
> 2. Add the second input argument to IFUNC resolver to preserve the
>    extension flexibility
> 3. Enable ld.so to initilize $gp by __global_pointer$ symbol instead
>    of the DT_RISCV_GP dynamic entry to avoid to modify the riscv ELF
>    psABI specification.
>

Gentle ping on this series. Thanks and happy new year.

>
> Vincent Chen (2):
>   riscv: support GNU indirect function
>   riscv: Initialize $gp before resolving the IRELATIVE relocation
>
>  libc-abis                  |  1 +
>  sysdeps/riscv/dl-irel.h    | 56 ++++++++++++++++++++++++++++++++++++++
>  sysdeps/riscv/dl-machine.h | 44 +++++++++++++++++++++++++++++-
>  3 files changed, 100 insertions(+), 1 deletion(-)
>  create mode 100644 sysdeps/riscv/dl-irel.h
>
> --
> 2.29.2
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 0/2] riscv: add support for GNU indirect function
  2021-01-04  1:38 ` [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
@ 2021-01-05  1:53   ` Jim Wilson
  2021-01-05  3:13     ` Nelson Chu
  2021-01-05 12:32     ` Carlos O'Donell
  2021-01-11  2:29   ` DJ Delorie
  1 sibling, 2 replies; 10+ messages in thread
From: Jim Wilson @ 2021-01-05  1:53 UTC (permalink / raw)
  To: Vincent Chen
  Cc: GNU C Library, Palmer Dabbelt, Darius Rad, DJ Delorie,
	Nelson Chu, Paul Walmsley

On Sun, Jan 3, 2021 at 5:38 PM Vincent Chen <vincent.chen@sifive.com> wrote:

> Gentle ping on this series. Thanks and happy new year.
>

This is on the release blockers list at my request, so hopefully it will
get looked at before the release.
    https://sourceware.org/glibc/wiki/Release/2.33#Release_blockers.3F

Jim

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 0/2] riscv: add support for GNU indirect function
  2021-01-05  1:53   ` Jim Wilson
@ 2021-01-05  3:13     ` Nelson Chu
  2021-01-05 12:32     ` Carlos O'Donell
  1 sibling, 0 replies; 10+ messages in thread
From: Nelson Chu @ 2021-01-05  3:13 UTC (permalink / raw)
  To: Jim Wilson
  Cc: Vincent Chen, GNU C Library, Palmer Dabbelt, Darius Rad,
	DJ Delorie, Paul Walmsley

On Tue, Jan 5, 2021 at 9:53 AM Jim Wilson <jimw@sifive.com> wrote:
> This is on the release blockers list at my request, so hopefully it will get looked at before the release.
>     https://sourceware.org/glibc/wiki/Release/2.33#Release_blockers.3F

Thank you very much, Jim.

> 3. Enable ld.so to initilize $gp by __global_pointer$ symbol instead
> of the DT_RISCV_GP dynamic entry to avoid to modify the riscv ELF

The binutils commit 18b9872261b950a8d10a4ae6ccb8f2acdaebc3e6 is
committed, so this should work when updating the mainline binutils.

Thanks
Nelson
   psABI specification.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 0/2] riscv: add support for GNU indirect function
  2021-01-05  1:53   ` Jim Wilson
  2021-01-05  3:13     ` Nelson Chu
@ 2021-01-05 12:32     ` Carlos O'Donell
  2021-01-06  0:53       ` Vincent Chen
  1 sibling, 1 reply; 10+ messages in thread
From: Carlos O'Donell @ 2021-01-05 12:32 UTC (permalink / raw)
  To: Jim Wilson, Vincent Chen; +Cc: GNU C Library, Nelson Chu, Paul Walmsley

On 1/4/21 8:53 PM, Jim Wilson wrote:
> On Sun, Jan 3, 2021 at 5:38 PM Vincent Chen <vincent.chen@sifive.com> wrote:
> 
>> Gentle ping on this series. Thanks and happy new year.
>>
> 
> This is on the release blockers list at my request, so hopefully it will
> get looked at before the release.
>     https://sourceware.org/glibc/wiki/Release/2.33#Release_blockers.3F

The patches were discussed on the Monday patch review meeting.

I've asked DJ to help move these along.

I have confidence that we will get to them before the release.

-- 
Cheers,
Carlos.


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 0/2] riscv: add support for GNU indirect function
  2021-01-05 12:32     ` Carlos O'Donell
@ 2021-01-06  0:53       ` Vincent Chen
  0 siblings, 0 replies; 10+ messages in thread
From: Vincent Chen @ 2021-01-06  0:53 UTC (permalink / raw)
  To: Carlos O'Donell; +Cc: Jim Wilson, GNU C Library, Nelson Chu, Paul Walmsley

On Tue, Jan 5, 2021 at 8:32 PM Carlos O'Donell <carlos@redhat.com> wrote:
>
> On 1/4/21 8:53 PM, Jim Wilson wrote:
> > On Sun, Jan 3, 2021 at 5:38 PM Vincent Chen <vincent.chen@sifive.com> wrote:
> >
> >> Gentle ping on this series. Thanks and happy new year.
> >>
> >
> > This is on the release blockers list at my request, so hopefully it will
> > get looked at before the release.
> >     https://sourceware.org/glibc/wiki/Release/2.33#Release_blockers.3F
>
> The patches were discussed on the Monday patch review meeting.
>
> I've asked DJ to help move these along.
>
> I have confidence that we will get to them before the release.
>

Glad to hear this information. Thanks to the people who have given me
help on this patch set.

Best Regards
Vincent Chen

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 0/2] riscv: add support for GNU indirect function
  2021-01-04  1:38 ` [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
  2021-01-05  1:53   ` Jim Wilson
@ 2021-01-11  2:29   ` DJ Delorie
  2021-01-11  7:34     ` Nelson Chu
  1 sibling, 1 reply; 10+ messages in thread
From: DJ Delorie @ 2021-01-11  2:29 UTC (permalink / raw)
  To: Vincent Chen; +Cc: libc-alpha, palmer, darius, nelson.chu, jimw, paul.walmsley

Vincent Chen <vincent.chen@sifive.com> writes:
> Gentle ping on this series. Thanks and happy new year.

Series committed.  Thanks!


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 0/2] riscv: add support for GNU indirect function
  2021-01-11  2:29   ` DJ Delorie
@ 2021-01-11  7:34     ` Nelson Chu
  0 siblings, 0 replies; 10+ messages in thread
From: Nelson Chu @ 2021-01-11  7:34 UTC (permalink / raw)
  To: DJ Delorie
  Cc: Vincent Chen, GNU C Library, Palmer Dabbelt, Darius Rad,
	Jim Wilson, Paul Walmsley

Thank you all !

Nelson

On Mon, Jan 11, 2021 at 10:29 AM DJ Delorie <dj@redhat.com> wrote:
>
> Vincent Chen <vincent.chen@sifive.com> writes:
> > Gentle ping on this series. Thanks and happy new year.
>
> Series committed.  Thanks!
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2021-01-11  7:34 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-15  9:16 [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
2020-12-15  9:16 ` [PATCH v2 1/2] riscv: support " Vincent Chen
2020-12-15  9:16 ` [PATCH v2 2/2] riscv: Initialize $gp before resolving the IRELATIVE relocation Vincent Chen
2021-01-04  1:38 ` [PATCH v2 0/2] riscv: add support for GNU indirect function Vincent Chen
2021-01-05  1:53   ` Jim Wilson
2021-01-05  3:13     ` Nelson Chu
2021-01-05 12:32     ` Carlos O'Donell
2021-01-06  0:53       ` Vincent Chen
2021-01-11  2:29   ` DJ Delorie
2021-01-11  7:34     ` Nelson Chu

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).