[PATCH] RISC-V: Ouput __global_pointer$ as dynamic symbol when generating dynamic PDE.

Nelson Chu nelson.chu@sifive.com
Wed Dec 16 03:07:57 GMT 2020


Hi Guys,

Here is the first approach in glibc - add DT_RISCV_GP,
https://sourceware.org/pipermail/libc-alpha/2020-December/120238.html

And the following is the last approach in glibc - search FT_SYMTAB to
get gp value
https://sourceware.org/pipermail/libc-alpha/2020-December/120715.html


Thanks
Nelson

On Wed, Dec 16, 2020 at 11:03 AM Nelson Chu <nelson.chu@sifive.com> wrote:
>
> When the ifunc resolver is in the executable, we may relax the variables
> to gp-relative access instruction in the ifunc resolver, or in other functions
> that called by the ifunc resolver.  But this will cause the uninitialized
> gp problem since the ifunc need to be resolved at the early runtime, that
> is at the pre-load stage, but we set the gp until the startup code.
>
> At first, we try to add a new dynamic tag, DT_RISCV_GP, to stroe the gp value
> and let ld.so can init the gp register early, before the pre-load stage.  But
> we need to extend the ABI if we want to add a new dynamic tag.  Therefore,
> in the psabi discussion, we try another solution, which was suggested by the
> lld and FreeBSD linker experts, to let ld.so set the gp earlier - make sure
> __global_pointer$ is output as a dynamic symbol when we are generating pde,
> since we only do the relaxation for it.  Afterwards, ld.so can search the
> DT_SYMTAB to get the gp value, and set the gp register before resolving ifunc.
>
> bfd/
>     * elfnn-riscv.c (allocate_dynrelocs): When we are generating pde, make
>       sure gp symbol is output as a dynamic symbol.
> ---
>  bfd/elfnn-riscv.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
> index 20944c8..599313a 100644
> --- a/bfd/elfnn-riscv.c
> +++ b/bfd/elfnn-riscv.c
> @@ -1083,6 +1083,15 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
>    htab = riscv_elf_hash_table (info);
>    BFD_ASSERT (htab != NULL);
>
> +  /* When we are generating pde, make sure gp symbol is output as a
> +     dynamic symbol.  Then ld.so can set the gp register earlier, before
> +     resolving the ifunc.  */
> +  if (!bfd_link_pic (info)
> +      && htab->elf.dynamic_sections_created
> +      && strcmp (h->root.root.string, RISCV_GP_SYMBOL) == 0
> +      && !bfd_elf_link_record_dynamic_symbol (info, h))
> +    return FALSE;
> +
>    /* Since STT_GNU_IFUNC symbols must go through PLT, we handle them
>       in the allocate_ifunc_dynrelocs and allocate_local_ifunc_dynrelocs,
>       if they are defined and referenced in a non-shared object.  */
> --
> 2.7.4
>


More information about the Binutils mailing list