This is the mail archive of the binutils-cvs@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]

[binutils-gdb] Make powerpc bfd ld reloc overflow vs undefined symbols match gold


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8131c12209700f6e8cf16b09b5196da78a8066a3

commit 8131c12209700f6e8cf16b09b5196da78a8066a3
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Mar 24 17:37:57 2015 +1030

    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:
---
 bfd/ChangeLog   |  9 +++++++++
 bfd/elf32-ppc.c | 34 ++++++++++++----------------------
 bfd/elf64-ppc.c | 31 +++++++++++++------------------
 3 files changed, 34 insertions(+), 40 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 060db14..512452c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2015-03-24  Alan Modra  <amodra@gmail.com>
+
+	* 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.
+
 2015-03-23  Keith Seitz  <keiths@redhat.com>
 
 	* elfnn-aarch64.c (_bfd_aarch64_create_or_find_stub_sec): Add
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
 	    {


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