PPC: undefweak dynamic relocs

This makes the default for ppc to keep dynamic relocs on undefweak
symbols when the code won't cause DT_TEXTREL (for instance when -fPIE
or -fPIC).  If ld is given -z dynamic-undefined-weak then dynamic
relocations will be created for non-PIC at the expense of possibly
causing DT_TEXTREL to be set on ppc32.  Note that DT_TEXTREL and GNU
indirect functions are incompatible.

	* elf32-ppc.c (allocate_dynrelocs): Keep dyn_relocs for undefweak
	symbols when -z dynamic-undefined-weak or when there are no
	dynamic relocs in read-only sections and -z nodynamic-undefined-weak
	is not given.
	* elf64-ppc.c (allocate_dynrelocs): Likewise.
This commit is contained in:
Alan Modra 2021-05-03 12:28:46 +09:30
parent b293661219
commit 4916030821
3 changed files with 18 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2021-05-03 Alan Modra <amodra@gmail.com>
* elf32-ppc.c (allocate_dynrelocs): Keep dyn_relocs for undefweak
symbols when -z dynamic-undefined-weak or when there are no
dynamic relocs in read-only sections and -z nodynamic-undefined-weak
is not given.
* elf64-ppc.c (allocate_dynrelocs): Likewise.
2021-05-03 Alan Modra <amodra@gmail.com>
* elf32-ppc.c (allocate_dynrelocs): Call ensure_undef_dynamic for

View File

@ -5245,7 +5245,11 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
/* For the non-pic case, discard space for relocs against
symbols which turn out to need copy relocs or are not
dynamic. */
if (h->dynamic_adjusted
if ((h->dynamic_adjusted
|| (h->ref_regular
&& h->root.type == bfd_link_hash_undefweak
&& (info->dynamic_undefined_weak > 0
|| !_bfd_elf_readonly_dynrelocs (h))))
&& !h->def_regular
&& !ELF_COMMON_DEF_P (h)
&& !(h->protected_def

View File

@ -9808,7 +9808,11 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
relocs against symbols which are not dynamic. */
else if (h->type != STT_GNU_IFUNC)
{
if (h->dynamic_adjusted
if ((h->dynamic_adjusted
|| (h->ref_regular
&& h->root.type == bfd_link_hash_undefweak
&& (info->dynamic_undefined_weak > 0
|| !_bfd_elf_readonly_dynrelocs (h))))
&& !h->def_regular
&& !ELF_COMMON_DEF_P (h))
{