]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Make powerpc bfd ld reloc overflow vs undefined symbols match gold
authorAlan Modra <amodra@gmail.com>
Tue, 24 Mar 2015 07:07:57 +0000 (17:37 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 10 Jul 2015 10:27:35 +0000 (19:57 +0930)
* 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.

bfd/ChangeLog
bfd/elf32-ppc.c
bfd/elf64-ppc.c

index d994eac448897ac88ccbd9d210b64001ef1b15f3..be6f3ec0603886578d36e83ad9bedfcec2e411eb 100644 (file)
@@ -1,3 +1,14 @@
+2015-07-10  Alan Modra  <amodra@gmail.com>
+
+       Apply from master
+       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-06-23  Jiong Wang  <jiong.wang@arm.com>
 
        Apply from master:
index 5a37fdb3456875496c0fd861ba6594a0d10d07dc..d0559d1f728bee3f5d96d7e2370b14352d6ec694 100644 (file)
@@ -9247,30 +9247,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
            {
index fde52158f8a92cdf400f343d23b0339aa0254b86..55bf5b295b747a3f287e04e9372fdd97abd7c56e 100644 (file)
@@ -14824,26 +14824,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
            {