mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-26 11:33:45 +08:00
* elf32-spu.c (spu_elf_relocate_section): Test identical conditions
to those in process_stubs for overlay symbols.
This commit is contained in:
parent
20a6ec495b
commit
5f5fb9ec64
@ -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>
|
||||
|
||||
* elf32-arm.c (elf32_arm_merge_eabi_attributes): Handle new
|
||||
|
@ -2708,7 +2708,6 @@ spu_elf_relocate_section (bfd *output_bfd,
|
||||
bfd_reloc_status_type r;
|
||||
bfd_boolean unresolved_reloc;
|
||||
bfd_boolean warned;
|
||||
bfd_boolean branch;
|
||||
|
||||
r_symndx = ELF32_R_SYM (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
|
||||
to the overlay stub. */
|
||||
addend = rel->r_addend;
|
||||
branch = (is_branch (contents + rel->r_offset)
|
||||
|| is_hint (contents + rel->r_offset));
|
||||
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 != htab->ovly_load && h != htab->ovly_return)))
|
||||
{
|
||||
unsigned int ovl = 0;
|
||||
struct got_entry *g, **head;
|
||||
bfd_boolean branch;
|
||||
unsigned int sym_type;
|
||||
|
||||
if (branch)
|
||||
ovl = (spu_elf_section_data (input_section->output_section)
|
||||
->u.o.ovl_index);
|
||||
branch = FALSE;
|
||||
if (r_type == R_SPU_REL16
|
||||
|| r_type == R_SPU_ADDR16)
|
||||
branch = (is_branch (contents + rel->r_offset)
|
||||
|| is_hint (contents + rel->r_offset));
|
||||
|
||||
if (h != NULL)
|
||||
head = &h->got.glist;
|
||||
sym_type = h->type;
|
||||
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 (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
|
||||
break;
|
||||
if (g == NULL)
|
||||
abort ();
|
||||
if ((sym_type == STT_FUNC || branch)
|
||||
&& needs_ovl_stub (sym_name, sec, input_section, htab, branch))
|
||||
{
|
||||
unsigned int ovl = 0;
|
||||
struct got_entry *g, **head;
|
||||
|
||||
relocation = g->stub_addr;
|
||||
addend = 0;
|
||||
if (branch)
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user