PowerPC64 abort due to dynamic relocs on hidden undefweak
authorAlan Modra <amodra@gmail.com>
Tue, 7 Mar 2017 00:34:19 +0000 (11:04 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 7 Mar 2017 02:02:31 +0000 (12:32 +1030)
ppc64_elf_relocate_section lacked a check which meant that it emitted
dynamic relocs against a hidden undefweak symbol for which no dynamic
relocs had been allocated.

PR 21224
PR 20519
* elf64-ppc.c (ppc64_elf_relocate_section): Add missing
dyn_relocs check.

bfd/ChangeLog
bfd/elf64-ppc.c

index 92682d56b9c051cce07fc69e9ce1055f17233f16..9560ad2e7a766abcf333202be4d8fa1c763dffa9 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-07  Alan Modra  <amodra@gmail.com>
+
+       PR 21224
+       PR 20519
+       * elf64-ppc.c (ppc64_elf_relocate_section): Add missing
+       dyn_relocs check.
+
 2017-03-05  Alan Modra  <amodra@gmail.com>
 
        * elf-bfd.h (struct eh_cie_fde): Add u.cie.per_encoding_aligned8.
index 84cb2140872381c8a7383edf470a8ad0aa99b9ef..d0673c91878a2ad4a240fa5132d8af76685c323c 100644 (file)
@@ -14804,8 +14804,10 @@ ppc64_elf_relocate_section (bfd *output_bfd,
            break;
 
          if (bfd_link_pic (info)
-             ? ((h != NULL && pc_dynrelocs (h))
-                || must_be_dyn_reloc (info, r_type))
+             ? ((h == NULL
+                 || h->dyn_relocs != NULL)
+                && ((h != NULL && pc_dynrelocs (h))
+                    || must_be_dyn_reloc (info, r_type)))
              : (h != NULL
                 ? h->dyn_relocs != NULL
                 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))