diff options
author | Alan Modra <amodra@gmail.com> | 2015-03-24 17:37:57 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2015-03-24 17:42:36 +1030 |
commit | 8131c12209700f6e8cf16b09b5196da78a8066a3 (patch) | |
tree | 547c397906468ce0c106e6f85e9dc23eb234a972 /bfd/elf64-ppc.c | |
parent | 05f53ed611f0f7442f2b3a12b2829a18db6c2b59 (diff) | |
download | gdb-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.c | 31 |
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 { |