X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-tic6x.c;h=380ab8dd2bf742dbea8e651cd6711997a9ded47a;hb=b72dd4c228d71b44e487ff2c53c0d2883653bce7;hp=fb30e923a52c68b69cf1d5cd3671a00d1adce73d;hpb=68ffbac672c0d7f2566e715f878e65ed9b44795f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index fb30e923a5..380ab8dd2b 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -1,6 +1,5 @@ /* 32-bit ELF support for TI C6X - Copyright 2010, 2011, 2012 - Free Software Foundation, Inc. + Copyright (C) 2010-2015 Free Software Foundation, Inc. Contributed by Joseph Myers Bernd Schmidt @@ -153,7 +152,7 @@ static reloc_howto_type elf32_tic6x_howto_table[] = { HOWTO (R_C6000_NONE, /* type */ 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ + 3, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ @@ -821,7 +820,7 @@ static reloc_howto_type elf32_tic6x_howto_table_rel[] = { HOWTO (R_C6000_NONE, /* type */ 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ + 3, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ @@ -1570,7 +1569,7 @@ elf32_tic6x_link_hash_table_create (bfd *abfd) struct elf32_tic6x_link_hash_table *ret; bfd_size_type amt = sizeof (struct elf32_tic6x_link_hash_table); - ret = bfd_malloc (amt); + ret = bfd_zmalloc (amt); if (ret == NULL) return NULL; @@ -1583,7 +1582,6 @@ elf32_tic6x_link_hash_table_create (bfd *abfd) return NULL; } - ret->sym_cache.abfd = NULL; ret->obfd = abfd; ret->elf.is_relocatable_executable = 1; @@ -1593,7 +1591,7 @@ elf32_tic6x_link_hash_table_create (bfd *abfd) static bfd_boolean elf32_tic6x_final_link (bfd *abfd, struct bfd_link_info *info) { - if (info->shared) + if (bfd_link_pic (info)) { obj_attribute *out_attr; out_attr = elf_known_obj_attributes_proc (abfd); @@ -1615,14 +1613,6 @@ elf32_tic6x_final_link (bfd *abfd, struct bfd_link_info *info) return TRUE; } -/* Destroy a C6X ELF linker hash table. */ - -static void -elf32_tic6x_link_hash_table_free (struct bfd_link_hash_table *hash) -{ - _bfd_generic_link_hash_table_free (hash); -} - /* Called to pass PARAMS to the backend. We store them in the hash table associated with INFO. */ @@ -1671,11 +1661,11 @@ elf32_tic6x_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) 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->sdynbss - || (!info->shared && !htab->srelbss)) + || (!bfd_link_pic (info) && !htab->srelbss)) abort (); return TRUE; @@ -1771,7 +1761,7 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd, it up. */ if ((h->dynindx == -1 - && !((h->forced_local || info->executable) + && !((h->forced_local || bfd_link_executable (info)) && h->def_regular && h->type == STT_GNU_IFUNC)) || plt == NULL @@ -1858,8 +1848,8 @@ elf32_tic6x_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 - && (info->symbolic + if (bfd_link_pic (info) + && (SYMBOLIC_BIND (info, h) || h->dynindx == -1 || h->forced_local) && h->def_regular) { asection *s = h->root.u.def.section; @@ -1929,7 +1919,7 @@ elf32_tic6x_gc_mark_extra_sections (struct bfd_link_info *info, while (again) { again = FALSE; - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) + for (sub = info->input_bfds; sub != NULL; sub = sub->link.next) { asection *o; @@ -2003,7 +1993,7 @@ elf32_tic6x_gc_sweep_hook (bfd *abfd, bfd_signed_vma *local_got_refcounts; const Elf_Internal_Rela *rel, *relend; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; htab = elf32_tic6x_hash_table (info); @@ -2138,7 +2128,7 @@ elf32_tic6x_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 @@ -2178,7 +2168,7 @@ elf32_tic6x_adjust_dynamic_symbol (struct bfd_link_info *info, s = htab->sdynbss; - return _bfd_elf_adjust_dynamic_copy (h, s); + return _bfd_elf_adjust_dynamic_copy (info, h, s); } static bfd_boolean @@ -2319,19 +2309,19 @@ elf32_tic6x_relocate_section (bfd *output_bfd, } else { - bfd_boolean warned; + bfd_boolean warned, ignored; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, h, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); } 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)) { if (is_rel && sym != NULL @@ -2413,7 +2403,7 @@ elf32_tic6x_relocate_section (bfd *output_bfd, case R_C6000_DSBT_INDEX: relocation = elf32_tic6x_hash_table (info)->params.dsbt_index; - if (!info->shared || relocation != 0) + if (!bfd_link_pic (info) || relocation != 0) break; /* fall through */ @@ -2426,7 +2416,7 @@ elf32_tic6x_relocate_section (bfd *output_bfd, /* When generating a shared object or relocatable executable, these relocations are copied into the output file to be resolved at run time. */ - if ((info->shared || elf32_tic6x_using_dsbt (output_bfd)) + if ((bfd_link_pic (info) || elf32_tic6x_using_dsbt (output_bfd)) && (input_section->flags & SEC_ALLOC) && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT @@ -2458,8 +2448,8 @@ elf32_tic6x_relocate_section (bfd *output_bfd, memset (&outrel, 0, sizeof outrel); else if (h != NULL && h->dynindx != -1 - && (!info->shared - || !info->symbolic + && (!bfd_link_pic (info) + || !SYMBOLIC_BIND (info, h) || !h->def_regular)) { outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); @@ -2554,8 +2544,10 @@ elf32_tic6x_relocate_section (bfd *output_bfd, off = h->got.offset; dyn = htab->elf.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)) @@ -2580,7 +2572,8 @@ elf32_tic6x_relocate_section (bfd *output_bfd, htab->elf.sgot->contents + off); h->got.offset |= 1; - if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, + if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), h) && !(ELF_ST_VISIBILITY (h->other) && h->root.type == bfd_link_hash_undefweak)) @@ -2608,7 +2601,7 @@ elf32_tic6x_relocate_section (bfd *output_bfd, bfd_put_32 (output_bfd, relocation, htab->elf.sgot->contents + off); - if (info->shared || elf32_tic6x_using_dsbt (output_bfd)) + if (bfd_link_pic (info) || elf32_tic6x_using_dsbt (output_bfd)) elf32_tic6x_make_got_dynreloc (output_bfd, htab, sec, off); local_got_offsets[r_symndx] |= 1; @@ -2788,7 +2781,7 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info, const Elf_Internal_Rela *rel_end; asection *sreloc; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; htab = elf32_tic6x_hash_table (info); @@ -2797,7 +2790,7 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info, /* Create dynamic sections for relocatable executables so that we can copy relocations. */ - if ((info->shared || elf32_tic6x_using_dsbt (abfd)) + if ((bfd_link_pic (info) || elf32_tic6x_using_dsbt (abfd)) && ! htab->elf.dynamic_sections_created) { if (! _bfd_elf_link_create_dynamic_sections (abfd, info)) @@ -2841,6 +2834,10 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info, while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) 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 = 1; } switch (r_type) @@ -2908,7 +2905,7 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info, store the number of R_C6000_DSBT_INDEX relocs in the pc_count field, and potentially discard the extra space in elf32_tic6x_allocate_dynrelocs. */ - if (!info->shared) + if (!bfd_link_pic (info)) break; /* fall through */ @@ -2939,7 +2936,7 @@ elf32_tic6x_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 || elf32_tic6x_using_dsbt (abfd)) + if ((bfd_link_pic (info) || elf32_tic6x_using_dsbt (abfd)) && (sec->flags & SEC_ALLOC) != 0) { struct elf_dyn_relocs *p; @@ -3012,7 +3009,7 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_C6000_SBR_H16_B: case R_C6000_SBR_H16_H: case R_C6000_SBR_H16_W: - if (h != NULL && info->executable) + if (h != NULL && bfd_link_executable (info)) { /* For B14-relative addresses, we might need a copy reloc. */ @@ -3043,7 +3040,7 @@ elf32_tic6x_add_symbol_hook (bfd *abfd, *secp = bfd_make_section_old_way (abfd, ".scommon"); (*secp)->flags |= SEC_IS_COMMON; *valp = sym->st_size; - bfd_set_section_alignment (abfd, *secp, bfd_log2 (sym->st_value)); + (void) bfd_set_section_alignment (abfd, *secp, bfd_log2 (sym->st_value)); break; } @@ -3136,7 +3133,7 @@ elf32_tic6x_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->elf.splt; @@ -3153,7 +3150,7 @@ elf32_tic6x_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 && !h->def_regular) + if (! bfd_link_pic (info) && !h->def_regular) { h->root.u.def.section = s; h->root.u.def.value = h->plt.offset; @@ -3208,7 +3205,7 @@ elf32_tic6x_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* Discard relocs on undefined weak syms with non-default visibility. */ - if (info->shared || elf32_tic6x_using_dsbt (htab->obfd)) + if (bfd_link_pic (info) || elf32_tic6x_using_dsbt (htab->obfd)) { /* We use the pc_count field to hold the number of R_C6000_DSBT_INDEX relocs. */ @@ -3303,7 +3300,7 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) if (htab->elf.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"); if (s == NULL) @@ -3315,12 +3312,10 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) /* 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; - char *local_tls_type; - bfd_vma *local_tlsdesc_gotent; bfd_size_type locsymcount; Elf_Internal_Shdr *symtab_hdr; asection *srel; @@ -3361,15 +3356,14 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) end_local_got = local_got + locsymcount; s = htab->elf.sgot; srel = htab->elf.srelgot; - for (; local_got < end_local_got; - ++local_got, ++local_tls_type, ++local_tlsdesc_gotent) + for (; local_got < end_local_got; ++local_got) { if (*local_got > 0) { *local_got = s->size; s->size += 4; - if (info->shared || elf32_tic6x_using_dsbt (output_bfd)) + if (bfd_link_pic (info) || elf32_tic6x_using_dsbt (output_bfd)) { srel->size += sizeof (Elf32_External_Rela); } @@ -3468,7 +3462,7 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) #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; @@ -3520,7 +3514,7 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) static bfd_boolean elf32_tic6x_always_size_sections (bfd *output_bfd, struct bfd_link_info *info) { - if (elf32_tic6x_using_dsbt (output_bfd) && !info->relocatable + if (elf32_tic6x_using_dsbt (output_bfd) && !bfd_link_relocatable (info) && !bfd_elf_stack_segment_size (output_bfd, info, "__stacksize", DEFAULT_STACK_SIZE)) return FALSE; @@ -4060,7 +4054,7 @@ elf32_tic6x_fix_exidx_coverage (asection **text_section_order, /* Walk over all EXIDX sections, and create backlinks from the corrsponding text sections. */ - for (inp = info->input_bfds; inp != NULL; inp = inp->link_next) + for (inp = info->input_bfds; inp != NULL; inp = inp->link.next) { asection *sec; @@ -4354,17 +4348,9 @@ elf32_tic6x_write_section (bfd *output_bfd, return TRUE; } -static void -elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info) -{ - if (link_info != NULL && link_info->relocatable) - return; - _bfd_elf_set_osabi (abfd, link_info); -} - -#define TARGET_LITTLE_SYM bfd_elf32_tic6x_le_vec +#define TARGET_LITTLE_SYM tic6x_elf32_le_vec #define TARGET_LITTLE_NAME "elf32-tic6x-le" -#define TARGET_BIG_SYM bfd_elf32_tic6x_be_vec +#define TARGET_BIG_SYM tic6x_elf32_be_vec #define TARGET_BIG_NAME "elf32-tic6x-be" #define ELF_ARCH bfd_arch_tic6x #define ELF_TARGET_ID TIC6X_ELF_DATA @@ -4375,7 +4361,6 @@ elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info) #define bfd_elf32_bfd_merge_private_bfd_data elf32_tic6x_merge_private_bfd_data #define bfd_elf32_mkobject elf32_tic6x_mkobject #define bfd_elf32_bfd_link_hash_table_create elf32_tic6x_link_hash_table_create -#define bfd_elf32_bfd_link_hash_table_free elf32_tic6x_link_hash_table_free #define bfd_elf32_new_section_hook elf32_tic6x_new_section_hook #define elf_backend_stack_align 8 #define elf_backend_can_gc_sections 1 @@ -4434,36 +4419,30 @@ elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info) #define elf32_bed elf32_tic6x_linux_bed #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_tic6x_linux_le_vec +#define TARGET_LITTLE_SYM tic6x_elf32_linux_le_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-tic6x-linux-le" #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_tic6x_linux_be_vec +#define TARGET_BIG_SYM tic6x_elf32_linux_be_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-tic6x-linux-be" #undef ELF_OSABI #define ELF_OSABI ELFOSABI_C6000_LINUX -#undef elf_backend_post_process_headers -#define elf_backend_post_process_headers elf32_tic6x_set_osabi - #include "elf32-target.h" #undef elf32_bed #define elf32_bed elf32_tic6x_elf_bed #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_tic6x_elf_le_vec +#define TARGET_LITTLE_SYM tic6x_elf32_c6000_le_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-tic6x-elf-le" #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_tic6x_elf_be_vec +#define TARGET_BIG_SYM tic6x_elf32_c6000_be_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-tic6x-elf-be" #undef ELF_OSABI #define ELF_OSABI ELFOSABI_C6000_ELFABI -#undef elf_backend_post_process_headers -#define elf_backend_post_process_headers elf32_tic6x_set_osabi - #include "elf32-target.h"