PR 6888
authorAlan Modra <amodra@gmail.com>
Mon, 15 Sep 2008 23:41:55 +0000 (23:41 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 15 Sep 2008 23:41:55 +0000 (23:41 +0000)
* elf32-ppc.c (ppc_elf_relocate_section): Handle NULL symbol section
on R_PPC_TOC16, R_PPC_SDAREL16, R_PPC_EMB_SDA2REL, R_PPC_EMB_SDA21,
R_PPC_EMB_RELSDA, R_PPC_SECTOFF* relocs.

bfd/ChangeLog
bfd/elf32-ppc.c

index 461385b3aa14ada51aafd6106a75e5395d913273..c9cbe0c4a4dcbe6c7dfda496a89a5eb88c708a77 100644 (file)
@@ -1,3 +1,10 @@
+2008-09-16  Alan Modra  <amodra@bigpond.net.au>
+
+       PR 6888
+       * elf32-ppc.c (ppc_elf_relocate_section): Handle NULL symbol section
+       on R_PPC_TOC16, R_PPC_SDAREL16, R_PPC_EMB_SDA2REL, R_PPC_EMB_SDA21,
+       R_PPC_EMB_RELSDA, R_PPC_SECTOFF* relocs.
+
 2008-09-11  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix loading large elf64 binaries on 32bit hosts.
index 84e72b8a041e1b141a1baba07cf457ae63e62767..8720b0b68bccbaff9de6cb68237c0652de4b956d 100644 (file)
@@ -6971,12 +6971,15 @@ ppc_elf_relocate_section (bfd *output_bfd,
             an embedded ELF object, for which the .got section acts like the
             AIX .toc section.  */
        case R_PPC_TOC16:                       /* phony GOT16 relocations */
-         BFD_ASSERT (sec != NULL);
-         BFD_ASSERT (bfd_is_und_section (sec)
-                     || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
+         if (sec == NULL || sec->output_section == NULL)
+           {
+             unresolved_reloc = TRUE;
+             break;
+           }
+         BFD_ASSERT (strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
                      || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
 
-           addend -= sec->output_section->vma + sec->output_offset + 0x8000;
+         addend -= sec->output_section->vma + sec->output_offset + 0x8000;
          break;
 
        case R_PPC_PLTREL24:
@@ -7013,7 +7016,12 @@ ppc_elf_relocate_section (bfd *output_bfd,
            const char *name;
            struct elf_link_hash_entry *sh;
 
-           BFD_ASSERT (sec != NULL);
+           if (sec == NULL || sec->output_section == NULL)
+             {
+               unresolved_reloc = TRUE;
+               break;
+             }
+
            name = bfd_get_section_name (abfd, sec->output_section);
            if (! ((CONST_STRNEQ (name, ".sdata")
                    && (name[6] == 0 || name[6] == '.'))
@@ -7041,7 +7049,12 @@ ppc_elf_relocate_section (bfd *output_bfd,
            const char *name;
            struct elf_link_hash_entry *sh;
 
-           BFD_ASSERT (sec != NULL);
+           if (sec == NULL || sec->output_section == NULL)
+             {
+               unresolved_reloc = TRUE;
+               break;
+             }
+
            name = bfd_get_section_name (abfd, sec->output_section);
            if (! (CONST_STRNEQ (name, ".sdata2")
                   || CONST_STRNEQ (name, ".sbss2")))
@@ -7073,7 +7086,12 @@ ppc_elf_relocate_section (bfd *output_bfd,
            int reg;
            struct elf_link_hash_entry *sh;
 
-           BFD_ASSERT (sec != NULL);
+           if (sec == NULL || sec->output_section == NULL)
+             {
+               unresolved_reloc = TRUE;
+               break;
+             }
+
            name = bfd_get_section_name (abfd, sec->output_section);
            if (((CONST_STRNEQ (name, ".sdata")
                  && (name[6] == 0 || name[6] == '.'))
@@ -7086,7 +7104,6 @@ ppc_elf_relocate_section (bfd *output_bfd,
                           + sh->root.u.def.section->output_offset
                           + sh->root.u.def.section->output_section->vma);
              }
-
            else if (CONST_STRNEQ (name, ".sdata2")
                     || CONST_STRNEQ (name, ".sbss2"))
              {
@@ -7096,13 +7113,11 @@ ppc_elf_relocate_section (bfd *output_bfd,
                           + sh->root.u.def.section->output_offset
                           + sh->root.u.def.section->output_section->vma);
              }
-
            else if (strcmp (name, ".PPC.EMB.sdata0") == 0
                     || strcmp (name, ".PPC.EMB.sbss0") == 0)
              {
                reg = 0;
              }
-
            else
              {
                (*_bfd_error_handler)
@@ -7132,7 +7147,11 @@ ppc_elf_relocate_section (bfd *output_bfd,
        case R_PPC_SECTOFF_LO:
        case R_PPC_SECTOFF_HI:
        case R_PPC_SECTOFF_HA:
-         BFD_ASSERT (sec != NULL);
+         if (sec == NULL || sec->output_section == NULL)
+           {
+             unresolved_reloc = TRUE;
+             break;
+           }
          addend -= sec->output_section->vma;
          break;