[PATCH] xtensa: don't emit dynamic relocation for weak undefined symbol

Max Filippov jcmvbkbc@gmail.com
Tue Jul 10 17:25:00 GMT 2018


Hi Nick,

I'd like to backport the following patch to the binutils-2_31-branch, is it OK?

On Thu, Jul 5, 2018 at 9:04 AM, Max Filippov <jcmvbkbc@gmail.com> wrote:
> Resolved reference to a weak undefined symbol in PIE must not have
> a dynamic relative relocation against itself, otherwise the value of a
> reference will be changed from 0 to the base of executable, breaking
> code like the following:
>
>   void weak_function (void);
>   if (weak_function)
>     weak_function ();
>
> This fixes tests for PR ld/22269 and a number of PIE tests in xtensa gcc
> testsuite.
>
> bfd/
> 2018-07-05  Max Filippov  <jcmvbkbc@gmail.com>
>
>         * elf32-xtensa.c (elf_xtensa_allocate_dynrelocs): Don't allocate
>         space for dynamic relocation for undefined weak symbol.
>         (elf_xtensa_relocate_section): Don't emit R_XTENSA_RELATIVE
>         relocation for undefined weak symbols.
>         (shrink_dynamic_reloc_sections): Don't shrink dynamic relocation
>         section for relocations against undefined weak symbols.
> ---
>  bfd/elf32-xtensa.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
> index cf7e12797e17..e012f5e29d8d 100644
> --- a/bfd/elf32-xtensa.c
> +++ b/bfd/elf32-xtensa.c
> @@ -1444,6 +1444,10 @@ elf_xtensa_allocate_dynrelocs (struct elf_link_hash_entry *h, void *arg)
>    if (! elf_xtensa_dynamic_symbol_p (h, info))
>      elf_xtensa_make_sym_local (info, h);
>
> +  if (! elf_xtensa_dynamic_symbol_p (h, info)
> +      && h->root.type == bfd_link_hash_undefweak)
> +    return TRUE;
> +
>    if (h->plt.refcount > 0)
>      htab->elf.srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
>
> @@ -2784,12 +2788,16 @@ elf_xtensa_relocate_section (bfd *output_bfd,
>                         }
>                       unresolved_reloc = FALSE;
>                     }
> -                 else
> +                 else if (!is_weak_undef)
>                     {
>                       /* Generate a RELATIVE relocation.  */
>                       outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
>                       outrel.r_addend = 0;
>                     }
> +                 else
> +                   {
> +                     continue;
> +                   }
>                 }
>
>               loc = (srel->contents
> @@ -10028,7 +10036,8 @@ shrink_dynamic_reloc_sections (struct bfd_link_info *info,
>
>    if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
>        && (input_section->flags & SEC_ALLOC) != 0
> -      && (dynamic_symbol || bfd_link_pic (info)))
> +      && (dynamic_symbol || bfd_link_pic (info))
> +      && (!h || h->root.type != bfd_link_hash_undefweak))
>      {
>        asection *srel;
>        bfd_boolean is_plt = FALSE;
> --
> 2.11.0
>

-- 
Thanks.
-- Max



More information about the Binutils mailing list