diff options
Diffstat (limited to 'bfd/elfxx-sparc.c')
-rw-r--r-- | bfd/elfxx-sparc.c | 122 |
1 files changed, 64 insertions, 58 deletions
diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index 492af36..9bb71a9 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -1208,14 +1208,14 @@ _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj, return FALSE; htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!info->shared) + if (!bfd_link_pic (info)) htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); if (htab->is_vxworks) { if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2)) return FALSE; - if (info->shared) + if (bfd_link_pic (info)) { htab->plt_header_size = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); @@ -1232,7 +1232,7 @@ _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj, } if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss - || (!info->shared && !htab->srelbss)) + || (!bfd_link_pic (info) && !htab->srelbss)) abort (); return TRUE; @@ -1330,7 +1330,7 @@ sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd, && ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd) r_type = R_SPARC_REV32; - if (info->shared) + if (bfd_link_pic (info)) return r_type; switch (r_type) @@ -1377,7 +1377,7 @@ _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, int num_relocs; bfd_boolean checked_tlsgd = FALSE; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; htab = _bfd_sparc_elf_hash_table (info); @@ -1501,13 +1501,13 @@ _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_SPARC_TLS_LE_HIX22: case R_SPARC_TLS_LE_LOX10: - if (info->shared) + if (bfd_link_pic (info)) goto r_sparc_plt32; break; case R_SPARC_TLS_IE_HI22: case R_SPARC_TLS_IE_LO10: - if (info->shared) + if (bfd_link_pic (info)) info->flags |= DF_STATIC_TLS; /* Fall through */ @@ -1617,7 +1617,7 @@ _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_SPARC_TLS_GD_CALL: case R_SPARC_TLS_LDM_CALL: - if (info->shared) + if (bfd_link_pic (info)) { /* These are basically R_SPARC_TLS_WPLT30 relocs against __tls_get_addr. */ @@ -1735,7 +1735,7 @@ _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, h->non_got_ref = 1; r_sparc_plt32: - if (h != NULL && !info->shared) + if (h != NULL && !bfd_link_pic (info)) { /* We may need a .plt entry if the function this reloc refers to is in a shared lib. */ @@ -1763,19 +1763,19 @@ _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, 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 && (! _bfd_sparc_elf_howto_table[r_type].pc_relative || (h != NULL && (! SYMBOLIC_BIND (info, h) || 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 || !h->def_regular)) - || (!info->shared + || (!bfd_link_pic (info) && h != NULL && h->type == STT_GNU_IFUNC)) { @@ -1878,8 +1878,8 @@ _bfd_sparc_elf_gc_mark_hook (asection *sec, } /* FIXME: The test here, in check_relocs and in relocate_section - dealing with TLS optimization, ought to be !info->executable. */ - if (info->shared) + dealing with TLS optimization, ought to be !bfd_link_executable (info). */ + if (bfd_link_pic (info)) { switch (SPARC_ELF_R_TYPE (rel->r_info)) { @@ -1928,7 +1928,7 @@ _bfd_sparc_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, bfd_signed_vma *local_got_refcounts; const Elf_Internal_Rela *rel, *relend; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; BFD_ASSERT (is_sparc_elf (abfd) || sec->reloc_count == 0); @@ -2057,7 +2057,7 @@ _bfd_sparc_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, case R_SPARC_L44: case R_SPARC_H34: case R_SPARC_UA64: - if (info->shared) + if (bfd_link_pic (info)) break; /* Fall through. */ @@ -2158,7 +2158,7 @@ _bfd_sparc_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 @@ -2247,7 +2247,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) return FALSE; } - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h) + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h) || (h->type == STT_GNU_IFUNC && h->def_regular)) { @@ -2262,7 +2262,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) s->size = htab->plt_header_size; /* Allocate space for the .rela.plt.unloaded relocations. */ - if (htab->is_vxworks && !info->shared) + if (htab->is_vxworks && !bfd_link_pic (info)) htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2; } @@ -2293,7 +2293,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) location in the .plt. This is required to make function pointers compare as equal between the normal executable and the shared library. */ - if (! info->shared + if (! bfd_link_pic (info) && !h->def_regular) { h->root.u.def.section = s; @@ -2315,7 +2315,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) htab->elf.sgotplt->size += 4; /* ...and for the .rela.plt.unloaded relocations. */ - if (!info->shared) + if (!bfd_link_pic (info)) htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3; } } @@ -2334,7 +2334,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary, make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry. */ if (h->got.refcount > 0 - && !info->shared + && !bfd_link_pic (info) && h->dynindx == -1 && _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE) h->got.offset = (bfd_vma) -1; @@ -2369,7 +2369,9 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab); else if (tls_type == GOT_TLS_GD) htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab); - else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)) + else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + h)) htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab); } else @@ -2385,7 +2387,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)) { @@ -2557,7 +2559,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (bfd_link_executable (info)) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); @@ -2631,7 +2633,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd, s->size += SPARC_ELF_WORD_BYTES (htab); if (*local_tls_type == GOT_TLS_GD) s->size += SPARC_ELF_WORD_BYTES (htab); - if (info->shared + if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD || *local_tls_type == GOT_TLS_IE) srel->size += SPARC_ELF_RELA_BYTES (htab); @@ -2745,7 +2747,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd, #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; @@ -2864,7 +2866,7 @@ _bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *link_info ATTRIBUTE_UNUSED, bfd_boolean *again) { - if (link_info->relocatable) + if (bfd_link_relocatable (link_info)) (*link_info->callbacks->einfo) (_("%P%F: --relax and -r may not be used together\n")); @@ -2957,7 +2959,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, sreloc = elf_section_data (input_section)->sreloc; /* We have to handle relocations in vxworks .tls_vars sections specially, because the dynamic loader is 'weird'. */ - is_vxworks_tls = (htab->is_vxworks && info->shared + is_vxworks_tls = (htab->is_vxworks && bfd_link_pic (info) && !strcmp (input_section->output_section->name, ".tls_vars")); @@ -3003,7 +3005,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, sec = local_sections[r_symndx]; relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); - if (!info->relocatable + if (!bfd_link_relocatable (info) && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) { /* Relocate against local STT_GNU_IFUNC symbol. */ @@ -3041,7 +3043,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; if (h != NULL @@ -3091,7 +3093,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, case R_SPARC_32: case R_SPARC_64: - if (info->shared && h->non_got_ref) + if (bfd_link_pic (info) && h->non_got_ref) { Elf_Internal_Rela outrel; bfd_vma offset; @@ -3109,7 +3111,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, if (h->dynindx == -1 || h->forced_local - || info->executable) + || bfd_link_executable (info)) { outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE); @@ -3134,7 +3136,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, case R_SPARC_HI22: case R_SPARC_LO10: /* We should only see such relocs in static links. */ - if (info->shared) + if (bfd_link_pic (info)) abort(); relocation = (plt_sec->output_section->vma + plt_sec->output_offset + h->plt.offset); @@ -3206,8 +3208,10 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, BFD_ASSERT (off != (bfd_vma) -1); dyn = elf_hash_table (info)->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))) { /* This is actually a static link, or it is a @@ -3249,7 +3253,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, else { - if (info->shared) + if (bfd_link_pic (info)) { asection *s; Elf_Internal_Rela outrel; @@ -3382,13 +3386,13 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, || is_vxworks_tls) break; - if ((info->shared + if ((bfd_link_pic (info) && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak) && (! howto->pc_relative || !SYMBOL_CALLS_LOCAL (info, h))) - || (!info->shared + || (!bfd_link_pic (info) && h != NULL && h->dynindx != -1 && !h->non_got_ref @@ -3467,7 +3471,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, else if (h != NULL && h->dynindx != -1 && (! is_plt - || !info->shared + || !bfd_link_pic (info) || !SYMBOLIC_BIND (info, h) || !h->def_regular)) { @@ -3565,7 +3569,9 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, else if (h != NULL) { tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type; - if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE) + if (!bfd_link_pic (info) + && h->dynindx == -1 + && tls_type == GOT_TLS_IE) switch (SPARC_ELF_R_TYPE (rel->r_info)) { case R_SPARC_TLS_GD_HI22: @@ -3687,7 +3693,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, case R_SPARC_TLS_LDM_HI22: case R_SPARC_TLS_LDM_LO10: - if (! info->shared) + if (! bfd_link_pic (info)) { bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset); continue; @@ -3698,7 +3704,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, case R_SPARC_TLS_LDO_HIX22: case R_SPARC_TLS_LDO_LOX10: - if (info->shared) + if (bfd_link_pic (info)) { relocation -= dtpoff_base (info); break; @@ -3710,7 +3716,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, case R_SPARC_TLS_LE_HIX22: case R_SPARC_TLS_LE_LOX10: - if (info->shared) + if (bfd_link_pic (info)) { Elf_Internal_Rela outrel; bfd_boolean skip; @@ -3742,7 +3748,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, break; case R_SPARC_TLS_LDM_CALL: - if (! info->shared) + if (! bfd_link_pic (info)) { /* mov %g0, %o0 */ bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset); @@ -3756,13 +3762,13 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx]; else if (h != NULL) tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type; - if (! info->shared + if (! bfd_link_pic (info) || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE)) { Elf_Internal_Rela *rel2; bfd_vma insn; - if (!info->shared && (h == NULL || h->dynindx == -1)) + if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1)) { /* GD -> LE */ bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset); @@ -3832,7 +3838,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx]; else if (h != NULL) tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type; - if (! info->shared || tls_type == GOT_TLS_IE) + if (! bfd_link_pic (info) || tls_type == GOT_TLS_IE) { /* add %reg1, %reg2, %reg3, %tgd_add(foo) changed into IE: @@ -3840,7 +3846,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, or LE: add %g7, %reg2, %reg3. */ bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset); - if ((h != NULL && h->dynindx != -1) || info->shared) + if ((h != NULL && h->dynindx != -1) || bfd_link_pic (info)) relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000); else relocation = (insn & ~0x7c000) | 0x1c000; @@ -3849,12 +3855,12 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, continue; case R_SPARC_TLS_LDM_ADD: - if (! info->shared) + if (! bfd_link_pic (info)) bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset); continue; case R_SPARC_TLS_LDO_ADD: - if (! info->shared) + if (! bfd_link_pic (info)) { /* Change rs1 into %g7. */ bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset); @@ -3865,7 +3871,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, case R_SPARC_TLS_IE_LD: case R_SPARC_TLS_IE_LDX: - if (! info->shared && (h == NULL || h->dynindx == -1)) + if (! bfd_link_pic (info) && (h == NULL || h->dynindx == -1)) { bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset); int rs2 = insn & 0x1f; @@ -4226,7 +4232,7 @@ sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info, htab = _bfd_sparc_elf_hash_table (info); BFD_ASSERT (htab != NULL); - if (info->shared) + if (bfd_link_pic (info)) { plt_entry = sparc_vxworks_shared_plt_entry; got_base = 0; @@ -4270,7 +4276,7 @@ sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info, htab->elf.sgotplt->contents + got_offset); /* Add relocations to .rela.plt.unloaded. */ - if (!info->shared) + if (!bfd_link_pic (info)) { loc = (htab->srelplt2->contents + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela)); @@ -4376,7 +4382,7 @@ _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd, if (h == NULL || h->dynindx == -1 - || ((info->executable + || ((bfd_link_executable (info) || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) && h->def_regular && h->type == STT_GNU_IFUNC)) @@ -4476,7 +4482,7 @@ _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd, the symbol was forced to be local because of a version file. 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) && h->type == STT_GNU_IFUNC && h->def_regular) { @@ -4491,7 +4497,7 @@ _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd, + (h->got.offset & ~(bfd_vma) 1)); return TRUE; } - else if (info->shared + else if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) { asection *sec = h->root.u.def.section; @@ -4779,7 +4785,7 @@ _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i { if (htab->is_vxworks) { - if (info->shared) + if (bfd_link_pic (info)) sparc_vxworks_finish_shared_plt (output_bfd, info); else sparc_vxworks_finish_exec_plt (output_bfd, info); |