This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb] Make powerpc bfd ld reloc overflow vs undefined symbols match gold
- From: Alan Modra <amodra at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 24 Mar 2015 07:13:02 -0000
- Subject: [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
{