aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-spu.c42
-rw-r--r--ld/testsuite/ChangeLog4
-rw-r--r--ld/testsuite/ld-spu/ovl2.d4
4 files changed, 53 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 96f8252..ab00026 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-05 Alan Modra <amodra@bigpond.net.au>
+
+ * elf32-spu.c (spu_elf_output_symbol_hook): New function.
+ (elf_backend_link_output_symbol_hook): Define.
+
2007-04-02 Nick Clifton <nickc@redhat.com>
PR binutils/4292
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index d05aaef..fac414e 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
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 21a924c..606b36c 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-04-05 Alan Modra <amodra@bigpond.net.au>
+
+ * ld-spu/ovl2.d: Update.
+
2007-04-02 H.J. Lu <hongjiu.lu@intel.com>
PR ld/4090
diff --git a/ld/testsuite/ld-spu/ovl2.d b/ld/testsuite/ld-spu/ovl2.d
index ea2644b..459ef5a 100644
--- a/ld/testsuite/ld-spu/ovl2.d
+++ b/ld/testsuite/ld-spu/ovl2.d
@@ -33,7 +33,7 @@ Disassembly of section \.text:
138: 42 00 00 ce ila \$78,1
13c: 32 00 08 80 br 180 <__ovly_load> # 180
-00000140 <00000000\.ovl_call\._SPUEAR_f1_a2>:
+00000140 <_SPUEAR_f1_a2>:
140: 42 02 00 4f ila \$79,1024 # 400
144: 40 20 00 00 nop \$0
148: 42 00 01 4e ila \$78,2
@@ -46,7 +46,7 @@ Disassembly of section \.ov_a1:
\.\.\.
Disassembly of section \.ov_a2:
-00000400 <_SPUEAR_f1_a2>:
+00000400 <f1_a2>:
400: 32 7f a2 00 br 110 <longjmp> # 110
400: SPU_REL16 longjmp
\.\.\.