summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-08-11 12:30:52 +0930
committerAlan Modra <amodra@gmail.com>2016-08-11 13:00:40 +0930
commitd93d1c80b351a424c1737436b5e7dfb44ddc9d46 (patch)
treea41ff6a370154e3f315904ea6ae17af312f246f4
parent4e796e9fedee43829c3eef17f557127d08cead12 (diff)
downloadbinutils-gdb-d93d1c80b351a424c1737436b5e7dfb44ddc9d46.tar.gz
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.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf64-ppc.c31
2 files changed, 17 insertions, 20 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 303d97b9129..94c1fcb8c27 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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>
* elfxx-mips.c (mips_elf_add_la25_stub): Clear the ISA bit of
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index f40b35ad0ea..4f854c7a56c 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -7223,29 +7223,20 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
return TRUE;
/* Don't generate a copy reloc for symbols defined in the executable. */
- if (!h->def_dynamic || !h->ref_regular || h->def_regular)
- return TRUE;
+ if (!h->def_dynamic || !h->ref_regular || h->def_regular
- /* If -z nocopyreloc was given, don't generate them either. */
- if (info->nocopyreloc)
- {
- h->non_got_ref = 0;
- return TRUE;
- }
+ /* If -z nocopyreloc was given, don't generate them either. */
+ || info->nocopyreloc
- /* 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. */
- if (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
- {
- h->non_got_ref = 0;
- return TRUE;
- }
+ /* 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. */
+ || (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
- /* Protected variables do not work with .dynbss. The copy in
- .dynbss won't be used by the shared library with the protected
- definition for the variable. Text relocations are preferable
- to an incorrect program. */
- if (h->protected_def)
+ /* Protected variables do not work with .dynbss. The copy in
+ .dynbss won't be used by the shared library with the protected
+ definition for the variable. Text relocations are preferable
+ to an incorrect program. */
+ || h->protected_def)
{
h->non_got_ref = 0;
return TRUE;