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]

Make powerpc bfd ld reloc overflow vs undefined symbols match gold


	* elf64-ppc.c (ppc64_elf_relocate_section): Report overflow to
	stubs, even those for undefined weak symbols.  Otherwise, don't
	report relocation overflow on branches to undefined strong
	symbols.  Fix memory leak.
	* elf32-ppc.c (ppc_elf_relocate_section): Don't report relocation
	overflow on branches to undefined strong symbols.

diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index d61d75e..b96dbc8 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -9250,30 +9250,20 @@ ppc_elf_relocate_section (bfd *output_bfd,
 	  if (r == bfd_reloc_overflow)
 	    {
 	    overflow:
-	      if (warned)
-		continue;
-	      if (h != NULL
-		  && h->root.type == bfd_link_hash_undefweak
-		  && howto->pc_relative)
+	      /* On code like "if (foo) foo();" don't report overflow
+		 on a branch to zero when foo is undefined.  */
+	      if (!warned
+		  && !(h != NULL
+		       && (h->root.type == bfd_link_hash_undefweak
+			   || h->root.type == bfd_link_hash_undefined)
+		       && is_branch_reloc (r_type)))
 		{
-		  /* Assume this is a call protected by other code that
-		     detect the symbol is undefined.  If this is the case,
-		     we can safely ignore the overflow.  If not, the
-		     program is hosed anyway, and a little warning isn't
-		     going to help.  */
-
-		  continue;
+		  if (!((*info->callbacks->reloc_overflow)
+			(info, (h ? &h->root : NULL), sym_name,
+			 howto->name, rel->r_addend,
+			 input_bfd, input_section, rel->r_offset)))
+		    return FALSE;
 		}
-
-	      if (! (*info->callbacks->reloc_overflow) (info,
-							(h ? &h->root : NULL),
-							sym_name,
-							howto->name,
-							rel->r_addend,
-							input_bfd,
-							input_section,
-							rel->r_offset))
-		return FALSE;
 	    }
 	  else
 	    {
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 60f8b6e..e7e8820 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -14837,26 +14837,21 @@ ppc64_elf_relocate_section (bfd *output_bfd,
 
 	  if (r == bfd_reloc_overflow)
 	    {
-	      if (warned)
-		continue;
-	      if (h != NULL
-		  && h->elf.root.type == bfd_link_hash_undefweak
-		  && howto->pc_relative)
+	      /* On code like "if (foo) foo();" don't report overflow
+		 on a branch to zero when foo is undefined.  */
+	      if (!warned
+		  && (reloc_dest == DEST_STUB
+		      || !(h != NULL
+			   && (h->elf.root.type == bfd_link_hash_undefweak
+			       || h->elf.root.type == bfd_link_hash_undefined)
+			   && is_branch_reloc (r_type))))
 		{
-		  /* Assume this is a call protected by other code that
-		     detects the symbol is undefined.  If this is the case,
-		     we can safely ignore the overflow.  If not, the
-		     program is hosed anyway, and a little warning isn't
-		     going to help.  */
-
-		  continue;
+		  if (!((*info->callbacks->reloc_overflow)
+			(info, &h->elf.root, sym_name,
+			 reloc_name, orig_rel.r_addend,
+			 input_bfd, input_section, rel->r_offset)))
+		    return FALSE;
 		}
-
-	      if (!((*info->callbacks->reloc_overflow)
-		    (info, &h->elf.root, sym_name,
-		     reloc_name, orig_rel.r_addend,
-		     input_bfd, input_section, rel->r_offset)))
-		return FALSE;
 	    }
 	  else
 	    {

-- 
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]