Nick Clifton b9846b
diff -rup binutils.orig/bfd/elf64-sparc.c binutils-2.29.1/bfd/elf64-sparc.c
Nick Clifton b9846b
--- binutils.orig/bfd/elf64-sparc.c	2017-12-07 17:23:06.764174312 +0000
Nick Clifton b9846b
+++ binutils-2.29.1/bfd/elf64-sparc.c	2017-12-07 17:23:20.540009839 +0000
Nick Clifton b9846b
@@ -287,6 +287,7 @@ elf64_sparc_set_reloc (bfd *abfd ATTRIBU
Nick Clifton b9846b
                        unsigned int count)
Nick Clifton b9846b
 {
Nick Clifton b9846b
   asect->orelocation = location;
Nick Clifton b9846b
+  asect->reloc_count = count / 2;
Nick Clifton b9846b
   canon_reloc_count (asect) = count;
Nick Clifton b9846b
 }
Nick Clifton b9846b
 
Nick Clifton b9846b
Only in binutils-2.29.1/bfd: elf64-sparc.c.orig
Nick Clifton b9846b
diff -rup binutils.orig/bfd/elfcode.h binutils-2.29.1/bfd/elfcode.h
Nick Clifton b9846b
--- binutils.orig/bfd/elfcode.h	2017-12-07 17:23:06.722174814 +0000
Nick Clifton b9846b
+++ binutils-2.29.1/bfd/elfcode.h	2017-12-07 17:23:20.541009827 +0000
Nick Clifton b9846b
@@ -958,6 +958,12 @@ elf_write_relocs (bfd *abfd, asection *s
Nick Clifton b9846b
 	  return;
Nick Clifton b9846b
 	}
Nick Clifton b9846b
 
Nick Clifton b9846b
+      if (ptr->howto == NULL)
Nick Clifton b9846b
+	{
Nick Clifton b9846b
+	  *failedp = TRUE;
Nick Clifton b9846b
+	  return;
Nick Clifton b9846b
+	}
Nick Clifton b9846b
+
Nick Clifton b9846b
       src_rela.r_offset = ptr->address + addr_offset;
Nick Clifton b9846b
       src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
Nick Clifton b9846b
       src_rela.r_addend = ptr->addend;
Nick Clifton b9846b
diff -rup binutils.orig/binutils/objcopy.c binutils-2.29.1/binutils/objcopy.c
Nick Clifton b9846b
--- binutils.orig/binutils/objcopy.c	2017-12-07 17:23:06.769174253 +0000
Nick Clifton b9846b
+++ binutils-2.29.1/binutils/objcopy.c	2017-12-07 17:23:20.542009815 +0000
Nick Clifton b9846b
@@ -3785,14 +3785,24 @@ copy_relocations_in_section (bfd *ibfd,
Nick Clifton b9846b
     }
Nick Clifton b9846b
   else
Nick Clifton b9846b
     {
Nick Clifton b9846b
-      relpp = (arelent **) xmalloc (relsize);
Nick Clifton b9846b
-      relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
Nick Clifton b9846b
-      if (relcount < 0)
Nick Clifton b9846b
+      if (isection->orelocation != NULL)
Nick Clifton b9846b
 	{
Nick Clifton b9846b
-	  status = 1;
Nick Clifton b9846b
-	  bfd_nonfatal_message (NULL, ibfd, isection,
Nick Clifton b9846b
-				_("relocation count is negative"));
Nick Clifton b9846b
-	  return;
Nick Clifton b9846b
+	  /* Some other function has already set up the output relocs
Nick Clifton b9846b
+	     for us, so scan those instead of the default relocs.  */
Nick Clifton b9846b
+	  relcount = isection->reloc_count;
Nick Clifton b9846b
+	  relpp = isection->orelocation;
Nick Clifton b9846b
+	}
Nick Clifton b9846b
+      else
Nick Clifton b9846b
+	{
Nick Clifton b9846b
+	  relpp = (arelent **) xmalloc (relsize);
Nick Clifton b9846b
+	  relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
Nick Clifton b9846b
+	  if (relcount < 0)
Nick Clifton b9846b
+	    {
Nick Clifton b9846b
+	      status = 1;
Nick Clifton b9846b
+	      bfd_nonfatal_message (NULL, ibfd, isection,
Nick Clifton b9846b
+				    _("relocation count is negative"));
Nick Clifton b9846b
+	      return;
Nick Clifton b9846b
+	    }
Nick Clifton b9846b
 	}
Nick Clifton b9846b
 
Nick Clifton b9846b
       if (strip_symbols == STRIP_ALL)
Nick Clifton b9846b
@@ -3815,7 +3825,8 @@ copy_relocations_in_section (bfd *ibfd,
Nick Clifton b9846b
 		  temp_relpp [temp_relcount++] = relpp [i];
Nick Clifton b9846b
 	    }
Nick Clifton b9846b
 	  relcount = temp_relcount;
Nick Clifton b9846b
-	  free (relpp);
Nick Clifton b9846b
+	  if (isection->orelocation == NULL)
Nick Clifton b9846b
+	    free (relpp);
Nick Clifton b9846b
 	  relpp = temp_relpp;
Nick Clifton b9846b
 	}
Nick Clifton b9846b