summaryrefslogtreecommitdiff
path: root/bfd/elf32-spu.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2007-04-05 07:01:52 +0000
committerAlan Modra <amodra@bigpond.net.au>2007-04-05 07:01:52 +0000
commit56ffbb59f7cfa94e6cf6335ae3d15ccc4b9cdcde (patch)
tree045ac7875c6434f23ef9ababf06ca6326edd52a8 /bfd/elf32-spu.c
parent36b7ab207363a7203b65cef16f42c67517d062e3 (diff)
downloadgdb-56ffbb59f7cfa94e6cf6335ae3d15ccc4b9cdcde.tar.gz
bfd/
* elf32-spu.c (spu_elf_output_symbol_hook): New function. (elf_backend_link_output_symbol_hook): Define. ld/testsuite/ * ld-spu/ovl2.d: Update.
Diffstat (limited to 'bfd/elf32-spu.c')
-rw-r--r--bfd/elf32-spu.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index d05aaef5481..fac414e85cd 100644
--- a/bfd/elf32-spu.c
+++ b/bfd/elf32-spu.c
@@ -1590,6 +1590,47 @@ spu_elf_relocate_section (bfd *output_bfd,
return ret;
}
+/* Adjust _SPUEAR_ syms to point at their overlay stubs. */
+
+static bfd_boolean
+spu_elf_output_symbol_hook (struct bfd_link_info *info,
+ const char *sym_name ATTRIBUTE_UNUSED,
+ Elf_Internal_Sym *sym,
+ asection *sym_sec ATTRIBUTE_UNUSED,
+ struct elf_link_hash_entry *h)
+{
+ struct spu_link_hash_table *htab = spu_hash_table (info);
+
+ if (!info->relocatable
+ && htab->num_overlays != 0
+ && h != NULL
+ && (h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && h->def_regular
+ && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
+ {
+ static Elf_Internal_Rela zero_rel;
+ char *stub_name = spu_stub_name (h->root.u.def.section, h, &zero_rel);
+ struct spu_stub_hash_entry *sh;
+
+ if (stub_name == NULL)
+ return FALSE;
+ sh = (struct spu_stub_hash_entry *)
+ bfd_hash_lookup (&htab->stub_hash_table, stub_name, FALSE, FALSE);
+ free (stub_name);
+ if (sh == NULL)
+ return TRUE;
+ sym->st_shndx
+ = _bfd_elf_section_from_bfd_section (htab->stub->output_section->owner,
+ htab->stub->output_section);
+ sym->st_value = (htab->stub->output_section->vma
+ + htab->stub->output_offset
+ + sh->off);
+ }
+
+ return TRUE;
+}
+
static int spu_plugin = 0;
void
@@ -1830,6 +1871,7 @@ spu_elf_section_processing (bfd *abfd ATTRIBUTE_UNUSED,
#define elf_backend_gc_mark_hook spu_elf_gc_mark_hook
#define elf_backend_relocate_section spu_elf_relocate_section
#define elf_backend_symbol_processing spu_elf_backend_symbol_processing
+#define elf_backend_link_output_symbol_hook spu_elf_output_symbol_hook
#define bfd_elf32_new_section_hook spu_elf_new_section_hook
#define bfd_elf32_bfd_link_hash_table_create spu_elf_link_hash_table_create
#define bfd_elf32_bfd_link_hash_table_free spu_elf_link_hash_table_free