riscv: Drop reliance on _GLOBAL_OFFSET_TABLE_[0]

Message ID 20210818043744.1481986-1-maskray@google.com
State Committed
Commit 34b4624b04fc8f038b2c329ca7560197320615b4
Headers
Series riscv: Drop reliance on _GLOBAL_OFFSET_TABLE_[0] |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

Fangrui Song Aug. 18, 2021, 4:37 a.m. UTC
  &__ehdr_start is a better way to get the load address.

This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1
(x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64).
---
 sysdeps/riscv/dl-machine.h | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)
  

Comments

Palmer Dabbelt Aug. 18, 2021, 4:22 p.m. UTC | #1
On Tue, 17 Aug 2021 21:37:44 PDT (-0700), maskray@google.com wrote:
> &__ehdr_start is a better way to get the load address.
>
> This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1
> (x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64).
> ---
>  sysdeps/riscv/dl-machine.h | 21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
> index aedf69fcdd..5b0746175c 100644
> --- a/sysdeps/riscv/dl-machine.h
> +++ b/sysdeps/riscv/dl-machine.h
> @@ -76,27 +76,26 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
>    return 1;
>  }
>
> +/* Return the run-time load address of the shared object.  */
> +static inline ElfW(Addr)
> +elf_machine_load_address (void)
> +{
> +  extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
> +  return (ElfW(Addr)) &__ehdr_start;
> +}
> +
>  /* Return the link-time address of _DYNAMIC.  */
>  static inline ElfW(Addr)
>  elf_machine_dynamic (void)
>  {
> -  extern ElfW(Addr) _GLOBAL_OFFSET_TABLE_ __attribute__ ((visibility ("hidden")));
> -  return _GLOBAL_OFFSET_TABLE_;
> +  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
> +  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
>  }
>
>  #define STRINGXP(X) __STRING (X)
>  #define STRINGXV(X) STRINGV_ (X)
>  #define STRINGV_(...) # __VA_ARGS__
>
> -/* Return the run-time load address of the shared object.  */
> -static inline ElfW(Addr)
> -elf_machine_load_address (void)
> -{
> -  ElfW(Addr) load_addr;
> -  asm ("lla %0, _DYNAMIC" : "=r" (load_addr));
> -  return load_addr - elf_machine_dynamic ();
> -}
> -
>  /* Initial entry point code for the dynamic linker.
>     The C function `_dl_start' is the real entry point;
>     its return value is the user program's entry point.  */

Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>

LMK if you want me to commit this, but from the history it looks like 
you have commit access so feel free to yourself (assuming you've built 
it for all our targets).

Thanks!
  
Fangrui Song Aug. 18, 2021, 4:31 p.m. UTC | #2
On Wed, Aug 18, 2021 at 9:22 AM Palmer Dabbelt <palmerdabbelt@google.com> wrote:
>
> On Tue, 17 Aug 2021 21:37:44 PDT (-0700), maskray@google.com wrote:
> > &__ehdr_start is a better way to get the load address.
> >
> > This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1
> > (x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64).
> > ---
> >  sysdeps/riscv/dl-machine.h | 21 ++++++++++-----------
> >  1 file changed, 10 insertions(+), 11 deletions(-)
> >
> > diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
> > index aedf69fcdd..5b0746175c 100644
> > --- a/sysdeps/riscv/dl-machine.h
> > +++ b/sysdeps/riscv/dl-machine.h
> > @@ -76,27 +76,26 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
> >    return 1;
> >  }
> >
> > +/* Return the run-time load address of the shared object.  */
> > +static inline ElfW(Addr)
> > +elf_machine_load_address (void)
> > +{
> > +  extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
> > +  return (ElfW(Addr)) &__ehdr_start;
> > +}
> > +
> >  /* Return the link-time address of _DYNAMIC.  */
> >  static inline ElfW(Addr)
> >  elf_machine_dynamic (void)
> >  {
> > -  extern ElfW(Addr) _GLOBAL_OFFSET_TABLE_ __attribute__ ((visibility ("hidden")));
> > -  return _GLOBAL_OFFSET_TABLE_;
> > +  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
> > +  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
> >  }
> >
> >  #define STRINGXP(X) __STRING (X)
> >  #define STRINGXV(X) STRINGV_ (X)
> >  #define STRINGV_(...) # __VA_ARGS__
> >
> > -/* Return the run-time load address of the shared object.  */
> > -static inline ElfW(Addr)
> > -elf_machine_load_address (void)
> > -{
> > -  ElfW(Addr) load_addr;
> > -  asm ("lla %0, _DYNAMIC" : "=r" (load_addr));
> > -  return load_addr - elf_machine_dynamic ();
> > -}
> > -
> >  /* Initial entry point code for the dynamic linker.
> >     The C function `_dl_start' is the real entry point;
> >     its return value is the user program's entry point.  */
>
> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
> Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
>
> LMK if you want me to commit this, but from the history it looks like
> you have commit access so feel free to yourself (assuming you've built
> it for all our targets).
>
> Thanks!

