* elf32-spu.c (spu_elf_relocate_section): Test identical conditions

to those in process_stubs for overlay symbols.
This commit is contained in:
Alan Modra
2008-03-11 09:30:50 +00:00
parent 20a6ec495b
commit 5f5fb9ec64
2 changed files with 40 additions and 18 deletions

View File

@ -1,3 +1,8 @@
2008-03-11 Alan Modra <amodra@bigpond.net.au>
* elf32-spu.c (spu_elf_relocate_section): Test identical conditions
to those in process_stubs for overlay symbols.
2008-03-09 Paul Brook <paul@codesourcery.com> 2008-03-09 Paul Brook <paul@codesourcery.com>
* elf32-arm.c (elf32_arm_merge_eabi_attributes): Handle new * elf32-arm.c (elf32_arm_merge_eabi_attributes): Handle new

View File

@ -2708,7 +2708,6 @@ spu_elf_relocate_section (bfd *output_bfd,
bfd_reloc_status_type r; bfd_reloc_status_type r;
bfd_boolean unresolved_reloc; bfd_boolean unresolved_reloc;
bfd_boolean warned; bfd_boolean warned;
bfd_boolean branch;
r_symndx = ELF32_R_SYM (rel->r_info); r_symndx = ELF32_R_SYM (rel->r_info);
r_type = ELF32_R_TYPE (rel->r_info); r_type = ELF32_R_TYPE (rel->r_info);
@ -2769,33 +2768,51 @@ spu_elf_relocate_section (bfd *output_bfd,
/* If this symbol is in an overlay area, we may need to relocate /* If this symbol is in an overlay area, we may need to relocate
to the overlay stub. */ to the overlay stub. */
addend = rel->r_addend; addend = rel->r_addend;
branch = (is_branch (contents + rel->r_offset)
|| is_hint (contents + rel->r_offset));
if (htab->stub_sec != NULL if (htab->stub_sec != NULL
&& needs_ovl_stub (sym_name, sec, input_section, htab, branch) && sec != NULL
&& sec->output_section != NULL
&& sec->output_section->owner == output_bfd
&& (h == NULL && (h == NULL
|| (h != htab->ovly_load && h != htab->ovly_return))) || (h != htab->ovly_load && h != htab->ovly_return)))
{ {
unsigned int ovl = 0; bfd_boolean branch;
struct got_entry *g, **head; unsigned int sym_type;
if (branch) branch = FALSE;
ovl = (spu_elf_section_data (input_section->output_section) if (r_type == R_SPU_REL16
->u.o.ovl_index); || r_type == R_SPU_ADDR16)
branch = (is_branch (contents + rel->r_offset)
|| is_hint (contents + rel->r_offset));
if (h != NULL) if (h != NULL)
head = &h->got.glist; sym_type = h->type;
else else
head = elf_local_got_ents (input_bfd) + r_symndx; sym_type = ELF_ST_TYPE (sym->st_info);
for (g = *head; g != NULL; g = g->next) if ((sym_type == STT_FUNC || branch)
if (g->addend == addend && (g->ovl == ovl || g->ovl == 0)) && needs_ovl_stub (sym_name, sec, input_section, htab, branch))
break; {
if (g == NULL) unsigned int ovl = 0;
abort (); struct got_entry *g, **head;
relocation = g->stub_addr; if (branch)
addend = 0; ovl = (spu_elf_section_data (input_section->output_section)
->u.o.ovl_index);
if (h != NULL)
head = &h->got.glist;
else
head = elf_local_got_ents (input_bfd) + r_symndx;
for (g = *head; g != NULL; g = g->next)
if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
break;
if (g == NULL)
abort ();
relocation = g->stub_addr;
addend = 0;
}
} }
r = _bfd_final_link_relocate (howto, r = _bfd_final_link_relocate (howto,