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:
Alan Modra 2015-03-24 17:37:57 +10:30
parent 05f53ed611
commit 8131c12209
3 changed files with 34 additions and 40 deletions

View File

@ -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

View File

@ -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
{

View File

@ -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
{