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:
parent
b293661219
commit
4916030821
3 changed files with 18 additions and 2 deletions
|
@ -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>
|
2021-05-03 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* elf32-ppc.c (allocate_dynrelocs): Call ensure_undef_dynamic for
|
* elf32-ppc.c (allocate_dynrelocs): Call ensure_undef_dynamic for
|
||||||
|
|
|
@ -5245,7 +5245,11 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||||
/* For the non-pic case, discard space for relocs against
|
/* For the non-pic case, discard space for relocs against
|
||||||
symbols which turn out to need copy relocs or are not
|
symbols which turn out to need copy relocs or are not
|
||||||
dynamic. */
|
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
|
&& !h->def_regular
|
||||||
&& !ELF_COMMON_DEF_P (h)
|
&& !ELF_COMMON_DEF_P (h)
|
||||||
&& !(h->protected_def
|
&& !(h->protected_def
|
||||||
|
|
|
@ -9808,7 +9808,11 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||||
relocs against symbols which are not dynamic. */
|
relocs against symbols which are not dynamic. */
|
||||||
else if (h->type != STT_GNU_IFUNC)
|
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
|
&& !h->def_regular
|
||||||
&& !ELF_COMMON_DEF_P (h))
|
&& !ELF_COMMON_DEF_P (h))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue