From c1b2796f477c941ce0b9bba7cedff60f11926685 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 5 Apr 2007 07:01:53 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/elf32-spu.c | 42 ++++++++++++++++++++++++++++++++++++++ ld/testsuite/ChangeLog | 4 ++++ ld/testsuite/ld-spu/ovl2.d | 4 ++-- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 96f825255b1..ab00026624a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2007-04-05 Alan Modra + + * elf32-spu.c (spu_elf_output_symbol_hook): New function. + (elf_backend_link_output_symbol_hook): Define. + 2007-04-02 Nick Clifton PR binutils/4292 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 diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 21a924c51a3..606b36cf403 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-04-05 Alan Modra + + * ld-spu/ovl2.d: Update. + 2007-04-02 H.J. Lu PR ld/4090 diff --git a/ld/testsuite/ld-spu/ovl2.d b/ld/testsuite/ld-spu/ovl2.d index ea2644bbac4..459ef5a5b86 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 : 400: 32 7f a2 00 br 110 # 110 400: SPU_REL16 longjmp \.\.\. -- 2.30.2