From 3fdc96aa4ff9417d64c151cd5e3fdbdb497113ff Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 24 Mar 2015 17:37:57 +1030 Subject: [PATCH] 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. --- bfd/ChangeLog | 11 +++++++++++ bfd/elf32-ppc.c | 34 ++++++++++++---------------------- bfd/elf64-ppc.c | 31 +++++++++++++------------------ 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d994eac4488..be6f3ec0603 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2015-07-10 Alan Modra + + Apply from master + 2015-03-24 Alan Modra + * 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 Apply from master: diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 5a37fdb3456..d0559d1f728 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -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 { diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index fde52158f8a..55bf5b295b7 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -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 { -- 2.47.2