diff options
author | Alan Modra <amodra@bigpond.net.au> | 2008-03-11 09:30:50 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2008-03-11 09:30:50 +0000 |
commit | 6e3f8e3077379b681f6c1559a39b7d9d5a75f559 (patch) | |
tree | c508092dcc84db7b3c49c115bfe96a3768800a91 /bfd/elf32-spu.c | |
parent | 7946d60fa50d25f4ae10a02e6dd1aabb6354e3d4 (diff) | |
download | binutils-redhat-6e3f8e3077379b681f6c1559a39b7d9d5a75f559.tar.gz |
* elf32-spu.c (spu_elf_relocate_section): Test identical conditions
to those in process_stubs for overlay symbols.
Diffstat (limited to 'bfd/elf32-spu.c')
-rw-r--r-- | bfd/elf32-spu.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c index 75601350d2..99b1b610b0 100644 --- a/bfd/elf32-spu.c +++ b/bfd/elf32-spu.c @@ -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; + + 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; - relocation = g->stub_addr; - addend = 0; + 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, |