mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
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.
This commit is contained in:
parent
05f53ed611
commit
8131c12209
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user