PowerPC64 ELFv1 undefined weak functions

Undefined weak functions, like __gmon_start__, were not being made
dynamic or emitting plt call code.  While the behaviour of undefined
weak symbols is not defined in the ELF standard, the intention on
powerpc64 was to make it possible to link without a definition of such
symbols and at run time behave the same as if a definition was found
at link time in a shared library.

	* elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Don't exit with
	non_got_ref true in any case where we could have generated dynbss
	copies but decide not to do so.
This commit is contained in:
Alan Modra
2016-08-11 12:30:52 +09:30
parent 4e796e9fed
commit d93d1c80b3
2 changed files with 17 additions and 20 deletions

View File

@ -1,3 +1,9 @@
2016-08-11 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Don't exit with
non_got_ref true in any case where we could have generated dynbss
copies but decide not to do so.
2016-08-10 Maciej W. Rozycki <macro@imgtec.com> 2016-08-10 Maciej W. Rozycki <macro@imgtec.com>
* elfxx-mips.c (mips_elf_add_la25_stub): Clear the ISA bit of * elfxx-mips.c (mips_elf_add_la25_stub): Clear the ISA bit of

View File

@ -7223,29 +7223,20 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
return TRUE; return TRUE;
/* Don't generate a copy reloc for symbols defined in the executable. */ /* Don't generate a copy reloc for symbols defined in the executable. */
if (!h->def_dynamic || !h->ref_regular || h->def_regular) if (!h->def_dynamic || !h->ref_regular || h->def_regular
return TRUE;
/* If -z nocopyreloc was given, don't generate them either. */ /* If -z nocopyreloc was given, don't generate them either. */
if (info->nocopyreloc) || info->nocopyreloc
{
h->non_got_ref = 0;
return TRUE;
}
/* If we didn't find any dynamic relocs in read-only sections, then /* If we didn't find any dynamic relocs in read-only sections, then
we'll be keeping the dynamic relocs and avoiding the copy reloc. */ we'll be keeping the dynamic relocs and avoiding the copy reloc. */
if (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h)) || (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
{
h->non_got_ref = 0;
return TRUE;
}
/* Protected variables do not work with .dynbss. The copy in /* Protected variables do not work with .dynbss. The copy in
.dynbss won't be used by the shared library with the protected .dynbss won't be used by the shared library with the protected
definition for the variable. Text relocations are preferable definition for the variable. Text relocations are preferable
to an incorrect program. */ to an incorrect program. */
if (h->protected_def) || h->protected_def)
{ {
h->non_got_ref = 0; h->non_got_ref = 0;
return TRUE; return TRUE;