I have the commit access:)

Checked with  scripts/build-many-glibcs.py /tmp/glibc-many glibcs
riscv64-linux-gnu-rv64imafdc-lp64d --keep all
(and riscv32-linux-gnu-rv32imac-ilp32) and ran elf/ldconfig &
elf/ld.so with qemu-riscv64-static.
  
Palmer Dabbelt Aug. 18, 2021, 9:09 p.m. UTC | #3
On Wed, 18 Aug 2021 09:31:39 PDT (-0700), maskray@google.com wrote:
> On Wed, Aug 18, 2021 at 9:22 AM Palmer Dabbelt <palmerdabbelt@google.com> wrote:
>>
>> On Tue, 17 Aug 2021 21:37:44 PDT (-0700), maskray@google.com wrote:
>> > &__ehdr_start is a better way to get the load address.
>> >
>> > This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1
>> > (x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64).
>> > ---
>> >  sysdeps/riscv/dl-machine.h | 21 ++++++++++-----------
>> >  1 file changed, 10 insertions(+), 11 deletions(-)
>> >
>> > diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
>> > index aedf69fcdd..5b0746175c 100644
>> > --- a/sysdeps/riscv/dl-machine.h
>> > +++ b/sysdeps/riscv/dl-machine.h
>> > @@ -76,27 +76,26 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
>> >    return 1;
>> >  }
>> >
>> > +/* Return the run-time load address of the shared object.  */
>> > +static inline ElfW(Addr)
>> > +elf_machine_load_address (void)
>> > +{
>> > +  extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
>> > +  return (ElfW(Addr)) &__ehdr_start;
>> > +}
>> > +
>> >  /* Return the link-time address of _DYNAMIC.  */
>> >  static inline ElfW(Addr)
>> >  elf_machine_dynamic (void)
>> >  {
>> > -  extern ElfW(Addr) _GLOBAL_OFFSET_TABLE_ __attribute__ ((visibility ("hidden")));
>> > -  return _GLOBAL_OFFSET_TABLE_;
>> > +  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
>> > +  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
>> >  }
>> >
>> >  #define STRINGXP(X) __STRING (X)
>> >  #define STRINGXV(X) STRINGV_ (X)
>> >  #define STRINGV_(...) # __VA_ARGS__
>> >
>> > -/* Return the run-time load address of the shared object.  */
>> > -static inline ElfW(Addr)
>> > -elf_machine_load_address (void)
>> > -{
>> > -  ElfW(Addr) load_addr;
>> > -  asm ("lla %0, _DYNAMIC" : "=r" (load_addr));
>> > -  return load_addr - elf_machine_dynamic ();
>> > -}
>> > -
>> >  /* Initial entry point code for the dynamic linker.
>> >     The C function `_dl_start' is the real entry point;
>> >     its return value is the user program's entry point.  */
>>
>> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
>> Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>
>>
>> LMK if you want me to commit this, but from the history it looks like
>> you have commit access so feel free to yourself (assuming you've built
>> it for all our targets).
>>
>> Thanks!
>
> I have the commit access:)
>
> Checked with  scripts/build-many-glibcs.py /tmp/glibc-many glibcs
> riscv64-linux-gnu-rv64imafdc-lp64d --keep all
> (and riscv32-linux-gnu-rv32imac-ilp32) and ran elf/ldconfig &
> elf/ld.so with qemu-riscv64-static.

Works for me.  Thanks!
  

Patch

diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h
index aedf69fcdd..5b0746175c 100644
--- a/sysdeps/riscv/dl-machine.h
+++ b/sysdeps/riscv/dl-machine.h
@@ -76,27 +76,26 @@  elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
   return 1;
 }
 
+/* Return the run-time load address of the shared object.  */
+static inline ElfW(Addr)
+elf_machine_load_address (void)
+{
+  extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
+  return (ElfW(Addr)) &__ehdr_start;
+}
+
 /* Return the link-time address of _DYNAMIC.  */
 static inline ElfW(Addr)
 elf_machine_dynamic (void)
 {
-  extern ElfW(Addr) _GLOBAL_OFFSET_TABLE_ __attribute__ ((visibility ("hidden")));
-  return _GLOBAL_OFFSET_TABLE_;
+  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
+  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
 }
 
 #define STRINGXP(X) __STRING (X)
 #define STRINGXV(X) STRINGV_ (X)
 #define STRINGV_(...) # __VA_ARGS__
 
-/* Return the run-time load address of the shared object.  */
-static inline ElfW(Addr)
-elf_machine_load_address (void)
-{
-  ElfW(Addr) load_addr;
-  asm ("lla %0, _DYNAMIC" : "=r" (load_addr));
-  return load_addr - elf_machine_dynamic ();
-}
-
 /* Initial entry point code for the dynamic linker.
    The C function `_dl_start' is the real entry point;
    its return value is the user program's entry point.  */