X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-sh.c;h=8f9157998548ae2690f2bdae4d86f7aa09ca8350;hb=79a94a2ad1e6e2f227de07427481e4bb8be84504;hp=8e93dda5bf8f651ea7755761a5b2ddb7d6371027;hpb=7e612e9848387838d6e9bda6e95eac165a25e4ed;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index 8e93dda5bf..8f91579985 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -1,7 +1,5 @@ /* Renesas / SuperH SH specific support for 32-bit ELF - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2008, 2009, 2010, 2011, 2012 - Free Software Foundation, Inc. + Copyright (C) 1996-2017 Free Software Foundation, Inc. Contributed by Ian Lance Taylor, Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -90,11 +88,11 @@ static bfd_boolean vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED) { #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED - extern const bfd_target bfd_elf32_shlvxworks_vec; - extern const bfd_target bfd_elf32_shvxworks_vec; + extern const bfd_target sh_elf32_vxworks_le_vec; + extern const bfd_target sh_elf32_vxworks_vec; - return (abfd->xvec == &bfd_elf32_shlvxworks_vec - || abfd->xvec == &bfd_elf32_shvxworks_vec); + return (abfd->xvec == &sh_elf32_vxworks_le_vec + || abfd->xvec == &sh_elf32_vxworks_vec); #else return FALSE; #endif @@ -106,11 +104,11 @@ static bfd_boolean fdpic_object_p (bfd *abfd ATTRIBUTE_UNUSED) { #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED - extern const bfd_target bfd_elf32_shfd_vec; - extern const bfd_target bfd_elf32_shbfd_vec; + extern const bfd_target sh_elf32_fdpic_le_vec; + extern const bfd_target sh_elf32_fdpic_be_vec; - return (abfd->xvec == &bfd_elf32_shfd_vec - || abfd->xvec == &bfd_elf32_shbfd_vec); + return (abfd->xvec == &sh_elf32_fdpic_le_vec + || abfd->xvec == &sh_elf32_fdpic_be_vec); #else return FALSE; #endif @@ -257,6 +255,11 @@ sh_elf_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in, && bfd_is_und_section (symbol_in->section)) return bfd_reloc_undefined; + /* PR 17512: file: 9891ca98. */ + if (addr * bfd_octets_per_byte (abfd) + bfd_get_reloc_size (reloc_entry->howto) + > bfd_get_section_limit_octets (abfd, input_section)) + return bfd_reloc_outofrange; + if (bfd_is_com_section (symbol_in->section)) sym_value = 0; else @@ -476,13 +479,20 @@ sh_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) r = ELF32_R_TYPE (dst->r_info); - BFD_ASSERT (r < (unsigned int) R_SH_max); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_LAST_INVALID_RELOC_3); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_5 || r > R_SH_LAST_INVALID_RELOC_5); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_6 || r > R_SH_LAST_INVALID_RELOC_6); + if (r >= R_SH_max + || (r >= R_SH_FIRST_INVALID_RELOC && r <= R_SH_LAST_INVALID_RELOC) + || (r >= R_SH_FIRST_INVALID_RELOC_2 && r <= R_SH_LAST_INVALID_RELOC_2) + || (r >= R_SH_FIRST_INVALID_RELOC_3 && r <= R_SH_LAST_INVALID_RELOC_3) + || (r >= R_SH_FIRST_INVALID_RELOC_4 && r <= R_SH_LAST_INVALID_RELOC_4) + || (r >= R_SH_FIRST_INVALID_RELOC_5 && r <= R_SH_LAST_INVALID_RELOC_5) + || (r >= R_SH_FIRST_INVALID_RELOC_6 && r <= R_SH_LAST_INVALID_RELOC_6)) + { + /* xgettext:c-format */ + _bfd_error_handler (_("%B: unrecognised SH reloc number: %d"), + abfd, r); + bfd_set_error (bfd_error_bad_value); + r = R_SH_NONE; + } cache_ptr->howto = get_howto_table (abfd) + r; } @@ -510,7 +520,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, *again = FALSE; - if (link_info->relocatable + if (bfd_link_relocatable (link_info) || (sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0) return TRUE; @@ -566,9 +576,9 @@ sh_elf_relax_section (bfd *abfd, asection *sec, laddr = irel->r_offset + 4 + irel->r_addend; if (laddr >= sec->size) { - (*_bfd_error_handler) (_("%B: 0x%lx: warning: bad R_SH_USES offset"), - abfd, - (unsigned long) irel->r_offset); + /* xgettext:c-format */ + _bfd_error_handler (_("%B: %#Lx: warning: bad R_SH_USES offset"), + abfd, irel->r_offset); continue; } insn = bfd_get_16 (abfd, contents + laddr); @@ -577,9 +587,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec, do. */ if ((insn & 0xf000) != 0xd000) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"), - abfd, (unsigned long) irel->r_offset, insn)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: warning: R_SH_USES points to unrecognized insn 0x%x"), + abfd, irel->r_offset, insn); continue; } @@ -594,9 +605,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec, paddr += (laddr + 4) &~ (bfd_vma) 3; if (paddr >= sec->size) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: warning: bad R_SH_USES load offset"), - abfd, (unsigned long) irel->r_offset)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: warning: bad R_SH_USES load offset"), + abfd, irel->r_offset); continue; } @@ -609,9 +621,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec, break; if (irelfn >= irelend) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: warning: could not find expected reloc"), - abfd, (unsigned long) paddr)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: warning: could not find expected reloc"), + abfd, paddr); continue; } @@ -637,9 +650,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec, if (isym->st_shndx != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec)) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: warning: symbol in unexpected section"), - abfd, (unsigned long) paddr)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: warning: symbol in unexpected section"), + abfd, paddr); continue; } @@ -704,10 +718,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec, elf_section_data (sec)->this_hdr.contents = contents; symtab_hdr->contents = (unsigned char *) isymbuf; - /* Replace the jsr with a bsr. */ + /* Replace the jmp/jsr with a bra/bsr. */ /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and - replace the jsr with a bsr. */ + replace the jmp/jsr with a bra/bsr. */ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W); /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info) here, but that only checks if the symbol is an external symbol, @@ -718,7 +732,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec, /* We can't fully resolve this yet, because the external symbol value may be changed by future relaxing. We let the final link phase handle it. */ - bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset); + if (bfd_get_16 (abfd, contents + irel->r_offset) & 0x0020) + bfd_put_16 (abfd, (bfd_vma) 0xa000, contents + irel->r_offset); + else + bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset); irel->r_addend = -4; @@ -763,9 +780,10 @@ sh_elf_relax_section (bfd *abfd, asection *sec, /* Now check whether we got a COUNT reloc. */ if (irelcount >= irelend) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: warning: could not find expected COUNT reloc"), - abfd, (unsigned long) paddr)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: warning: could not find expected COUNT reloc"), + abfd, paddr); continue; } @@ -773,9 +791,9 @@ sh_elf_relax_section (bfd *abfd, asection *sec, just deleted one. */ if (irelcount->r_addend == 0) { - ((*_bfd_error_handler) (_("%B: 0x%lx: warning: bad count"), - abfd, - (unsigned long) paddr)); + /* xgettext:c-format */ + _bfd_error_handler (_("%B: %#Lx: warning: bad count"), + abfd, paddr); continue; } @@ -895,7 +913,7 @@ sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, contents = elf_section_data (sec)->this_hdr.contents; - /* The deletion must stop at the next ALIGN reloc for an aligment + /* The deletion must stop at the next ALIGN reloc for an alignment power larger than the number of bytes we are deleting. */ irelalign = NULL; @@ -1176,9 +1194,10 @@ sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, if (overflow) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: fatal: reloc overflow while relaxing"), - abfd, (unsigned long) irel->r_offset)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: fatal: reloc overflow while relaxing"), + abfd, irel->r_offset); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -1546,9 +1565,10 @@ sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs, if (overflow) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: fatal: reloc overflow while relaxing"), - abfd, (unsigned long) irel->r_offset)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: fatal: reloc overflow while relaxing"), + abfd, irel->r_offset); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -2455,11 +2475,6 @@ struct elf_sh_link_hash_table struct elf_link_hash_table root; /* Short-cuts to get to dynamic linker sections. */ - asection *sgot; - asection *sgotplt; - asection *srelgot; - asection *splt; - asection *srelplt; asection *sdynbss; asection *srelbss; asection *sfuncdesc; @@ -2611,12 +2626,6 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) if (htab == NULL) return FALSE; - htab->sgot = bfd_get_linker_section (dynobj, ".got"); - htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); - htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got"); - if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot) - abort (); - htab->sfuncdesc = bfd_make_section_anyway_with_flags (dynobj, ".got.funcdesc", (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS @@ -2698,7 +2707,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) pltflags |= SEC_READONLY; s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); - htab->splt = s; + htab->root.splt = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) return FALSE; @@ -2721,7 +2730,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) h->type = STT_OBJECT; htab->root.hplt = h; - if (info->shared + if (bfd_link_pic (info) && ! bfd_elf_link_record_dynamic_symbol (info, h)) return FALSE; } @@ -2730,12 +2739,12 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) bed->default_use_rela_p ? ".rela.plt" : ".rel.plt", flags | SEC_READONLY); - htab->srelplt = s; + htab->root.srelplt = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; - if (htab->sgot == NULL + if (htab->root.sgot == NULL && !create_got_section (abfd, info)) return FALSE; @@ -2764,7 +2773,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) be needed, we can discard it later. We will never need this section when generating a shared object, since they do not use copy relocs. */ - if (! info->shared) + if (! bfd_link_pic (info)) { s = bfd_make_section_anyway_with_flags (abfd, (bed->default_use_rela_p @@ -2859,7 +2868,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info, only references to the symbol are via the global offset table. For such cases we need not do anything here; the relocations will be handled correctly by relocate_section. */ - if (info->shared) + if (bfd_link_pic (info)) return TRUE; /* If there are no references to this symbol that do not use the @@ -2918,7 +2927,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info, h->needs_copy = 1; } - return _bfd_elf_adjust_dynamic_copy (h, s); + return _bfd_elf_adjust_dynamic_copy (info, h, s); } /* Allocate space in .plt, .got and associated reloc sections for @@ -2966,10 +2975,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) return FALSE; } - if (info->shared + if (bfd_link_pic (info) || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h)) { - asection *s = htab->splt; + asection *s = htab->root.splt; const struct elf_sh_plt_info *plt_info; /* If this is the first .plt entry, make room for the special @@ -2986,7 +2995,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) the shared library. Skip this for FDPIC, since the function's address will be the address of the canonical function descriptor. */ - if (!htab->fdpic_p && !info->shared && !h->def_regular) + if (!htab->fdpic_p && !bfd_link_pic (info) && !h->def_regular) { h->root.u.def.section = s; h->root.u.def.value = h->plt.offset; @@ -3002,14 +3011,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* We also need to make an entry in the .got.plt section, which will be placed in the .got section by the linker script. */ if (!htab->fdpic_p) - htab->sgotplt->size += 4; + htab->root.sgotplt->size += 4; else - htab->sgotplt->size += 8; + htab->root.sgotplt->size += 8; /* We also need to make an entry in the .rel.plt section. */ - htab->srelplt->size += sizeof (Elf32_External_Rela); + htab->root.srelplt->size += sizeof (Elf32_External_Rela); - if (htab->vxworks_p && !info->shared) + if (htab->vxworks_p && !bfd_link_pic (info)) { /* VxWorks executables have a second set of relocations for each PLT entry. They go in a separate relocation @@ -3053,7 +3062,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) return FALSE; } - s = htab->sgot; + s = htab->root.sgot; h->got.offset = s->size; s->size += 4; /* R_SH_TLS_GD needs 2 consecutive GOT slots. */ @@ -3063,34 +3072,38 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) if (!dyn) { /* No dynamic relocations required. */ - if (htab->fdpic_p && !info->shared + if (htab->fdpic_p && !bfd_link_pic (info) && h->root.type != bfd_link_hash_undefweak && (got_type == GOT_NORMAL || got_type == GOT_FUNCDESC)) htab->srofixup->size += 4; } /* No dynamic relocations required when IE->LE conversion happens. */ - else if (got_type == GOT_TLS_IE && !h->def_dynamic && !info->shared) + else if (got_type == GOT_TLS_IE + && !h->def_dynamic + && !bfd_link_pic (info)) ; /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic, R_SH_TLS_GD needs one if local symbol and two if global. */ else if ((got_type == GOT_TLS_GD && h->dynindx == -1) || got_type == GOT_TLS_IE) - htab->srelgot->size += sizeof (Elf32_External_Rela); + htab->root.srelgot->size += sizeof (Elf32_External_Rela); else if (got_type == GOT_TLS_GD) - htab->srelgot->size += 2 * sizeof (Elf32_External_Rela); + htab->root.srelgot->size += 2 * sizeof (Elf32_External_Rela); else if (got_type == GOT_FUNCDESC) { - if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h)) + if (!bfd_link_pic (info) && SYMBOL_FUNCDESC_LOCAL (info, h)) htab->srofixup->size += 4; else - htab->srelgot->size += sizeof (Elf32_External_Rela); + htab->root.srelgot->size += sizeof (Elf32_External_Rela); } else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak) - && (info->shared + && (bfd_link_pic (info) || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) - htab->srelgot->size += sizeof (Elf32_External_Rela); - else if (htab->fdpic_p && !info->shared && got_type == GOT_NORMAL + htab->root.srelgot->size += sizeof (Elf32_External_Rela); + else if (htab->fdpic_p + && !bfd_link_pic (info) + && got_type == GOT_NORMAL && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak)) htab->srofixup->size += 4; @@ -3113,12 +3126,12 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) return FALSE; } - s = htab->sgot; + s = htab->root.sgot; eh->datalabel_got.offset = s->size; s->size += 4; dyn = htab->root.dynamic_sections_created; - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)) - htab->srelgot->size += sizeof (Elf32_External_Rela); + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)) + htab->root.srelgot->size += sizeof (Elf32_External_Rela); } else eh->datalabel_got.offset = (bfd_vma) -1; @@ -3134,10 +3147,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) || (htab->root.dynamic_sections_created && ! SYMBOL_CALLS_LOCAL (info, h)))) { - if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h)) + if (!bfd_link_pic (info) && SYMBOL_FUNCDESC_LOCAL (info, h)) htab->srofixup->size += eh->abs_funcdesc_refcount * 4; else - htab->srelgot->size + htab->root.srelgot->size += eh->abs_funcdesc_refcount * sizeof (Elf32_External_Rela); } @@ -3158,7 +3171,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* We will need a relocation or two fixups to initialize the function descriptor, so allocate those too. */ - if (!info->shared && SYMBOL_CALLS_LOCAL (info, h)) + if (!bfd_link_pic (info) && SYMBOL_CALLS_LOCAL (info, h)) htab->srofixup->size += 8; else htab->srelfuncdesc->size += sizeof (Elf32_External_Rela); @@ -3173,7 +3186,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) space for pc-relative relocs that have become local due to symbol visibility changes. */ - if (info->shared) + if (bfd_link_pic (info)) { if (SYMBOL_CALLS_LOCAL (info, h)) { @@ -3261,7 +3274,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) sreloc->size += p->count * sizeof (Elf32_External_Rela); /* If we need relocations, we do not need fixups. */ - if (htab->fdpic_p && !info->shared) + if (htab->fdpic_p && !bfd_link_pic (info)) htab->srofixup->size -= 4 * (p->count - p->pc_count); } @@ -3301,9 +3314,10 @@ readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf) static bfd_boolean sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info) { - sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared); + sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, + bfd_link_pic (info)); - if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable + if (sh_elf_hash_table (info)->fdpic_p && !bfd_link_relocatable (info) && !bfd_elf_stack_segment_size (output_bfd, info, "__stacksize", DEFAULT_STACK_SIZE)) return FALSE; @@ -3332,7 +3346,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->root.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); @@ -3343,7 +3357,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* Set up .got offsets for local syms, and space for local dynamic relocs. */ - for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) + for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) { bfd_signed_vma *local_got; bfd_signed_vma *end_local_got; @@ -3388,7 +3402,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, info->flags |= DF_TEXTREL; /* If we need relocations, we do not need fixups. */ - if (htab->fdpic_p && !info->shared) + if (htab->fdpic_p && !bfd_link_pic (info)) htab->srofixup->size -= 4 * (p->count - p->pc_count); } } @@ -3400,8 +3414,8 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* Count datalabel local GOT. */ locsymcount *= 2; #endif - s = htab->sgot; - srel = htab->srelgot; + s = htab->root.sgot; + srel = htab->root.srelgot; local_got = elf_local_got_refcounts (ibfd); if (local_got) @@ -3417,7 +3431,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, s->size += 4; if (*local_got_type == GOT_TLS_GD) s->size += 4; - if (info->shared) + if (bfd_link_pic (info)) srel->size += sizeof (Elf32_External_Rela); else htab->srofixup->size += 4; @@ -3458,7 +3472,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, { local_funcdesc->offset = htab->sfuncdesc->size; htab->sfuncdesc->size += 8; - if (!info->shared) + if (!bfd_link_pic (info)) htab->srofixup->size += 8; else htab->srelfuncdesc->size += sizeof (Elf32_External_Rela); @@ -3474,9 +3488,9 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, { /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32 relocs. */ - htab->tls_ldm_got.offset = htab->sgot->size; - htab->sgot->size += 8; - htab->srelgot->size += sizeof (Elf32_External_Rela); + htab->tls_ldm_got.offset = htab->root.sgot->size; + htab->root.sgot->size += 8; + htab->root.srelgot->size += sizeof (Elf32_External_Rela); } else htab->tls_ldm_got.offset = -1; @@ -3485,8 +3499,8 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, the end of .got.plt. */ if (htab->fdpic_p) { - BFD_ASSERT (htab->sgotplt && htab->sgotplt->size == 12); - htab->sgotplt->size = 0; + BFD_ASSERT (htab->root.sgotplt && htab->root.sgotplt->size == 12); + htab->root.sgotplt->size = 0; } /* Allocate global sym .plt and .got entries, and space for global @@ -3497,8 +3511,8 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, end of the FDPIC .got.plt. */ if (htab->fdpic_p) { - htab->root.hgot->root.u.def.value = htab->sgotplt->size; - htab->sgotplt->size += 12; + htab->root.hgot->root.u.def.value = htab->root.sgotplt->size; + htab->root.sgotplt->size += 12; } /* At the very end of the .rofixup section is a pointer to the GOT. */ @@ -3513,9 +3527,9 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if ((s->flags & SEC_LINKER_CREATED) == 0) continue; - if (s == htab->splt - || s == htab->sgot - || s == htab->sgotplt + if (s == htab->root.splt + || s == htab->root.sgot + || s == htab->root.sgotplt || s == htab->sfuncdesc || s == htab->srofixup || s == htab->sdynbss) @@ -3525,7 +3539,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, } else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela")) { - if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2) + if (s->size != 0 && s != htab->root.srelplt && s != htab->srelplt2) relocs = TRUE; /* We use the reloc_count field as a counter if we need @@ -3577,13 +3591,13 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, #define add_dynamic_entry(TAG, VAL) \ _bfd_elf_add_dynamic_entry (info, TAG, VAL) - if (info->executable) + if (bfd_link_executable (info)) { if (! add_dynamic_entry (DT_DEBUG, 0)) return FALSE; } - if (htab->splt->size != 0) + if (htab->root.splt->size != 0) { if (! add_dynamic_entry (DT_PLTGOT, 0) || ! add_dynamic_entry (DT_PLTRELSZ, 0) @@ -3591,8 +3605,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, || ! add_dynamic_entry (DT_JMPREL, 0)) return FALSE; } - else if ((elf_elfheader (output_bfd)->e_flags & EF_SH_FDPIC) - && htab->sgot->size != 0) + else if ((elf_elfheader (output_bfd)->e_flags & EF_SH_FDPIC)) { if (! add_dynamic_entry (DT_PLTGOT, 0)) return FALSE; @@ -3666,7 +3679,7 @@ sh_elf_add_rofixup (bfd *output_bfd, asection *srofixup, bfd_vma offset) static bfd_signed_vma sh_elf_got_offset (struct elf_sh_link_hash_table *htab) { - return (htab->sgot->output_offset - htab->sgotplt->output_offset + return (htab->root.sgot->output_offset - htab->root.sgotplt->output_offset - htab->root.hgot->root.u.def.value); } @@ -3678,7 +3691,9 @@ sh_elf_osec_to_segment (bfd *output_bfd, asection *osec) { Elf_Internal_Phdr *p = NULL; - if (output_bfd->xvec->flavour == bfd_target_elf_flavour) + if (output_bfd->xvec->flavour == bfd_target_elf_flavour + /* PR ld/17110: Do not look for output segments in an input bfd. */ + && output_bfd->direction != read_direction) p = _bfd_elf_find_segment_containing_section (output_bfd, osec); /* FIXME: Nothing ever says what this index is relative to. The kernel @@ -3735,7 +3750,7 @@ sh_elf_initialize_funcdesc (bfd *output_bfd, addr = seg = 0; } - if (!info->shared && SYMBOL_CALLS_LOCAL (info, h)) + if (!bfd_link_pic (info) && SYMBOL_CALLS_LOCAL (info, h)) { if (h == NULL || h->root.type != bfd_link_hash_undefweak) { @@ -3811,7 +3826,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes; Elf_Internal_Rela *rel, *relend; - bfd *dynobj = NULL; bfd_vma *local_got_offsets; asection *sgot = NULL; asection *sgotplt = NULL; @@ -3827,10 +3841,10 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, htab = sh_elf_hash_table (info); if (htab != NULL) { - dynobj = htab->root.dynobj; - sgot = htab->sgot; - sgotplt = htab->sgotplt; - splt = htab->splt; + sgot = htab->root.sgot; + sgotplt = htab->root.sgotplt; + srelgot = htab->root.srelgot; + splt = htab->root.splt; fdpic_p = htab->fdpic_p; } symtab_hdr = &elf_symtab_hdr (input_bfd); @@ -3852,7 +3866,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, /* We have to handle relocations in vxworks .tls_vars sections specially, because the dynamic loader is 'weird'. */ - is_vxworks_tls = (htab && htab->vxworks_p && info->shared + is_vxworks_tls = (htab && htab->vxworks_p && bfd_link_pic (info) && !strcmp (input_section->output_section->name, ".tls_vars")); @@ -3934,15 +3948,15 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, datalabel processing here. Make sure this does not change without notice. */ if ((sym->st_other & STO_SH5_ISA32) != 0) - ((*info->callbacks->reloc_dangerous) - (info, - _("Unexpected STO_SH5_ISA32 on local symbol is not handled"), - input_bfd, input_section, rel->r_offset)); + (*info->callbacks->reloc_dangerous) + (info, + _("Unexpected STO_SH5_ISA32 on local symbol is not handled"), + input_bfd, input_section, rel->r_offset); if (sec != NULL && discarded_section (sec)) /* Handled below. */ ; - else if (info->relocatable) + else if (bfd_link_relocatable (info)) { /* This is a relocatable link. We don't have to change anything, unless the reloc is against a section symbol, @@ -3990,10 +4004,11 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (howto->rightshift || howto->src_mask != 0xffffffff) { - (*_bfd_error_handler) - (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"), + _bfd_error_handler + /* xgettext:c-format */ + (_("%B(%A+%#Lx): %s relocation against SEC_MERGE section"), input_bfd, input_section, - (long) rel->r_offset, howto->name); + rel->r_offset, howto->name); return FALSE; } @@ -4057,8 +4072,10 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, || r_type == R_SH_GOT_MEDLOW16 || r_type == R_SH_GOT_MEDHI16 || r_type == R_SH_GOT_HI16) - && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) - && (! info->shared + && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + h) + && (! bfd_link_pic (info) || (! info->symbolic && h->dynindx != -1) || !h->def_regular)) /* The cases above are those in which relocation is @@ -4066,7 +4083,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, below are those in which we must defer relocation to run-time, because we can't resolve absolute addresses when creating a shared library. */ - || (info->shared + || (bfd_link_pic (info) && ((! info->symbolic && h->dynindx != -1) || !h->def_regular) && ((r_type == R_SH_DIR32 @@ -4099,17 +4116,18 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, STT_DATALABEL on the way to it. */ | ((h->other & STO_SH5_ISA32) != 0 && ! seen_stt_datalabel)); - else if (!info->relocatable + else if (!bfd_link_relocatable (info) && (_bfd_elf_section_offset (output_bfd, info, input_section, rel->r_offset) != (bfd_vma) -1)) { - (*_bfd_error_handler) - (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), + _bfd_error_handler + /* xgettext:c-format */ + (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"), input_bfd, input_section, - (long) rel->r_offset, + rel->r_offset, howto->name, h->root.root.string); return FALSE; @@ -4120,22 +4138,19 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, else if (info->unresolved_syms_in_objects == RM_IGNORE && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) ; - else if (!info->relocatable) - { - if (! info->callbacks->undefined_symbol - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset, - (info->unresolved_syms_in_objects == RM_GENERATE_ERROR - || ELF_ST_VISIBILITY (h->other)))) - return FALSE; - } + else if (!bfd_link_relocatable (info)) + (*info->callbacks->undefined_symbol) + (info, h->root.root.string, input_bfd, + input_section, rel->r_offset, + (info->unresolved_syms_in_objects == RM_GENERATE_ERROR + || ELF_ST_VISIBILITY (h->other))); } if (sec != NULL && discarded_section (sec)) RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; /* Check for inter-segment relocations in FDPIC files. Most @@ -4186,10 +4201,11 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } if (disp & mask) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"), - input_section->owner, - (unsigned long) rel->r_offset)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: fatal: unaligned branch target for relax-support relocation"), + input_section->owner, + rel->r_offset); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -4219,11 +4235,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_SH_DIR4UL: if (relocation & 3) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"), - input_section->owner, - (unsigned long) rel->r_offset, howto->name, - (unsigned long) relocation)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: fatal: unaligned %s relocation %#Lx"), + input_section->owner, + rel->r_offset, howto->name, + relocation); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -4234,11 +4251,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_SH_DIR4UW: if (relocation & 1) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"), - input_section->owner, - (unsigned long) rel->r_offset, howto->name, - (unsigned long) relocation)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: fatal: unaligned %s relocation %#Lx"), + input_section->owner, + rel->r_offset, howto->name, + relocation); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -4248,11 +4266,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if ((signed int)relocation < -32 || (signed int)relocation > 32) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"), - input_section->owner, - (unsigned long) rel->r_offset, - (unsigned long) relocation)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: fatal: R_SH_PSHA relocation %Ld not in range -32..32"), + input_section->owner, + rel->r_offset, + relocation); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -4262,11 +4281,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if ((signed int)relocation < -16 || (signed int)relocation > 16) { - ((*_bfd_error_handler) - (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"), - input_section->owner, - (unsigned long) rel->r_offset, - (unsigned long) relocation)); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: %#Lx: fatal: R_SH_PSHL relocation %Ld not in range -32..32"), + input_section->owner, + rel->r_offset, + relocation); bfd_set_error (bfd_error_bad_value); return FALSE; } @@ -4280,7 +4300,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_SH_IMM_MEDHI16_PCREL: case R_SH_IMM_HI16_PCREL: #endif - if (info->shared + if (bfd_link_pic (info) && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak) @@ -4395,7 +4415,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (! relocate) continue; } - else if (fdpic_p && !info->shared + else if (fdpic_p && !bfd_link_pic (info) && r_type == R_SH_DIR32 && (input_section->flags & SEC_ALLOC) != 0) { @@ -4406,11 +4426,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (sh_elf_osec_readonly_p (output_bfd, input_section->output_section)) { - (*_bfd_error_handler) - (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"), + _bfd_error_handler + /* xgettext:c-format */ + (_("%B(%A+%#Lx): cannot emit fixup to `%s' in read-only section"), input_bfd, input_section, - (long) rel->r_offset, + rel->r_offset, symname); return FALSE; } @@ -4425,6 +4446,12 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, check_segment[0] = check_segment[1] = -1; } + /* We don't want warnings for non-NULL tests on undefined weak + symbols. */ + else if (r_type == R_SH_REL32 + && h + && h->root.type == bfd_link_hash_undefweak) + check_segment[0] = check_segment[1] = -1; goto final_link_relocate; case R_SH_GOTPLT32: @@ -4441,7 +4468,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (h == NULL || h->forced_local - || ! info->shared + || ! bfd_link_pic (info) || info->symbolic || h->dynindx == -1 || h->plt.offset == (bfd_vma) -1 @@ -4498,8 +4525,10 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, BFD_ASSERT (off != (bfd_vma) -1); dyn = htab->root.dynamic_sections_created; - if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) - || (info->shared + if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + h) + || (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) || (ELF_ST_VISIBILITY (h->other) && h->root.type == bfd_link_hash_undefweak)) @@ -4536,7 +4565,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, /* If we initialize the GOT entry here with a valid symbol address, also add a fixup. */ - if (fdpic_p && !info->shared + if (fdpic_p && !bfd_link_pic (info) && sh_elf_hash_entry (h)->got_type == GOT_NORMAL && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak)) @@ -4582,18 +4611,11 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, { bfd_put_32 (output_bfd, relocation, sgot->contents + off); - if (info->shared) + if (bfd_link_pic (info)) { Elf_Internal_Rela outrel; bfd_byte *loc; - if (srelgot == NULL) - { - srelgot = bfd_get_linker_section (dynobj, - ".rela.got"); - BFD_ASSERT (srelgot != NULL); - } - outrel.r_offset = (sgot->output_section->vma + sgot->output_offset + off); @@ -4869,18 +4891,19 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, relocation = htab->sfuncdesc->output_offset + (offset & ~1); } - if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h)) + if (!bfd_link_pic (info) && SYMBOL_FUNCDESC_LOCAL (info, h)) { bfd_vma offset; if (sh_elf_osec_readonly_p (output_bfd, reloc_section->output_section)) { - (*_bfd_error_handler) - (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"), + _bfd_error_handler + /* xgettext:c-format */ + (_("%B(%A+%#Lx): cannot emit fixup to `%s' in read-only section"), input_bfd, input_section, - (long) rel->r_offset, + rel->r_offset, symname); return FALSE; } @@ -4909,12 +4932,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, return FALSE; } - if (srelgot == NULL) - { - srelgot = bfd_get_linker_section (dynobj, ".rela.got"); - BFD_ASSERT (srelgot != NULL); - } - offset = _bfd_elf_section_offset (output_bfd, info, reloc_section, reloc_offset); @@ -4984,8 +5001,9 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, || !SYMBOL_FUNCDESC_LOCAL (info, h))) { _bfd_error_handler - (_("%B(%A+0x%lx): %s relocation against external symbol \"%s\""), - input_bfd, input_section, (long) rel->r_offset, howto->name, + /* xgettext:c-format */ + (_("%B(%A+%#Lx): %s relocation against external symbol \"%s\""), + input_bfd, input_section, rel->r_offset, howto->name, h->root.root.string); return FALSE; } @@ -5072,7 +5090,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, else if (h != NULL) { got_type = sh_elf_hash_entry (h)->got_type; - if (! info->shared + if (! bfd_link_pic (info) && (h->dynindx == -1 || h->def_regular)) r_type = R_SH_TLS_LE_32; @@ -5199,12 +5217,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, bfd_byte *loc; int dr_type, indx; - if (srelgot == NULL) - { - srelgot = bfd_get_linker_section (dynobj, ".rela.got"); - BFD_ASSERT (srelgot != NULL); - } - outrel.r_offset = (sgot->output_section->vma + sgot->output_offset + off); @@ -5316,7 +5328,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_SH_TLS_LD_32: BFD_ASSERT (htab); check_segment[0] = check_segment[1] = -1; - if (! info->shared) + if (! bfd_link_pic (info)) { bfd_vma offset; unsigned short insn; @@ -5374,10 +5386,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, Elf_Internal_Rela outrel; bfd_byte *loc; - srelgot = htab->srelgot; - if (srelgot == NULL) - abort (); - outrel.r_offset = (sgot->output_section->vma + sgot->output_offset + off); outrel.r_addend = 0; @@ -5395,7 +5403,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_SH_TLS_LDO_32: check_segment[0] = check_segment[1] = -1; - if (! info->shared) + if (! bfd_link_pic (info)) relocation = tpoff (info, relocation); else relocation -= dtpoff_base (info); @@ -5411,7 +5419,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, check_segment[0] = check_segment[1] = -1; - if (! info->shared || info->pie) + if (!bfd_link_dll (info)) { relocation = tpoff (info, relocation); addend = rel->r_addend; @@ -5454,20 +5462,22 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, /* We don't want duplicate errors for undefined symbols. */ if (!h || h->root.type != bfd_link_hash_undefined) { - if (info->shared) + if (bfd_link_pic (info)) { info->callbacks->einfo + /* xgettext:c-format */ (_("%X%C: relocation to \"%s\" references a different segment\n"), input_bfd, input_section, rel->r_offset, symname); return FALSE; } else info->callbacks->einfo + /* xgettext:c-format */ (_("%C: warning: relocation to \"%s\" references a different segment\n"), input_bfd, input_section, rel->r_offset, symname); } - elf_elfheader (output_bfd)->e_flags &= ~EF_SH_PIC; + elf_elfheader (output_bfd)->e_flags |= EF_SH_PIC; } if (r != bfd_reloc_ok) @@ -5492,11 +5502,9 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (*name == '\0') name = bfd_section_name (input_bfd, sec); } - if (! ((*info->callbacks->reloc_overflow) - (info, (h ? &h->root : NULL), name, howto->name, - (bfd_vma) 0, input_bfd, input_section, - rel->r_offset))) - return FALSE; + (*info->callbacks->reloc_overflow) + (info, (h ? &h->root : NULL), name, howto->name, + (bfd_vma) 0, input_bfd, input_section, rel->r_offset); } break; } @@ -5659,220 +5667,6 @@ sh_elf_gc_mark_hook (asection *sec, return _bfd_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 (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; - bfd_signed_vma *local_got_refcounts; - union gotref *local_funcdesc; - const Elf_Internal_Rela *rel, *relend; - - if (info->relocatable) - return TRUE; - - elf_section_data (sec)->local_dynrel = NULL; - - symtab_hdr = &elf_symtab_hdr (abfd); - sym_hashes = elf_sym_hashes (abfd); - local_got_refcounts = elf_local_got_refcounts (abfd); - local_funcdesc = sh_elf_local_funcdesc (abfd); - - relend = relocs + sec->reloc_count; - for (rel = relocs; rel < relend; rel++) - { - unsigned long r_symndx; - unsigned int r_type; - struct elf_link_hash_entry *h = NULL; -#ifdef INCLUDE_SHMEDIA - int seen_stt_datalabel = 0; -#endif - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - struct elf_sh_link_hash_entry *eh; - struct elf_sh_dyn_relocs **pp; - struct elf_sh_dyn_relocs *p; - - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - { -#ifdef INCLUDE_SHMEDIA - seen_stt_datalabel |= h->type == STT_DATALABEL; -#endif - h = (struct elf_link_hash_entry *) h->root.u.i.link; - } - eh = (struct elf_sh_link_hash_entry *) h; - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) - if (p->sec == sec) - { - /* Everything must go for SEC. */ - *pp = p->next; - break; - } - } - - r_type = ELF32_R_TYPE (rel->r_info); - switch (sh_elf_optimized_tls_reloc (info, r_type, h != NULL)) - { - case R_SH_TLS_LD_32: - if (sh_elf_hash_table (info)->tls_ldm_got.refcount > 0) - sh_elf_hash_table (info)->tls_ldm_got.refcount -= 1; - break; - - case R_SH_GOT32: - case R_SH_GOT20: - case R_SH_GOTOFF: - case R_SH_GOTOFF20: - case R_SH_GOTPC: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOT_LOW16: - case R_SH_GOT_MEDLOW16: - case R_SH_GOT_MEDHI16: - case R_SH_GOT_HI16: - case R_SH_GOT10BY4: - case R_SH_GOT10BY8: - case R_SH_GOTOFF_LOW16: - case R_SH_GOTOFF_MEDLOW16: - case R_SH_GOTOFF_MEDHI16: - case R_SH_GOTOFF_HI16: - case R_SH_GOTPC_LOW16: - case R_SH_GOTPC_MEDLOW16: - case R_SH_GOTPC_MEDHI16: - case R_SH_GOTPC_HI16: -#endif - case R_SH_TLS_GD_32: - case R_SH_TLS_IE_32: - case R_SH_GOTFUNCDESC: - case R_SH_GOTFUNCDESC20: - if (h != NULL) - { -#ifdef INCLUDE_SHMEDIA - if (seen_stt_datalabel) - { - struct elf_sh_link_hash_entry *eh; - eh = (struct elf_sh_link_hash_entry *) h; - if (eh->datalabel_got.refcount > 0) - eh->datalabel_got.refcount -= 1; - } - else -#endif - if (h->got.refcount > 0) - h->got.refcount -= 1; - } - else if (local_got_refcounts != NULL) - { -#ifdef INCLUDE_SHMEDIA - if (rel->r_addend & 1) - { - if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0) - local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1; - } - else -#endif - if (local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx] -= 1; - } - break; - - case R_SH_FUNCDESC: - if (h != NULL) - sh_elf_hash_entry (h)->abs_funcdesc_refcount -= 1; - else if (sh_elf_hash_table (info)->fdpic_p && !info->shared) - sh_elf_hash_table (info)->srofixup->size -= 4; - - /* Fall through. */ - - case R_SH_GOTOFFFUNCDESC: - case R_SH_GOTOFFFUNCDESC20: - if (h != NULL) - sh_elf_hash_entry (h)->funcdesc.refcount -= 1; - else - local_funcdesc[r_symndx].refcount -= 1; - break; - - case R_SH_DIR32: - if (sh_elf_hash_table (info)->fdpic_p && !info->shared - && (sec->flags & SEC_ALLOC) != 0) - sh_elf_hash_table (info)->srofixup->size -= 4; - /* Fall thru */ - - case R_SH_REL32: - if (info->shared) - break; - /* Fall thru */ - - case R_SH_PLT32: -#ifdef INCLUDE_SHMEDIA - case R_SH_PLT_LOW16: - case R_SH_PLT_MEDLOW16: - case R_SH_PLT_MEDHI16: - case R_SH_PLT_HI16: -#endif - if (h != NULL) - { - if (h->plt.refcount > 0) - h->plt.refcount -= 1; - } - break; - - case R_SH_GOTPLT32: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOTPLT_LOW16: - case R_SH_GOTPLT_MEDLOW16: - case R_SH_GOTPLT_MEDHI16: - case R_SH_GOTPLT_HI16: - case R_SH_GOTPLT10BY4: - case R_SH_GOTPLT10BY8: -#endif - if (h != NULL) - { - struct elf_sh_link_hash_entry *eh; - eh = (struct elf_sh_link_hash_entry *) h; - if (eh->gotplt_refcount > 0) - { - eh->gotplt_refcount -= 1; - if (h->plt.refcount > 0) - h->plt.refcount -= 1; - } -#ifdef INCLUDE_SHMEDIA - else if (seen_stt_datalabel) - { - if (eh->datalabel_got.refcount > 0) - eh->datalabel_got.refcount -= 1; - } -#endif - else if (h->got.refcount > 0) - h->got.refcount -= 1; - } - else if (local_got_refcounts != NULL) - { -#ifdef INCLUDE_SHMEDIA - if (rel->r_addend & 1) - { - if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0) - local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1; - } - else -#endif - if (local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx] -= 1; - } - break; - - default: - break; - } - } - - return TRUE; -} - /* Copy the extra info we tack onto an elf_link_hash_entry. */ static void @@ -5939,7 +5733,8 @@ sh_elf_copy_indirect_symbol (struct bfd_link_info *info, /* If called to transfer flags for a weakdef during processing of elf_adjust_dynamic_symbol, don't copy non_got_ref. We clear it ourselves for ELIMINATE_COPY_RELOCS. */ - dir->ref_dynamic |= ind->ref_dynamic; + if (dir->versioned != versioned_hidden) + dir->ref_dynamic |= ind->ref_dynamic; dir->ref_regular |= ind->ref_regular; dir->ref_regular_nonweak |= ind->ref_regular_nonweak; dir->needs_plt |= ind->needs_plt; @@ -5952,7 +5747,7 @@ static int sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type, int is_local) { - if (info->shared) + if (bfd_link_pic (info)) return r_type; switch (r_type) @@ -5988,7 +5783,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, sreloc = NULL; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; BFD_ASSERT (is_sh_elf (abfd)); @@ -6025,10 +5820,14 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, #endif h = (struct elf_link_hash_entry *) h->root.u.i.link; } + + /* PR15323, ref flags aren't set for references in the same + object. */ + h->root.non_ir_ref_regular = 1; } r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL); - if (! info->shared + if (! bfd_link_pic (info) && r_type == R_SH_TLS_IE_32 && h != NULL && h->root.type != bfd_link_hash_undefined @@ -6062,7 +5861,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, } /* Some relocs require a global offset table. */ - if (htab->sgot == NULL) + if (htab->root.sgot == NULL) { switch (r_type) { @@ -6070,6 +5869,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, /* This may require an rofixup. */ if (!htab->fdpic_p) break; + /* Fall through. */ case R_SH_GOTPLT32: case R_SH_GOT32: case R_SH_GOT20: @@ -6136,7 +5936,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, break; case R_SH_TLS_IE_32: - if (info->shared) + if (bfd_link_pic (info)) info->flags |= DF_STATIC_TLS; /* FALLTHROUGH */ @@ -6240,18 +6040,21 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, { if ((old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC) && (old_got_type == GOT_NORMAL || got_type == GOT_NORMAL)) - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as normal and FDPIC symbol"), abfd, h->root.root.string); else if (old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC) - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as FDPIC and thread local symbol"), abfd, h->root.root.string); else - (*_bfd_error_handler) - (_("%B: `%s' accessed both as normal and thread local symbol"), - abfd, h->root.root.string); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: `%s' accessed both as normal and thread local symbol"), + abfd, h->root.root.string); return FALSE; } } @@ -6275,7 +6078,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, case R_SH_GOTOFFFUNCDESC20: if (rel->r_addend) { - (*_bfd_error_handler) + _bfd_error_handler (_("%B: Function descriptor relocation with non-zero addend"), abfd); return FALSE; @@ -6305,10 +6108,10 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, if (r_type == R_SH_FUNCDESC) { - if (!info->shared) + if (!bfd_link_pic (info)) htab->srofixup->size += 4; else - htab->srelgot->size += sizeof (Elf32_External_Rela); + htab->root.srelgot->size += sizeof (Elf32_External_Rela); } } else @@ -6323,11 +6126,13 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, if (old_got_type != GOT_FUNCDESC && old_got_type != GOT_UNKNOWN) { if (old_got_type == GOT_NORMAL) - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as normal and FDPIC symbol"), abfd, h->root.root.string); else - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as FDPIC and thread local symbol"), abfd, h->root.root.string); } @@ -6348,7 +6153,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, if (h == NULL || h->forced_local - || ! info->shared + || ! bfd_link_pic (info) || info->symbolic || h->dynindx == -1) goto force_got; @@ -6393,7 +6198,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, case R_SH_IMM_MEDHI16_PCREL: case R_SH_IMM_HI16_PCREL: #endif - if (h != NULL && ! info->shared) + if (h != NULL && ! bfd_link_pic (info)) { h->non_got_ref = 1; h->plt.refcount += 1; @@ -6418,14 +6223,14 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, may need to keep relocations for symbols satisfied by a dynamic library if we manage to avoid copy relocs for the symbol. */ - if ((info->shared + if ((bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0 && (r_type != R_SH_REL32 || (h != NULL && (! info->symbolic || h->root.type == bfd_link_hash_defweak || !h->def_regular)))) - || (! info->shared + || (! bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0 && h != NULL && (h->root.type == bfd_link_hash_defweak @@ -6502,16 +6307,16 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, /* Allocate the fixup regardless of whether we need a relocation. If we end up generating the relocation, we'll unallocate the fixup. */ - if (htab->fdpic_p && !info->shared + if (htab->fdpic_p && !bfd_link_pic (info) && r_type == R_SH_DIR32 && (sec->flags & SEC_ALLOC) != 0) htab->srofixup->size += 4; break; case R_SH_TLS_LE_32: - if (info->shared && !info->pie) + if (bfd_link_dll (info)) { - (*_bfd_error_handler) + _bfd_error_handler (_("%B: TLS local exec code cannot be linked into shared objects"), abfd); return FALSE; @@ -6539,7 +6344,7 @@ sh_elf_set_mach_from_flags (bfd *abfd) { flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK; - if (flags >= sizeof(sh_ef_bfd_table)) + if (flags >= ARRAY_SIZE (sh_ef_bfd_table)) return FALSE; if (sh_ef_bfd_table[flags] == 0) @@ -6572,34 +6377,19 @@ sh_elf_get_flags_from_mach (unsigned long mach) } #endif /* not sh_elf_set_mach_from_flags */ -#ifndef sh_elf_set_private_flags -/* Function to keep SH specific file flags. */ - -static bfd_boolean -sh_elf_set_private_flags (bfd *abfd, flagword flags) -{ - BFD_ASSERT (! elf_flags_init (abfd) - || elf_elfheader (abfd)->e_flags == flags); - - elf_elfheader (abfd)->e_flags = flags; - elf_flags_init (abfd) = TRUE; - return sh_elf_set_mach_from_flags (abfd); -} -#endif /* not sh_elf_set_private_flags */ - #ifndef sh_elf_copy_private_data /* Copy backend specific data from one object module to another */ static bfd_boolean sh_elf_copy_private_data (bfd * ibfd, bfd * obfd) { - /* Copy object attributes. */ - _bfd_elf_copy_obj_attributes (ibfd, obfd); - if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd)) return TRUE; - return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags); + if (! _bfd_elf_copy_private_bfd_data (ibfd, obfd)) + return FALSE; + + return sh_elf_set_mach_from_flags (obfd); } #endif /* not sh_elf_copy_private_data */ @@ -6617,13 +6407,64 @@ sh_find_elf_flags (unsigned int arch_set) return sh_elf_get_flags_from_mach (bfd_mach); } +/* Merge the architecture type of two BFD files, such that the + resultant architecture supports all the features required + by the two input BFDs. + If the input BFDs are multually incompatible - i.e. one uses + DSP while the other uses FPU - or there is no known architecture + that fits the requirements then an error is emitted. */ + +static bfd_boolean +sh_merge_bfd_arch (bfd *ibfd, struct bfd_link_info *info) +{ + bfd *obfd = info->output_bfd; + unsigned int old_arch, new_arch, merged_arch; + + if (! _bfd_generic_verify_endian_match (ibfd, info)) + return FALSE; + + old_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (obfd)); + new_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (ibfd)); + + merged_arch = SH_MERGE_ARCH_SET (old_arch, new_arch); + + if (!SH_VALID_CO_ARCH_SET (merged_arch)) + { + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: uses %s instructions while previous modules " + "use %s instructions"), + ibfd, + SH_ARCH_SET_HAS_DSP (new_arch) ? "dsp" : "floating point", + SH_ARCH_SET_HAS_DSP (new_arch) ? "floating point" : "dsp"); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + else if (!SH_VALID_ARCH_SET (merged_arch)) + { + _bfd_error_handler + /* xgettext:c-format */ + (_("internal error: merge of architecture '%s' with " + "architecture '%s' produced unknown architecture"), + bfd_printable_name (obfd), + bfd_printable_name (ibfd)); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + + bfd_default_set_arch_mach (obfd, bfd_arch_sh, + sh_get_bfd_mach_from_arch_set (merged_arch)); + + return TRUE; +} + /* This routine initialises the elf flags when required and calls sh_merge_bfd_arch() to check dsp/fpu compatibility. */ static bfd_boolean -sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) +sh_elf_merge_private_data (bfd *ibfd, struct bfd_link_info *info) { - extern bfd_boolean sh_merge_bfd_arch (bfd *, bfd *); + bfd *obfd = info->output_bfd; if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd)) return TRUE; @@ -6635,13 +6476,13 @@ sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; sh_elf_set_mach_from_flags (obfd); if (elf_elfheader (obfd)->e_flags & EF_SH_FDPIC) - elf_elfheader (obfd)->e_flags |= EF_SH_PIC; + elf_elfheader (obfd)->e_flags &= ~EF_SH_PIC; } - if (! sh_merge_bfd_arch (ibfd, obfd)) + if (! sh_merge_bfd_arch (ibfd, info)) { - _bfd_error_handler ("%B: uses instructions which are incompatible " - "with instructions used in previous modules", + _bfd_error_handler (_("%B: uses instructions which are incompatible " + "with instructions used in previous modules"), ibfd); bfd_set_error (bfd_error_bad_value); return FALSE; @@ -6653,7 +6494,7 @@ sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) if (fdpic_object_p (ibfd) != fdpic_object_p (obfd)) { - _bfd_error_handler ("%B: attempt to mix FDPIC and non-FDPIC objects", + _bfd_error_handler (_("%B: attempt to mix FDPIC and non-FDPIC objects"), ibfd); bfd_set_error (bfd_error_bad_value); return FALSE; @@ -6708,9 +6549,9 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, BFD_ASSERT (h->dynindx != -1); - splt = htab->splt; - sgotplt = htab->sgotplt; - srelplt = htab->srelplt; + splt = htab->root.splt; + sgotplt = htab->root.sgotplt; + srelplt = htab->root.srelplt; BFD_ASSERT (splt != NULL && sgotplt != NULL && srelplt != NULL); /* Get the index in the procedure linkage table which @@ -6736,7 +6577,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, got_offset = (plt_index + 3) * 4; #ifdef GOT_BIAS - if (info->shared) + if (bfd_link_pic (info)) got_offset -= GOT_BIAS; #endif @@ -6745,7 +6586,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, plt_info->symbol_entry, plt_info->symbol_entry_size); - if (info->shared || htab->fdpic_p) + if (bfd_link_pic (info) || htab->fdpic_p) { if (plt_info->symbol_fields.got20) { @@ -6814,7 +6655,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, /* Make got_offset relative to the start of .got.plt. */ #ifdef GOT_BIAS - if (info->shared) + if (bfd_link_pic (info)) got_offset += GOT_BIAS; #endif if (htab->fdpic_p) @@ -6836,8 +6677,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, sgotplt->contents + got_offset); if (htab->fdpic_p) bfd_put_32 (output_bfd, - sh_elf_osec_to_segment (output_bfd, - htab->splt->output_section), + sh_elf_osec_to_segment (output_bfd, splt->output_section), sgotplt->contents + got_offset + 4); /* Fill in the entry in the .rela.plt section. */ @@ -6855,7 +6695,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, loc = srelplt->contents + plt_index * sizeof (Elf32_External_Rela); bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); - if (htab->vxworks_p && !info->shared) + if (htab->vxworks_p && !bfd_link_pic (info)) { /* Create the .rela.plt.unloaded relocations for this PLT entry. Begin by pointing LOC to the first such relocation. */ @@ -6864,8 +6704,8 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for the PLT entry's pointer to the .got.plt entry. */ - rel.r_offset = (htab->splt->output_section->vma - + htab->splt->output_offset + rel.r_offset = (splt->output_section->vma + + splt->output_offset + h->plt.offset + plt_info->symbol_fields.got_entry); rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32); @@ -6904,8 +6744,8 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, /* This symbol has an entry in the global offset table. Set it up. */ - sgot = htab->sgot; - srelgot = htab->srelgot; + sgot = htab->root.sgot; + srelgot = htab->root.srelgot; BFD_ASSERT (sgot != NULL && srelgot != NULL); rel.r_offset = (sgot->output_section->vma @@ -6917,7 +6757,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, of a version file, we just want to emit a RELATIVE reloc. The entry in the global offset table will already have been initialized in the relocate_section function. */ - if (info->shared + if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) { if (htab->fdpic_p) @@ -6965,8 +6805,8 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, /* This symbol has a datalabel entry in the global offset table. Set it up. */ - sgot = htab->sgot; - srelgot = htab->srelgot; + sgot = htab->root.sgot; + srelgot = htab->root.srelgot; BFD_ASSERT (sgot != NULL && srelgot != NULL); rel.r_offset = (sgot->output_section->vma @@ -6978,7 +6818,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, of a version file, we just want to emit a RELATIVE reloc. The entry in the global offset table will already have been initialized in the relocate_section function. */ - if (info->shared + if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) { if (htab->fdpic_p) @@ -7061,7 +6901,7 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) if (htab == NULL) return FALSE; - sgotplt = htab->sgotplt; + sgotplt = htab->root.sgotplt; sdyn = bfd_get_linker_section (htab->root.dynobj, ".dynamic"); if (htab->root.dynamic_sections_created) @@ -7123,41 +6963,23 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) break; case DT_JMPREL: - s = htab->srelplt->output_section; + s = htab->root.srelplt->output_section; BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->vma; bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); break; case DT_PLTRELSZ: - s = htab->srelplt->output_section; + s = htab->root.srelplt->output_section; BFD_ASSERT (s != NULL); dyn.d_un.d_val = s->size; bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); break; - - case DT_RELASZ: - /* My reading of the SVR4 ABI indicates that the - procedure linkage table relocs (DT_JMPREL) should be - included in the overall relocs (DT_RELA). This is - what Solaris does. However, UnixWare can not handle - that case. Therefore, we override the DT_RELASZ entry - here to make it not include the JMPREL relocs. Since - the linker script arranges for .rela.plt to follow all - other relocation sections, we don't have to worry - about changing the DT_RELA entry. */ - if (htab->srelplt != NULL) - { - s = htab->srelplt->output_section; - dyn.d_un.d_val -= s->size; - } - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; } } /* Fill in the first entry in the procedure linkage table. */ - splt = htab->splt; + splt = htab->root.splt; if (splt && splt->size > 0 && htab->plt_info->plt0_entry) { unsigned int i; @@ -7253,9 +7075,9 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) BFD_ASSERT (htab->srelfuncdesc->reloc_count * sizeof (Elf32_External_Rela) == htab->srelfuncdesc->size); - if (htab->srelgot) - BFD_ASSERT (htab->srelgot->reloc_count * sizeof (Elf32_External_Rela) - == htab->srelgot->size); + if (htab->root.srelgot) + BFD_ASSERT (htab->root.srelgot->reloc_count * sizeof (Elf32_External_Rela) + == htab->root.srelgot->size); return TRUE; } @@ -7410,9 +7232,9 @@ sh_elf_encode_eh_address (bfd *abfd, } #if !defined SH_TARGET_ALREADY_DEFINED -#define TARGET_BIG_SYM bfd_elf32_sh_vec +#define TARGET_BIG_SYM sh_elf32_vec #define TARGET_BIG_NAME "elf32-sh" -#define TARGET_LITTLE_SYM bfd_elf32_shl_vec +#define TARGET_LITTLE_SYM sh_elf32_le_vec #define TARGET_LITTLE_NAME "elf32-shl" #endif @@ -7437,15 +7259,12 @@ sh_elf_encode_eh_address (bfd *abfd, sh_elf_get_relocated_section_contents #define bfd_elf32_mkobject sh_elf_mkobject #define elf_backend_object_p sh_elf_object_p -#define bfd_elf32_bfd_set_private_bfd_flags \ - sh_elf_set_private_flags #define bfd_elf32_bfd_copy_private_bfd_data \ sh_elf_copy_private_data #define bfd_elf32_bfd_merge_private_bfd_data \ sh_elf_merge_private_data #define elf_backend_gc_mark_hook sh_elf_gc_mark_hook -#define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook #define elf_backend_check_relocs sh_elf_check_relocs #define elf_backend_copy_indirect_symbol \ sh_elf_copy_indirect_symbol @@ -7480,6 +7299,7 @@ sh_elf_encode_eh_address (bfd *abfd, #define elf_backend_plt_readonly 1 #define elf_backend_want_plt_sym 0 #define elf_backend_got_header_size 12 +#define elf_backend_dtrel_excludes_plt 1 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED @@ -7487,11 +7307,11 @@ sh_elf_encode_eh_address (bfd *abfd, /* NetBSD support. */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_shnbsd_vec +#define TARGET_BIG_SYM sh_elf32_nbsd_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-sh-nbsd" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_shlnbsd_vec +#define TARGET_LITTLE_SYM sh_elf32_nbsd_le_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-shl-nbsd" #undef ELF_MAXPAGESIZE @@ -7507,11 +7327,11 @@ sh_elf_encode_eh_address (bfd *abfd, /* Linux support. */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_shblin_vec +#define TARGET_BIG_SYM sh_elf32_linux_be_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-shbig-linux" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_shlin_vec +#define TARGET_LITTLE_SYM sh_elf32_linux_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-sh-linux" #undef ELF_COMMONPAGESIZE @@ -7529,11 +7349,11 @@ sh_elf_encode_eh_address (bfd *abfd, /* FDPIC support. */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_shbfd_vec +#define TARGET_BIG_SYM sh_elf32_fdpic_be_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-shbig-fdpic" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_shfd_vec +#define TARGET_LITTLE_SYM sh_elf32_fdpic_le_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-sh-fdpic" @@ -7546,11 +7366,11 @@ sh_elf_encode_eh_address (bfd *abfd, /* VxWorks support. */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_shvxworks_vec +#define TARGET_BIG_SYM sh_elf32_vxworks_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-sh-vxworks" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_shlvxworks_vec +#define TARGET_LITTLE_SYM sh_elf32_vxworks_le_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-shl-vxworks" #undef elf32_bed