diff options
Diffstat (limited to 'bfd/elf32-sh.c')
-rw-r--r-- | bfd/elf32-sh.c | 440 |
1 files changed, 170 insertions, 270 deletions
diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index af8dd6718a6..541786581d6 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -27,90 +27,88 @@ #include "elf/sh.h" static bfd_reloc_status_type sh_elf_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); static bfd_reloc_status_type sh_elf_ignore_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); static reloc_howto_type *sh_elf_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); + (bfd *, bfd_reloc_code_real_type); static void sh_elf_info_to_howto - PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); + (bfd *, arelent *, Elf_Internal_Rela *); static bfd_boolean sh_elf_set_private_flags - PARAMS ((bfd *, flagword)); + (bfd *, flagword); static bfd_boolean sh_elf_copy_private_data - PARAMS ((bfd *, bfd *)); + (bfd *, bfd *); static bfd_boolean sh_elf_merge_private_data - PARAMS ((bfd *, bfd *)); + (bfd *, bfd *); static bfd_boolean sh_elf_set_mach_from_flags - PARAMS ((bfd *)); + (bfd *); static bfd_boolean sh_elf_relax_section - PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *)); + (bfd *, asection *, struct bfd_link_info *, bfd_boolean *); static bfd_boolean sh_elf_relax_delete_bytes - PARAMS ((bfd *, asection *, bfd_vma, int)); + (bfd *, asection *, bfd_vma, int); static bfd_boolean sh_elf_align_loads - PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_boolean *)); + (bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_boolean *); static bfd_boolean sh_elf_swap_insns - PARAMS ((bfd *, asection *, PTR, bfd_byte *, bfd_vma)); + (bfd *, asection *, void *, bfd_byte *, bfd_vma); static bfd_boolean sh_elf_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); + (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, + Elf_Internal_Rela *, Elf_Internal_Sym *, asection **); static bfd_byte *sh_elf_get_relocated_section_contents - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *, bfd_boolean, asymbol **)); + (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *, + bfd_boolean, asymbol **); static void sh_elf_copy_indirect_symbol - PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *, - struct elf_link_hash_entry *)); + (struct elf_backend_data *, struct elf_link_hash_entry *, + struct elf_link_hash_entry *); static int sh_elf_optimized_tls_reloc - PARAMS ((struct bfd_link_info *, int, int)); + (struct bfd_link_info *, int, int); static bfd_boolean sh_elf_mkobject - PARAMS ((bfd *)); + (bfd *); static bfd_boolean sh_elf_object_p - PARAMS ((bfd *)); + (bfd *); static bfd_boolean sh_elf_check_relocs - PARAMS ((bfd *, struct bfd_link_info *, asection *, - const Elf_Internal_Rela *)); + (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *); static struct bfd_hash_entry *sh_elf_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); + (struct bfd_hash_entry *, struct bfd_hash_table *, const char *); static struct bfd_link_hash_table *sh_elf_link_hash_table_create - PARAMS ((bfd *)); + (bfd *); static bfd_boolean sh_elf_adjust_dynamic_symbol - PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); + (struct bfd_link_info *, struct elf_link_hash_entry *); static bfd_boolean sh_elf_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); + (bfd *, struct bfd_link_info *); static bfd_boolean sh_elf_finish_dynamic_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, - Elf_Internal_Sym *)); + (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, + Elf_Internal_Sym *); static bfd_boolean sh_elf_finish_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); + (bfd *, struct bfd_link_info *); static bfd_reloc_status_type sh_elf_reloc_loop - PARAMS ((int, bfd *, asection *, bfd_byte *, bfd_vma, asection *, - bfd_vma, bfd_vma)); + (int, bfd *, asection *, bfd_byte *, bfd_vma, asection *, bfd_vma, + bfd_vma); static bfd_boolean create_got_section - PARAMS ((bfd *, struct bfd_link_info *)); + (bfd *, struct bfd_link_info *); static bfd_boolean sh_elf_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); + (bfd *, struct bfd_link_info *); static bfd_vma dtpoff_base - PARAMS ((struct bfd_link_info *)); + (struct bfd_link_info *); static bfd_vma tpoff - PARAMS ((struct bfd_link_info *, bfd_vma)); + (struct bfd_link_info *, bfd_vma); static asection * sh_elf_gc_mark_hook - PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *, - struct elf_link_hash_entry *, Elf_Internal_Sym *)); + (asection *, struct bfd_link_info *, Elf_Internal_Rela *, + struct elf_link_hash_entry *, Elf_Internal_Sym *); static bfd_boolean sh_elf_gc_sweep_hook - PARAMS ((bfd *, struct bfd_link_info *, asection *, - const Elf_Internal_Rela *)); + (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *); static bfd_boolean allocate_dynrelocs - PARAMS ((struct elf_link_hash_entry *, PTR)); + (struct elf_link_hash_entry *, void *); static bfd_boolean readonly_dynrelocs - PARAMS ((struct elf_link_hash_entry *, PTR)); + (struct elf_link_hash_entry *, void *); static enum elf_reloc_type_class sh_elf_reloc_type_class - PARAMS ((const Elf_Internal_Rela *)); + (const Elf_Internal_Rela *); #ifdef INCLUDE_SHMEDIA -inline static void movi_shori_putval PARAMS ((bfd *, unsigned long, char *)); +inline static void movi_shori_putval (bfd *, unsigned long, char *); #endif static bfd_boolean elf32_shlin_grok_prstatus - PARAMS ((bfd *abfd, Elf_Internal_Note *note)); + (bfd *abfd, Elf_Internal_Note *note); static bfd_boolean elf32_shlin_grok_psinfo - PARAMS ((bfd *abfd, Elf_Internal_Note *note)); + (bfd *abfd, Elf_Internal_Note *note); /* The name of the dynamic interpreter. This is put in the .interp section. */ @@ -1664,15 +1662,10 @@ static reloc_howto_type sh_elf_howto_table[] = }; static bfd_reloc_status_type -sh_elf_reloc_loop (r_type, input_bfd, input_section, contents, addr, - symbol_section, start, end) - int r_type ATTRIBUTE_UNUSED; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - bfd_vma addr; - asection *symbol_section; - bfd_vma start, end; +sh_elf_reloc_loop (int r_type ATTRIBUTE_UNUSED, bfd *input_bfd, + asection *input_section, bfd_byte *contents, + bfd_vma addr, asection *symbol_section, + bfd_vma start, bfd_vma end) { static bfd_vma last_addr; static asection *last_symbol_section; @@ -1774,15 +1767,9 @@ sh_elf_reloc_loop (r_type, input_bfd, input_section, contents, addr, function, and is almost certainly incorrect for other ELF targets. */ static bfd_reloc_status_type -sh_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol_in; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message ATTRIBUTE_UNUSED; +sh_elf_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in, + void *data, asection *input_section, bfd *output_bfd, + char **error_message ATTRIBUTE_UNUSED) { unsigned long insn; bfd_vma sym_value; @@ -1849,15 +1836,11 @@ sh_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, which the linker should otherwise ignore. */ static bfd_reloc_status_type -sh_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd ATTRIBUTE_UNUSED; - arelent *reloc_entry; - asymbol *symbol ATTRIBUTE_UNUSED; - PTR data ATTRIBUTE_UNUSED; - asection *input_section; - bfd *output_bfd; - char **error_message ATTRIBUTE_UNUSED; +sh_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, + asymbol *symbol ATTRIBUTE_UNUSED, + void *data ATTRIBUTE_UNUSED, asection *input_section, + bfd *output_bfd, + char **error_message ATTRIBUTE_UNUSED) { if (output_bfd != NULL) reloc_entry->address += input_section->output_offset; @@ -1971,9 +1954,8 @@ static const struct elf_reloc_map sh_reloc_map[] = corresponding SH ELf reloc. */ static reloc_howto_type * -sh_elf_reloc_type_lookup (abfd, code) - bfd *abfd ATTRIBUTE_UNUSED; - bfd_reloc_code_real_type code; +sh_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, + bfd_reloc_code_real_type code) { unsigned int i; @@ -1989,10 +1971,8 @@ sh_elf_reloc_type_lookup (abfd, code) /* Given an ELF reloc, fill in the howto field of a relent. */ static void -sh_elf_info_to_howto (abfd, cache_ptr, dst) - bfd *abfd ATTRIBUTE_UNUSED; - arelent *cache_ptr; - Elf_Internal_Rela *dst; +sh_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, + Elf_Internal_Rela *dst) { unsigned int r; @@ -2019,11 +1999,8 @@ sh_elf_info_to_howto (abfd, cache_ptr, dst) they come from enum elf_sh_reloc_type in include/elf/sh.h. */ static bfd_boolean -sh_elf_relax_section (abfd, sec, link_info, again) - bfd *abfd; - asection *sec; - struct bfd_link_info *link_info; - bfd_boolean *again; +sh_elf_relax_section (bfd *abfd, asection *sec, + struct bfd_link_info *link_info, bfd_boolean *again) { Elf_Internal_Shdr *symtab_hdr; Elf_Internal_Rela *internal_relocs; @@ -2055,7 +2032,7 @@ sh_elf_relax_section (abfd, sec, link_info, again) symtab_hdr = &elf_tdata (abfd)->symtab_hdr; internal_relocs = (_bfd_elf_link_read_relocs - (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL, + (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, link_info->keep_memory)); if (internal_relocs == NULL) goto error_return; @@ -2411,11 +2388,8 @@ sh_elf_relax_section (abfd, sec, link_info, again) in coff-sh.c. */ static bfd_boolean -sh_elf_relax_delete_bytes (abfd, sec, addr, count) - bfd *abfd; - asection *sec; - bfd_vma addr; - int count; +sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, + int count) { Elf_Internal_Shdr *symtab_hdr; unsigned int sec_shndx; @@ -2737,8 +2711,7 @@ sh_elf_relax_delete_bytes (abfd, sec, addr, count) FALSE, we should free them, if we are permitted to, when we leave sh_coff_relax_section. */ internal_relocs = (_bfd_elf_link_read_relocs - (abfd, o, (PTR) NULL, (Elf_Internal_Rela *) NULL, - TRUE)); + (abfd, o, NULL, (Elf_Internal_Rela *) NULL, TRUE)); if (internal_relocs == NULL) return FALSE; @@ -2892,12 +2865,10 @@ sh_elf_relax_delete_bytes (abfd, sec, addr, count) boundaries. This is like sh_align_loads in coff-sh.c. */ static bfd_boolean -sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped) - bfd *abfd ATTRIBUTE_UNUSED; - asection *sec; - Elf_Internal_Rela *internal_relocs; - bfd_byte *contents ATTRIBUTE_UNUSED; - bfd_boolean *pswapped; +sh_elf_align_loads (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, + Elf_Internal_Rela *internal_relocs, + bfd_byte *contents ATTRIBUTE_UNUSED, + bfd_boolean *pswapped) { Elf_Internal_Rela *irel, *irelend; bfd_vma *labels = NULL; @@ -2948,7 +2919,7 @@ sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped) stop = sec->_cooked_size; if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns, - (PTR) internal_relocs, &label, + internal_relocs, &label, label_end, start, stop, pswapped)) goto error_return; } @@ -2966,12 +2937,8 @@ sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped) /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */ static bfd_boolean -sh_elf_swap_insns (abfd, sec, relocs, contents, addr) - bfd *abfd; - asection *sec; - PTR relocs; - bfd_byte *contents; - bfd_vma addr; +sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs, + bfd_byte *contents, bfd_vma addr) { Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs; unsigned short i1, i2; @@ -3252,10 +3219,7 @@ static const bfd_byte *elf_sh_pic_plt_entry; #define elf_sh_plt_reloc_offset(info) (info->shared ? 52 : 44) inline static void -movi_shori_putval (output_bfd, value, addr) - bfd *output_bfd; - unsigned long value; - char *addr; +movi_shori_putval (bfd *output_bfd, unsigned long value, char *addr) { bfd_put_32 (output_bfd, bfd_get_32 (output_bfd, addr) @@ -3573,8 +3537,7 @@ struct sh_elf_obj_tdata as the specific tdata. */ static bfd_boolean -sh_elf_mkobject (abfd) - bfd *abfd; +sh_elf_mkobject (bfd *abfd) { bfd_size_type amt = sizeof (struct sh_elf_obj_tdata); abfd->tdata.any = bfd_zalloc (abfd, amt); @@ -3614,7 +3577,7 @@ struct elf_sh_link_hash_table #define sh_elf_link_hash_traverse(table, func, info) \ (elf_link_hash_traverse \ (&(table)->root, \ - (bfd_boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \ + (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \ (info))) /* Get the sh ELF linker hash table from a link_info structure. */ @@ -3625,10 +3588,9 @@ struct elf_sh_link_hash_table /* Create an entry in an sh ELF linker hash table. */ static struct bfd_hash_entry * -sh_elf_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; +sh_elf_link_hash_newfunc (struct bfd_hash_entry *entry, + struct bfd_hash_table *table, + const char *string) { struct elf_sh_link_hash_entry *ret = (struct elf_sh_link_hash_entry *) entry; @@ -3662,8 +3624,7 @@ sh_elf_link_hash_newfunc (entry, table, string) /* Create an sh ELF linker hash table. */ static struct bfd_link_hash_table * -sh_elf_link_hash_table_create (abfd) - bfd *abfd; +sh_elf_link_hash_table_create (bfd *abfd) { struct elf_sh_link_hash_table *ret; bfd_size_type amt = sizeof (struct elf_sh_link_hash_table); @@ -3696,9 +3657,7 @@ sh_elf_link_hash_table_create (abfd) shortcuts to them in our hash table. */ static bfd_boolean -create_got_section (dynobj, info) - bfd *dynobj; - struct bfd_link_info *info; +create_got_section (bfd *dynobj, struct bfd_link_info *info) { struct elf_sh_link_hash_table *htab; @@ -3728,9 +3687,7 @@ create_got_section (dynobj, info) /* Create dynamic sections when linking against a dynamic object. */ static bfd_boolean -sh_elf_create_dynamic_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; +sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) { struct elf_sh_link_hash_table *htab; flagword flags, pltflags; @@ -3754,6 +3711,8 @@ sh_elf_create_dynamic_sections (abfd, info) } htab = sh_elf_hash_table (info); + if (htab->root.dynamic_sections_created) + return TRUE; /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and .rel[a].bss sections. */ @@ -3805,7 +3764,8 @@ sh_elf_create_dynamic_sections (abfd, info) || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; - if (! create_got_section (abfd, info)) + if (htab->sgot == NULL + && !create_got_section (abfd, info)) return FALSE; { @@ -3824,6 +3784,8 @@ sh_elf_create_dynamic_sections (abfd, info) relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6); strcpy (relname, ".rela"); strcat (relname, secname); + if (bfd_get_section_by_name (abfd, secname)) + continue; s = bfd_make_section (abfd, relname); if (s == NULL || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) @@ -3880,21 +3842,19 @@ sh_elf_create_dynamic_sections (abfd, info) understand. */ static bfd_boolean -sh_elf_adjust_dynamic_symbol (info, h) - struct bfd_link_info *info; - struct elf_link_hash_entry *h; +sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info, + struct elf_link_hash_entry *h) { struct elf_sh_link_hash_table *htab; struct elf_sh_link_hash_entry *eh; struct elf_sh_dyn_relocs *p; - bfd *dynobj; asection *s; unsigned int power_of_two; - dynobj = elf_hash_table (info)->dynobj; + htab = sh_elf_hash_table (info); /* Make sure we know what is going on here. */ - BFD_ASSERT (dynobj != NULL + BFD_ASSERT (htab->root.dynobj != NULL && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) || h->weakdef != NULL || ((h->elf_link_hash_flags @@ -3911,11 +3871,9 @@ sh_elf_adjust_dynamic_symbol (info, h) || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) { if (h->plt.refcount <= 0 - || (! info->shared - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 - && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0 - && h->root.type != bfd_link_hash_undefweak - && h->root.type != bfd_link_hash_undefined)) + || SYMBOL_CALLS_LOCAL (info, h) + || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + && h->root.type == bfd_link_hash_undefweak)) { /* This case can occur if we saw a PLT reloc in an input file, but the symbol was never referred to by a dynamic @@ -3996,7 +3954,6 @@ sh_elf_adjust_dynamic_symbol (info, h) both the dynamic object and the regular object will refer to the same memory location for the variable. */ - htab = sh_elf_hash_table (info); s = htab->sdynbss; BFD_ASSERT (s != NULL); @@ -4022,9 +3979,9 @@ sh_elf_adjust_dynamic_symbol (info, h) /* Apply the required alignment. */ s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two)); - if (power_of_two > bfd_get_section_alignment (dynobj, s)) + if (power_of_two > bfd_get_section_alignment (htab->root.dynobj, s)) { - if (! bfd_set_section_alignment (dynobj, s, power_of_two)) + if (! bfd_set_section_alignment (htab->root.dynobj, s, power_of_two)) return FALSE; } @@ -4053,9 +4010,7 @@ sh_elf_adjust_dynamic_symbol (info, h) dynamic relocs. */ static bfd_boolean -allocate_dynrelocs (h, inf) - struct elf_link_hash_entry *h; - PTR inf; +allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) { struct bfd_link_info *info; struct elf_sh_link_hash_table *htab; @@ -4221,9 +4176,7 @@ allocate_dynrelocs (h, inf) if (info->shared) { - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0 - && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0 - || info->symbolic)) + if (SYMBOL_CALLS_LOCAL (info, h)) { struct elf_sh_dyn_relocs **pp; @@ -4290,9 +4243,7 @@ allocate_dynrelocs (h, inf) /* Find any dynamic relocs that apply to read-only sections. */ static bfd_boolean -readonly_dynrelocs (h, inf) - struct elf_link_hash_entry *h; - PTR inf; +readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf) { struct elf_sh_link_hash_entry *eh; struct elf_sh_dyn_relocs *p; @@ -4321,9 +4272,8 @@ readonly_dynrelocs (h, inf) /* Set the sizes of the dynamic sections. */ static bfd_boolean -sh_elf_size_dynamic_sections (output_bfd, info) - bfd *output_bfd ATTRIBUTE_UNUSED; - struct bfd_link_info *info; +sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, + struct bfd_link_info *info) { struct elf_sh_link_hash_table *htab; bfd *dynobj; @@ -4432,7 +4382,7 @@ sh_elf_size_dynamic_sections (output_bfd, info) /* Allocate global sym .plt and .got entries, and space for global sym dynamic relocs. */ - elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info); + elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info); /* We now have determined the sizes of the various dynamic sections. Allocate memory for them. */ @@ -4526,8 +4476,7 @@ sh_elf_size_dynamic_sections (output_bfd, info) /* If any dynamic relocs apply to a read-only section, then we need a DT_TEXTREL entry. */ if ((info->flags & DF_TEXTREL) == 0) - elf_link_hash_traverse (&htab->root, readonly_dynrelocs, - (PTR) info); + elf_link_hash_traverse (&htab->root, readonly_dynrelocs, info); if ((info->flags & DF_TEXTREL) != 0) { @@ -4544,16 +4493,11 @@ sh_elf_size_dynamic_sections (output_bfd, info) /* Relocate an SH ELF section. */ static bfd_boolean -sh_elf_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; +sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, + bfd *input_bfd, asection *input_section, + bfd_byte *contents, Elf_Internal_Rela *relocs, + Elf_Internal_Sym *local_syms, + asection **local_sections) { struct elf_sh_link_hash_table *htab; Elf_Internal_Shdr *symtab_hdr; @@ -4905,11 +4849,7 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section, && r_symndx != 0 && (input_section->flags & SEC_ALLOC) != 0 && (r_type != R_SH_REL32 - || (h != NULL - && h->dynindx != -1 - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)))) + || !SYMBOL_CALLS_LOCAL (info, h))) { Elf_Internal_Rela outrel; bfd_byte *loc; @@ -5068,9 +5008,7 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section, dyn = htab->root.dynamic_sections_created; if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) || (info->shared - && (info->symbolic || h->dynindx == -1 - || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) + && SYMBOL_REFERENCES_LOCAL (info, h)) || (ELF_ST_VISIBILITY (h->other) && h->root.type == bfd_link_hash_undefweak)) { @@ -5717,14 +5655,12 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section, which uses sh_elf_relocate_section. */ static bfd_byte * -sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order, - data, relocatable, symbols) - bfd *output_bfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - bfd_boolean relocatable; - asymbol **symbols; +sh_elf_get_relocated_section_contents (bfd *output_bfd, + struct bfd_link_info *link_info, + struct bfd_link_order *link_order, + bfd_byte *data, + bfd_boolean relocatable, + asymbol **symbols) { Elf_Internal_Shdr *symtab_hdr; asection *input_section = link_order->u.indirect.section; @@ -5755,7 +5691,7 @@ sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order, bfd_size_type amt; internal_relocs = (_bfd_elf_link_read_relocs - (input_bfd, input_section, (PTR) NULL, + (input_bfd, input_section, NULL, (Elf_Internal_Rela *) NULL, FALSE)); if (internal_relocs == NULL) goto error_return; @@ -5827,8 +5763,7 @@ sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order, This is PT_TLS segment p_vaddr. */ static bfd_vma -dtpoff_base (info) - struct bfd_link_info *info; +dtpoff_base (struct bfd_link_info *info) { /* If tls_segment is NULL, we should have signalled an error already. */ if (elf_hash_table (info)->tls_segment == NULL) @@ -5839,9 +5774,7 @@ dtpoff_base (info) /* Return the relocation value for R_SH_TLS_TPOFF32.. */ static bfd_vma -tpoff (info, address) - struct bfd_link_info *info; - bfd_vma address; +tpoff (struct bfd_link_info *info, bfd_vma address) { /* If tls_segment is NULL, we should have signalled an error already. */ if (elf_hash_table (info)->tls_segment == NULL) @@ -5852,12 +5785,10 @@ tpoff (info, address) } static asection * -sh_elf_gc_mark_hook (sec, info, rel, h, sym) - asection *sec; - struct bfd_link_info *info ATTRIBUTE_UNUSED; - Elf_Internal_Rela *rel; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; +sh_elf_gc_mark_hook (asection *sec, + struct bfd_link_info *info ATTRIBUTE_UNUSED, + Elf_Internal_Rela *rel, struct elf_link_hash_entry *h, + Elf_Internal_Sym *sym) { if (h != NULL) { @@ -5896,11 +5827,8 @@ sh_elf_gc_mark_hook (sec, info, rel, h, sym) /* Update the got entry reference counts for the section being removed. */ static bfd_boolean -sh_elf_gc_sweep_hook (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; +sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, + asection *sec, const Elf_Internal_Rela *relocs) { Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes; @@ -6083,9 +6011,9 @@ sh_elf_gc_sweep_hook (abfd, info, sec, relocs) /* Copy the extra info we tack onto an elf_link_hash_entry. */ static void -sh_elf_copy_indirect_symbol (bed, dir, ind) - struct elf_backend_data *bed; - struct elf_link_hash_entry *dir, *ind; +sh_elf_copy_indirect_symbol (struct elf_backend_data *bed, + struct elf_link_hash_entry *dir, + struct elf_link_hash_entry *ind) { struct elf_sh_link_hash_entry *edir, *eind; #ifdef INCLUDE_SHMEDIA @@ -6161,10 +6089,8 @@ sh_elf_copy_indirect_symbol (bed, dir, ind) } static int -sh_elf_optimized_tls_reloc (info, r_type, is_local) - struct bfd_link_info *info; - int r_type; - int is_local; +sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type, + int is_local) { if (info->shared) return r_type; @@ -6188,18 +6114,14 @@ sh_elf_optimized_tls_reloc (info, r_type, is_local) virtual table relocs for gc. */ static bfd_boolean -sh_elf_check_relocs (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; +sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, + const Elf_Internal_Rela *relocs) { Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; struct elf_sh_link_hash_table *htab; const Elf_Internal_Rela *rel; const Elf_Internal_Rela *rel_end; - bfd *dynobj; bfd_vma *local_got_offsets; asection *sgot; asection *srelgot; @@ -6221,7 +6143,6 @@ sh_elf_check_relocs (abfd, info, sec, relocs) sym_hashes_end -= symtab_hdr->sh_info; htab = sh_elf_hash_table (info); - dynobj = htab->root.dynobj; local_got_offsets = elf_local_got_offsets (abfd); rel_end = relocs + sec->reloc_count; @@ -6295,10 +6216,13 @@ sh_elf_check_relocs (abfd, info, sec, relocs) case R_SH_TLS_GD_32: case R_SH_TLS_LD_32: case R_SH_TLS_IE_32: - if (dynobj == NULL) - htab->root.dynobj = dynobj = abfd; - if (! create_got_section (dynobj, info)) - return FALSE; + if (htab->sgot == NULL) + { + if (htab->root.dynobj == NULL) + htab->root.dynobj = abfd; + if (!create_got_section (htab->root.dynobj, info)) + return FALSE; + } break; default: @@ -6535,8 +6459,8 @@ sh_elf_check_relocs (abfd, info, sec, relocs) struct elf_sh_dyn_relocs *p; struct elf_sh_dyn_relocs **head; - if (dynobj == NULL) - htab->root.dynobj = dynobj = abfd; + if (htab->root.dynobj == NULL) + htab->root.dynobj = abfd; /* When creating a shared object, we must copy these reloc types into the output file. We create a reloc @@ -6556,23 +6480,23 @@ sh_elf_check_relocs (abfd, info, sec, relocs) && strcmp (bfd_get_section_name (abfd, sec), name + 5) == 0); - sreloc = bfd_get_section_by_name (dynobj, name); + sreloc = bfd_get_section_by_name (htab->root.dynobj, name); if (sreloc == NULL) { flagword flags; - sreloc = bfd_make_section (dynobj, name); + sreloc = bfd_make_section (htab->root.dynobj, name); flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_IN_MEMORY | SEC_LINKER_CREATED); if ((sec->flags & SEC_ALLOC) != 0) flags |= SEC_ALLOC | SEC_LOAD; if (sreloc == NULL - || ! bfd_set_section_flags (dynobj, sreloc, flags) - || ! bfd_set_section_alignment (dynobj, sreloc, 2)) + || ! bfd_set_section_flags (htab->root.dynobj, + sreloc, flags) + || ! bfd_set_section_alignment (htab->root.dynobj, + sreloc, 2)) return FALSE; } - if (sec->flags & SEC_READONLY) - info->flags |= DF_TEXTREL; elf_section_data (sec)->sreloc = sreloc; } @@ -6598,7 +6522,7 @@ sh_elf_check_relocs (abfd, info, sec, relocs) if (p == NULL || p->sec != sec) { bfd_size_type amt = sizeof (*p); - p = ((struct elf_sh_dyn_relocs *) bfd_alloc (dynobj, amt)); + p = bfd_alloc (htab->root.dynobj, amt); if (p == NULL) return FALSE; p->next = *head; @@ -6639,8 +6563,7 @@ sh_elf_check_relocs (abfd, info, sec, relocs) #ifndef sh_elf_set_mach_from_flags static bfd_boolean -sh_elf_set_mach_from_flags (abfd) - bfd *abfd; +sh_elf_set_mach_from_flags (bfd *abfd) { flagword flags = elf_elfheader (abfd)->e_flags; @@ -6682,9 +6605,7 @@ sh_elf_set_mach_from_flags (abfd) /* Function to keep SH specific file flags. */ static bfd_boolean -sh_elf_set_private_flags (abfd, flags) - bfd *abfd; - flagword flags; +sh_elf_set_private_flags (bfd *abfd, flagword flags) { BFD_ASSERT (! elf_flags_init (abfd) || elf_elfheader (abfd)->e_flags == flags); @@ -6699,9 +6620,7 @@ sh_elf_set_private_flags (abfd, flags) /* Copy backend specific data from one object module to another */ static bfd_boolean -sh_elf_copy_private_data (ibfd, obfd) - bfd * ibfd; - bfd * obfd; +sh_elf_copy_private_data (bfd * ibfd, bfd * obfd) { if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour || bfd_get_flavour (obfd) != bfd_target_elf_flavour) @@ -6716,9 +6635,7 @@ sh_elf_copy_private_data (ibfd, obfd) together, and for linking sh-dsp with sh3e / sh4 objects. */ static bfd_boolean -sh_elf_merge_private_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; +sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) { flagword old_flags, new_flags; @@ -6759,8 +6676,7 @@ sh_elf_merge_private_data (ibfd, obfd) here. */ static bfd_boolean -sh_elf_object_p (abfd) - bfd *abfd; +sh_elf_object_p (bfd *abfd) { struct sh_elf_obj_tdata *new_tdata; bfd_size_type amt = sizeof (struct sh_elf_obj_tdata); @@ -6781,17 +6697,13 @@ sh_elf_object_p (abfd) dynamic sections here. */ static bfd_boolean -sh_elf_finish_dynamic_symbol (output_bfd, info, h, sym) - bfd *output_bfd; - struct bfd_link_info *info; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; +sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, + struct elf_link_hash_entry *h, + Elf_Internal_Sym *sym) { struct elf_sh_link_hash_table *htab; - bfd *dynobj; htab = sh_elf_hash_table (info); - dynobj = htab->root.dynobj; if (h->plt.offset != (bfd_vma) -1) { @@ -6959,10 +6871,7 @@ sh_elf_finish_dynamic_symbol (output_bfd, info, h, sym) The entry in the global offset table will already have been initialized in the relocate_section function. */ if (info->shared - && (info->symbolic - || h->dynindx == -1 - || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) + && SYMBOL_REFERENCES_LOCAL (info, h)) { rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE); rel.r_addend = (h->root.u.def.value @@ -7010,10 +6919,7 @@ sh_elf_finish_dynamic_symbol (output_bfd, info, h, sym) The entry in the global offset table will already have been initialized in the relocate_section function. */ if (info->shared - && (info->symbolic - || h->dynindx == -1 - || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) + && SYMBOL_REFERENCES_LOCAL (info, h)) { rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE); rel.r_addend = (h->root.u.def.value @@ -7071,20 +6977,15 @@ sh_elf_finish_dynamic_symbol (output_bfd, info, h, sym) /* Finish up the dynamic sections. */ static bfd_boolean -sh_elf_finish_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; +sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) { struct elf_sh_link_hash_table *htab; - bfd *dynobj; asection *sgot; asection *sdyn; htab = sh_elf_hash_table (info); - dynobj = htab->root.dynobj; - sgot = htab->sgotplt; - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); + sdyn = bfd_get_section_by_name (htab->root.dynobj, ".dynamic"); if (htab->root.dynamic_sections_created) { @@ -7103,7 +7004,7 @@ sh_elf_finish_dynamic_sections (output_bfd, info) const char *name; #endif - bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); + bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn); switch (dyn.d_tag) { @@ -7243,8 +7144,7 @@ sh_elf_finish_dynamic_sections (output_bfd, info) } static enum elf_reloc_type_class -sh_elf_reloc_type_class (rela) - const Elf_Internal_Rela *rela; +sh_elf_reloc_type_class (const Elf_Internal_Rela *rela) { switch ((int) ELF32_R_TYPE (rela->r_info)) { @@ -7261,9 +7161,7 @@ sh_elf_reloc_type_class (rela) /* Support for Linux core dump NOTE sections. */ static bfd_boolean -elf32_shlin_grok_prstatus (abfd, note) - bfd *abfd; - Elf_Internal_Note *note; +elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) { int offset; unsigned int raw_size; @@ -7293,9 +7191,7 @@ elf32_shlin_grok_prstatus (abfd, note) } static bfd_boolean -elf32_shlin_grok_psinfo (abfd, note) - bfd *abfd; - Elf_Internal_Note *note; +elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) { switch (note->descsz) { @@ -7330,7 +7226,11 @@ elf32_shlin_grok_psinfo (abfd, note) #define TARGET_LITTLE_NAME "elf32-shl" #define ELF_ARCH bfd_arch_sh #define ELF_MACHINE_CODE EM_SH -#define ELF_MAXPAGESIZE 128 +#ifdef __QNXTARGET__ +#define ELF_MAXPAGESIZE 0x1000 +#else +#define ELF_MAXPAGESIZE 0x80 +#endif #define elf_symbol_leading_char '_' |