aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-ppc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2015-03-24 17:37:57 +1030
committerAlan Modra <amodra@gmail.com>2015-03-24 17:42:36 +1030
commit8131c12209700f6e8cf16b09b5196da78a8066a3 (patch)
tree547c397906468ce0c106e6f85e9dc23eb234a972 /bfd/elf64-ppc.c
parent05f53ed611f0f7442f2b3a12b2829a18db6c2b59 (diff)
downloadgdb-8131c12209700f6e8cf16b09b5196da78a8066a3.zip
gdb-8131c12209700f6e8cf16b09b5196da78a8066a3.tar.gz
gdb-8131c12209700f6e8cf16b09b5196da78a8066a3.tar.bz2
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.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r--bfd/elf64-ppc.c31
1 files changed, 13 insertions, 18 deletions
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
{