X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bfd%2Felfxx-tilegx.c;h=eb12695d027f7c2e29a037704fd247ff61988f44;hb=2571583aed598dd3f9651b53434e5f177a0e3cf7;hp=6f7485a02727f47ad067caa3766af370dbeeca1f;hpb=9b8b325a1f4cdaf235e7d803849dde6ededec865;p=external%2Fbinutils.git diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c index 6f7485a..eb12695 100644 --- a/bfd/elfxx-tilegx.c +++ b/bfd/elfxx-tilegx.c @@ -1,5 +1,5 @@ /* TILE-Gx-specific support for ELF. - Copyright (C) 2011-2015 Free Software Foundation, Inc. + Copyright (C) 2011-2017 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -855,10 +855,6 @@ struct tilegx_elf_link_hash_table void (*put_word) (bfd *, bfd_vma, void *); const char *dynamic_interpreter; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* Whether LE transition has been disabled for some of the sections. */ bfd_boolean disable_le_transition; @@ -1439,8 +1435,7 @@ tilegx_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) struct elf_link_hash_table *htab = elf_hash_table (info); /* This function may be called more than once. */ - s = bfd_get_linker_section (abfd, ".got"); - if (s != NULL) + if (htab->sgot != NULL) return TRUE; flags = bed->dynamic_sec_flags; @@ -1501,26 +1496,10 @@ bfd_boolean tilegx_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) { - struct tilegx_elf_link_hash_table *htab; - - htab = tilegx_elf_hash_table (info); - BFD_ASSERT (htab != NULL); - if (!tilegx_elf_create_got_section (dynobj, info)) return FALSE; - if (!_bfd_elf_create_dynamic_sections (dynobj, info)) - return FALSE; - - htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!bfd_link_pic (info)) - htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); - - if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss - || (!bfd_link_pic (info) && !htab->srelbss)) - abort (); - - return TRUE; + return _bfd_elf_create_dynamic_sections (dynobj, info); } /* Copy the extra info we tack onto an elf_link_hash_entry. */ @@ -1725,8 +1704,9 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) { - (*_bfd_error_handler) (_("%B: bad symbol index: %d"), - abfd, r_symndx); + /* xgettext:c-format */ + _bfd_error_handler (_("%B: bad symbol index: %d"), + abfd, r_symndx); return FALSE; } @@ -1832,7 +1812,8 @@ tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, tls_type = old_tls_type; else { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as normal and thread local symbol"), abfd, h ? h->root.root.string : ""); return FALSE; @@ -2346,7 +2327,7 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, struct tilegx_elf_link_hash_entry * eh; struct tilegx_elf_dyn_relocs *p; bfd *dynobj; - asection *s; + asection *s, *srel; htab = tilegx_elf_hash_table (info); BFD_ASSERT (htab != NULL); @@ -2450,13 +2431,23 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, to copy the initial value out of the dynamic object and into the runtime process image. We need to remember the offset into the .rel.bss section we are going to use. */ + if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + { + s = htab->elf.sdynrelro; + srel = htab->elf.sreldynrelro; + } + else + { + s = htab->elf.sdynbss; + srel = htab->elf.srelbss; + } if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += TILEGX_ELF_RELA_BYTES (htab); + srel->size += TILEGX_ELF_RELA_BYTES (htab); h->needs_copy = 1; } - return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss); + return _bfd_elf_adjust_dynamic_copy (info, h, s); } /* Allocate space in .plt, .got and associated reloc sections for @@ -2845,7 +2836,8 @@ tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (s == htab->elf.splt || s == htab->elf.sgot || s == htab->elf.sgotplt - || s == htab->sdynbss) + || s == htab->elf.sdynbss + || s == htab->elf.sdynrelro) { /* Strip this section if we don't need it; see the comment below. */ @@ -3170,7 +3162,8 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if ((unsigned int)r_type >= ARRAY_SIZE (tilegx_elf_howto_table)) { /* Not clear if we need to check here, but just be paranoid. */ - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: unrecognized relocation (0x%x) in section `%A'"), input_bfd, r_type, input_section); bfd_set_error (bfd_error_bad_value); @@ -3729,7 +3722,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (indx == 0) { BFD_FAIL (); - (*_bfd_error_handler) + _bfd_error_handler (_("%B: probably compiled without -fPIC?"), input_bfd); bfd_set_error (bfd_error_bad_value); @@ -3978,7 +3971,8 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, && h->def_dynamic) && _bfd_elf_section_offset (output_bfd, info, input_section, rel->r_offset) != (bfd_vma) -1) - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), input_bfd, input_section, @@ -4044,15 +4038,14 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, switch (r) { case bfd_reloc_overflow: - r = info->callbacks->reloc_overflow + (*info->callbacks->reloc_overflow) (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0, input_bfd, input_section, rel->r_offset); break; case bfd_reloc_undefined: - r = info->callbacks->undefined_symbol - (info, name, input_bfd, input_section, rel->r_offset, - TRUE); + (*info->callbacks->undefined_symbol) + (info, name, input_bfd, input_section, rel->r_offset, TRUE); break; case bfd_reloc_outofrange: @@ -4073,11 +4066,8 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } if (msg) - r = info->callbacks->warning - (info, msg, name, input_bfd, input_section, rel->r_offset); - - if (! r) - return FALSE; + (*info->callbacks->warning) (info, msg, name, input_bfd, + input_section, rel->r_offset); } } @@ -4208,7 +4198,10 @@ tilegx_elf_finish_dynamic_symbol (bfd *output_bfd, /* This symbols needs a copy reloc. Set it up. */ BFD_ASSERT (h->dynindx != -1); - s = htab->srelbss; + if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + s = htab->elf.sreldynrelro; + else + s = htab->elf.srelbss; BFD_ASSERT (s != NULL); rela.r_offset = (h->root.u.def.value @@ -4330,7 +4323,7 @@ tilegx_elf_finish_dynamic_sections (bfd *output_bfd, { if (bfd_is_abs_section (htab->elf.sgotplt->output_section)) { - (*_bfd_error_handler) + _bfd_error_handler (_("discarded output section: `%A'"), htab->elf.sgotplt); return FALSE; } @@ -4430,14 +4423,16 @@ tilegx_additional_program_headers (bfd *abfd, bfd_boolean -_bfd_tilegx_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) +_bfd_tilegx_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { + bfd *obfd = info->output_bfd; const char *targ1 = bfd_get_target (ibfd); const char *targ2 = bfd_get_target (obfd); if (strcmp (targ1, targ2) != 0) { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: Cannot link together %s and %s objects."), ibfd, targ1, targ2); bfd_set_error (bfd_error_bad_value);