This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

powerpc embedded reloc segfaults


"sec" can be NULL when a symbol is undefined, and sec->output_section
NULL for a symbol defined in a shared library.  These reloc types don't
support such symbols, but ld shouldn't segfault.

	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.

Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.243
diff -u -p -r1.243 elf32-ppc.c
--- bfd/elf32-ppc.c	12 Aug 2008 13:12:49 -0000	1.243
+++ bfd/elf32-ppc.c	15 Sep 2008 22:52:58 -0000
@@ -6971,12 +6971,15 @@ ppc_elf_relocate_section (bfd *output_bf
 	     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_bf
 	    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_bf
 	    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_bf
 	    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_bf
 			   + 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_bf
 			   + 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_bf
 	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;
 

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]