xtensa: don't emit dynamic relocation for weak undefined symbol
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-06 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.
This commit is contained in:
parent
ad1cc4e492
commit
c451bb34ae
@ -1,3 +1,12 @@
|
||||
2018-07-06 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.
|
||||
|
||||
2018-07-06 Alan Hayward <alan.hayward@arm.com>
|
||||
|
||||
* elf.c (elfcore_grok_aarch_sve): New function.
|
||||
|
@ -1437,6 +1437,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));
|
||||
|
||||
@ -2777,12 +2781,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
|
||||
@ -10013,7 +10021,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;
|
||||
|
Loading…
Reference in New Issue
Block a user