PPC: undefweak dynamic relocs
Alan Modra
amodra@gmail.com
Thu May 6 02:00:02 GMT 2021
On Wed, May 05, 2021 at 01:13:24PM -0700, Fangrui Song wrote:
> > @@ -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))
> > {
> >
>
> This adds more complexity to the already complex logic "whether an undefined
> weak needs dynamic relocation when .dynsym exists".
Yes. Unfortunately can't be avoided without affecting other targets.
(A cleaner approach is to change _bfd_elf_adjust_dynamic_symbol so
that all undefined weak symbols are seen by
elf_backend_adjust_dynamic_symbol, but doing so blows up x86_64 and
likely other targets. I tried.)
I spent a lot of time simplifying the powerpc logic over the years so,
believe me, I don't like complicating anything here. But contrast
this code with the mind-boggling complexity in the equivalent x86 code
still using non_got_ref, a flag that changes its meaning part way
through the link process, and using a zero_undefweak flag set per
relocation type.
> I have checked that x86-64 -no-pie a.o b.so doesn't use a dynamic
> relocation in this case. With -z dynamic-undefined-weak, there is a
> stray R_X86_64_NONE in .rela.dyn
>
> I think a relocation type oblivious approach works equally well:
That's what I have on powerpc
> emit a dynamic relocation for -shared, suppress it for -no-pie and -pie.
but not quite like this. -shared and -pie are treated the same.
--
Alan Modra
Australia Development Lab, IBM
More information about the Binutils
mailing list