OSDN Git Service

bfd/
authoramodra <amodra>
Thu, 5 Apr 2007 07:01:51 +0000 (07:01 +0000)
committeramodra <amodra>
Thu, 5 Apr 2007 07:01:51 +0000 (07:01 +0000)
* elf32-spu.c (spu_elf_output_symbol_hook): New function.
(elf_backend_link_output_symbol_hook): Define.
ld/testsuite/
* ld-spu/ovl2.d: Update.

bfd/ChangeLog
bfd/elf32-spu.c
ld/testsuite/ChangeLog
ld/testsuite/ld-spu/ovl2.d

index 96f8252..ab00026 100644 (file)
@@ -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
index d05aaef..fac414e 100644 (file)
@@ -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
index 21a924c..606b36c 100644 (file)
@@ -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
index ea2644b..459ef5a 100644 (file)
@@ -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
        \.\.\.