Fix powerpc64 segfault caused by zero r_symndx relocs.
authorAlan Modra <amodra@gmail.com>
Wed, 2 Dec 2015 08:19:53 +0000 (18:49 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 2 Dec 2015 08:48:27 +0000 (19:18 +1030)
Fixes a segfault in ppc64_elf_tls_optimize found when testing
R_PPC64_ENTRY, and potential for trouble in other places found by
code inspection.

* elf64-ppc.c (ppc64_elf_tls_optimize): Don't segfault on NULL
symbol section or output section.
(ppc64_elf_edit_toc): Similarly for ld -R objects.
(ppc64_elf_size_stubs): Likewise.

bfd/ChangeLog
bfd/elf64-ppc.c

index 544ed88325e94eb376ba2b81ef5dc9ab4a4048d6..fbbea1dabb79107d25f8ffd57dc4115dad721c09 100644 (file)
@@ -1,3 +1,10 @@
+2015-12-02  Alan Modra  <amodra@gmail.com>
+
+       * elf64-ppc.c (ppc64_elf_tls_optimize): Don't segfault on NULL
+       symbol section or output section.
+       (ppc64_elf_edit_toc): Similarly for ld -R objects.
+       (ppc64_elf_size_stubs): Likewise.
+
 2015-12-01  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/19319
index 42356d8a0b811180bfeeed185d620557e08efcf8..9b5ebcdaffbb36bc3404799c721c285bae1c79d0 100644 (file)
@@ -8391,7 +8391,8 @@ ppc64_elf_tls_optimize (struct bfd_link_info *info)
                      if (h != NULL
                          && h->root.type == bfd_link_hash_undefweak)
                        ok_tprel = TRUE;
-                     else
+                     else if (sym_sec != NULL
+                              && sym_sec->output_section != NULL)
                        {
                          value += sym_sec->output_offset;
                          value += sym_sec->output_section->vma;
@@ -8952,6 +8953,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
                goto error_ret;
 
              if (sym_sec == NULL
+                 || sym_sec->output_section == NULL
                  || discarded_section (sym_sec))
                continue;
 
@@ -12275,7 +12277,9 @@ ppc64_elf_size_stubs (struct bfd_link_info *info)
                  if (hash == NULL)
                    {
                      sym_value = sym->st_value;
-                     ok_dest = TRUE;
+                     if (sym_sec != NULL
+                         && sym_sec->output_section != NULL)
+                       ok_dest = TRUE;
                    }
                  else if (hash->elf.root.type == bfd_link_hash_defined
                           || hash->elf.root.type == bfd_link_hash_defweak)