| Index: bfd/elf32-tic6x.c
|
| diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
|
| index dbe2c16ebe3b651080cf4182b2a4dcad0d683c3e..92726b2af4410c4f24373b3e6ac02de9ed82f633 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 2010-2013 Free Software Foundation, Inc.
|
| Contributed by Joseph Myers <joseph@codesourcery.com>
|
| Bernd Schmidt <bernds@codesourcery.com>
|
|
|
| @@ -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;
|
|
|
| @@ -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. */
|
|
|
| @@ -1787,7 +1777,7 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd,
|
| Get the offset into the .got table of the entry that
|
| corresponds to this function. Each .got entry is 4 bytes.
|
| The first three are reserved.
|
| -
|
| +
|
| For static executables, we don't reserve anything. */
|
|
|
| plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
|
| @@ -1903,7 +1893,7 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd,
|
| }
|
|
|
| /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
|
| - if (strcmp (h->root.root.string, "_DYNAMIC") == 0
|
| + if (h == elf_hash_table (info)->hdynamic
|
| || h == elf_hash_table (info)->hgot)
|
| sym->st_shndx = SHN_ABS;
|
|
|
| @@ -2319,12 +2309,12 @@ 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))
|
| @@ -2841,6 +2831,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)
|
| @@ -3043,7 +3037,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;
|
| }
|
|
|
| @@ -3319,8 +3313,6 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
| {
|
| 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,8 +3353,7 @@ 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)
|
| {
|
| @@ -3520,79 +3511,10 @@ 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)
|
| - {
|
| - struct elf_link_hash_entry *h;
|
| -
|
| - /* Force a PT_GNU_STACK segment to be created. */
|
| - if (! elf_tdata (output_bfd)->stack_flags)
|
| - elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
|
| -
|
| - /* Define __stacksize if it's not defined yet. */
|
| - h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
|
| - FALSE, FALSE, FALSE);
|
| - if (! h || h->root.type != bfd_link_hash_defined
|
| - || h->type != STT_OBJECT
|
| - || !h->def_regular)
|
| - {
|
| - struct bfd_link_hash_entry *bh = NULL;
|
| -
|
| - if (!(_bfd_generic_link_add_one_symbol
|
| - (info, output_bfd, "__stacksize",
|
| - BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
|
| - (const char *) NULL, FALSE,
|
| - get_elf_backend_data (output_bfd)->collect, &bh)))
|
| - return FALSE;
|
| -
|
| - h = (struct elf_link_hash_entry *) bh;
|
| - h->def_regular = 1;
|
| - h->type = STT_OBJECT;
|
| - }
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -static bfd_boolean
|
| -elf32_tic6x_modify_program_headers (bfd *output_bfd,
|
| - struct bfd_link_info *info)
|
| -{
|
| - struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
|
| - struct elf_segment_map *m;
|
| - Elf_Internal_Phdr *p;
|
| -
|
| - /* objcopy and strip preserve what's already there using
|
| - elf32_tic6x_copy_private_bfd_data (). */
|
| - if (! info)
|
| - return TRUE;
|
| -
|
| - for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
|
| - if (m->p_type == PT_GNU_STACK)
|
| - break;
|
| -
|
| - if (m)
|
| - {
|
| - struct elf_link_hash_entry *h;
|
| -
|
| - /* Obtain the pointer to the __stacksize symbol. */
|
| - h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
|
| - FALSE, FALSE, FALSE);
|
| - if (h)
|
| - {
|
| - 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;
|
| - BFD_ASSERT (h->root.type == bfd_link_hash_defined);
|
| - }
|
| -
|
| - /* Set the header p_memsz from the symbol value. We
|
| - intentionally ignore the symbol section. */
|
| - if (h && h->root.type == bfd_link_hash_defined)
|
| - p->p_memsz = h->root.u.def.value;
|
| - else
|
| - p->p_memsz = DEFAULT_STACK_SIZE;
|
| -
|
| - p->p_align = 8;
|
| - }
|
| + if (elf32_tic6x_using_dsbt (output_bfd) && !info->relocatable
|
| + && !bfd_elf_stack_segment_size (output_bfd, info,
|
| + "__stacksize", DEFAULT_STACK_SIZE))
|
| + return FALSE;
|
|
|
| return TRUE;
|
| }
|
| @@ -4020,49 +3942,6 @@ elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
|
| return TRUE;
|
| }
|
|
|
| -static bfd_boolean
|
| -elf32_tic6x_copy_private_data (bfd * ibfd, bfd * obfd)
|
| -{
|
| - _bfd_elf_copy_private_bfd_data (ibfd, obfd);
|
| -
|
| - if (! is_tic6x_elf (ibfd) || ! is_tic6x_elf (obfd))
|
| - return TRUE;
|
| -
|
| - /* Copy the stack size. */
|
| - if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr
|
| - && elf32_tic6x_using_dsbt (ibfd) && elf32_tic6x_using_dsbt (obfd))
|
| - {
|
| - unsigned i;
|
| -
|
| - for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
|
| - if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
|
| - {
|
| - Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
|
| -
|
| - for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
|
| - if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
|
| - {
|
| - memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
|
| -
|
| - /* Rewrite the phdrs, since we're only called after they
|
| - were first written. */
|
| - if (bfd_seek (obfd,
|
| - (bfd_signed_vma) get_elf_backend_data (obfd)
|
| - ->s->sizeof_ehdr, SEEK_SET) != 0
|
| - || get_elf_backend_data (obfd)->s
|
| - ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
|
| - elf_elfheader (obfd)->e_phnum) != 0)
|
| - return FALSE;
|
| - break;
|
| - }
|
| -
|
| - break;
|
| - }
|
| - }
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| /* Add a new unwind edit to the list described by HEAD, TAIL. If TINDEX is zero,
|
| adds the edit to the start of the list. (The list must be built in order of
|
| ascending TINDEX: the function's callers are primarily responsible for
|
| @@ -4077,11 +3956,11 @@ elf32_tic6x_add_unwind_table_edit (tic6x_unwind_table_edit **head,
|
| {
|
| tic6x_unwind_table_edit *new_edit = (tic6x_unwind_table_edit *)
|
| xmalloc (sizeof (tic6x_unwind_table_edit));
|
| -
|
| +
|
| new_edit->type = type;
|
| new_edit->linked_section = linked_section;
|
| new_edit->index = tindex;
|
| -
|
| +
|
| if (tindex > 0)
|
| {
|
| new_edit->next = NULL;
|
| @@ -4147,7 +4026,7 @@ elf32_tic6x_insert_cantunwind_after (asection *text_sec, asection *exidx_sec)
|
|
|
| /* Scan .cx6abi.exidx tables, and create a list describing edits which
|
| should be made to those tables, such that:
|
| -
|
| +
|
| 1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries.
|
| 2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind
|
| codes which have been inlined into the index).
|
| @@ -4175,15 +4054,15 @@ elf32_tic6x_fix_exidx_coverage (asection **text_section_order,
|
| for (inp = info->input_bfds; inp != NULL; inp = inp->link_next)
|
| {
|
| asection *sec;
|
| -
|
| +
|
| for (sec = inp->sections; sec != NULL; sec = sec->next)
|
| {
|
| struct bfd_elf_section_data *elf_sec = elf_section_data (sec);
|
| Elf_Internal_Shdr *hdr = &elf_sec->this_hdr;
|
| -
|
| +
|
| if (!hdr || hdr->sh_type != SHT_C6000_UNWIND)
|
| continue;
|
| -
|
| +
|
| if (elf_sec->linked_to)
|
| {
|
| Elf_Internal_Shdr *linked_hdr
|
| @@ -4246,13 +4125,13 @@ elf32_tic6x_fix_exidx_coverage (asection **text_section_order,
|
| hdr = &elf_section_data (exidx_sec)->this_hdr;
|
| if (hdr->sh_type != SHT_C6000_UNWIND)
|
| continue;
|
| -
|
| +
|
| exidx_data = get_tic6x_elf_section_data (exidx_sec);
|
| if (exidx_data == NULL)
|
| continue;
|
| -
|
| +
|
| ibfd = exidx_sec->owner;
|
| -
|
| +
|
| if (hdr->contents != NULL)
|
| contents = hdr->contents;
|
| else if (! bfd_malloc_and_get_section (ibfd, exidx_sec, &contents))
|
| @@ -4305,7 +4184,7 @@ elf32_tic6x_fix_exidx_coverage (asection **text_section_order,
|
| /* Record edits to be applied later (in elf32_tic6x_write_section). */
|
| exidx_data->u.exidx.unwind_edit_list = unwind_edit_head;
|
| exidx_data->u.exidx.unwind_edit_tail = unwind_edit_tail;
|
| -
|
| +
|
| if (deleted_exidx_bytes > 0)
|
| elf32_tic6x_adjust_exidx_size (exidx_sec, -deleted_exidx_bytes);
|
|
|
| @@ -4343,12 +4222,12 @@ elf32_tic6x_copy_exidx_entry (bfd *output_bfd, bfd_byte *to, bfd_byte *from,
|
| /* High bit of first word is supposed to be zero. */
|
| if ((first_word & 0x80000000ul) == 0)
|
| first_word = elf32_tic6x_add_low31 (first_word, offset);
|
| -
|
| +
|
| /* If the high bit of the first word is clear, and the bit pattern is not 0x1
|
| (EXIDX_CANTUNWIND), this is an offset to an .c6xabi.extab entry. */
|
| if ((second_word != 0x1) && ((second_word & 0x80000000ul) == 0))
|
| second_word = elf32_tic6x_add_low31 (second_word, offset);
|
| -
|
| +
|
| bfd_put_32 (output_bfd, first_word, to);
|
| bfd_put_32 (output_bfd, second_word, to + 4);
|
| }
|
| @@ -4394,7 +4273,7 @@ elf32_tic6x_write_section (bfd *output_bfd,
|
| if (edit_node)
|
| {
|
| unsigned int edit_index = edit_node->index;
|
| -
|
| +
|
| if (in_index < edit_index && in_index * 8 < input_size)
|
| {
|
| elf32_tic6x_copy_exidx_entry (output_bfd,
|
| @@ -4413,7 +4292,7 @@ elf32_tic6x_write_section (bfd *output_bfd,
|
| in_index++;
|
| add_to_offsets += 8;
|
| break;
|
| -
|
| +
|
| case INSERT_EXIDX_CANTUNWIND_AT_END:
|
| {
|
| asection *text_sec = edit_node->linked_section;
|
| @@ -4443,7 +4322,7 @@ elf32_tic6x_write_section (bfd *output_bfd,
|
| }
|
| break;
|
| }
|
| -
|
| +
|
| edit_node = edit_node->next;
|
| }
|
| }
|
| @@ -4484,12 +4363,11 @@ elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info)
|
| #define ELF_MAXPAGESIZE 0x1000
|
| #define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup
|
| #define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup
|
| -#define bfd_elf32_bfd_copy_private_bfd_data elf32_tic6x_copy_private_data
|
| #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
|
| #define elf_backend_default_use_rela_p 1
|
| #define elf_backend_may_use_rel_p 1
|
| @@ -4509,8 +4387,6 @@ elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info)
|
| #define elf_backend_fake_sections elf32_tic6x_fake_sections
|
| #define elf_backend_gc_sweep_hook elf32_tic6x_gc_sweep_hook
|
| #define elf_backend_gc_mark_extra_sections elf32_tic6x_gc_mark_extra_sections
|
| -#define elf_backend_modify_program_headers \
|
| - elf32_tic6x_modify_program_headers
|
| #define elf_backend_create_dynamic_sections \
|
| elf32_tic6x_create_dynamic_sections
|
| #define elf_backend_adjust_dynamic_symbol \
|
|
|