X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf-vxworks.c;h=08c4b161554300d95459af0d8736abfe3347bd62;hb=8ecb59f8567956c1520b491ea31396363efcb1ef;hp=61253fa935e59bb5d53f92ea5b69edc70a4ce599;hpb=a0f49396fd3a721a3bcd77457abeff75dd9564d9;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf-vxworks.c b/bfd/elf-vxworks.c index 61253fa935..08c4b16155 100644 --- a/bfd/elf-vxworks.c +++ b/bfd/elf-vxworks.c @@ -1,5 +1,5 @@ /* VxWorks support for ELF - Copyright 2005, 2006, 2007, 2009, 2012 Free Software Foundation, Inc. + Copyright (C) 2005-2019 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -14,9 +14,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ + along with this program. If not, see . */ /* This file provides routines used by all VxWorks targets. */ @@ -64,7 +62,7 @@ elf_vxworks_add_symbol_hook (bfd *abfd, give the symbol weak binding to get the desired samantics. This transformation will be undone in elf_i386_vxworks_link_output_symbol_hook. */ - if ((info->shared || abfd->flags & DYNAMIC) + if ((bfd_link_pic (info) || abfd->flags & DYNAMIC) && elf_vxworks_gott_symbol_p (abfd, *namep)) { sym->st_info = ELF_ST_INFO (STB_WEAK, ELF_ST_TYPE (sym->st_info)); @@ -89,14 +87,15 @@ elf_vxworks_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info, htab = elf_hash_table (info); bed = get_elf_backend_data (dynobj); - if (!info->shared) + if (!bfd_link_pic (info)) { - s = bfd_make_section_with_flags (dynobj, - bed->default_use_rela_p - ? ".rela.plt.unloaded" - : ".rel.plt.unloaded", - SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_READONLY | SEC_LINKER_CREATED); + s = bfd_make_section_anyway_with_flags (dynobj, + bed->default_use_rela_p + ? ".rela.plt.unloaded" + : ".rel.plt.unloaded", + SEC_HAS_CONTENTS | SEC_IN_MEMORY + | SEC_READONLY + | SEC_LINKER_CREATED); if (s == NULL || !bfd_set_section_alignment (dynobj, s, bed->s->log_file_align)) return FALSE; @@ -181,20 +180,20 @@ elf_vxworks_emit_relocs (bfd *output_bfd, && (*hash_ptr)->root.u.def.section->output_section != NULL) { /* This is a relocation from an executable or shared - library against a symbol in a different shared - library. We are creating a definition in the output - file but it does not come from any of our normal (.o) - files. ie. a PLT stub. Normally this would be a - relocation against against SHN_UNDEF with the VMA of - the PLT stub. This upsets the VxWorks loader. - Convert it to a section-relative relocation. This - gets some other symbols (for instance .dynbss), but - is conservatively correct. */ + library against a symbol in a different shared + library. We are creating a definition in the output + file but it does not come from any of our normal (.o) + files. ie. a PLT stub. Normally this would be a + relocation against against SHN_UNDEF with the VMA of + the PLT stub. This upsets the VxWorks loader. + Convert it to a section-relative relocation. This + gets some other symbols (for instance .dynbss), but + is conservatively correct. */ for (j = 0; j < bed->s->int_rels_per_ext_rel; j++) { asection *sec = (*hash_ptr)->root.u.def.section; int this_idx = sec->output_section->target_index; - + irela[j].r_info = ELF32_R_INFO (this_idx, ELF32_R_TYPE (irela[j].r_info)); irela[j].r_addend += (*hash_ptr)->root.u.def.value; @@ -226,7 +225,7 @@ elf_vxworks_final_write_processing (bfd *abfd, if (!sec) return; d = elf_section_data (sec); - d->this_hdr.sh_link = elf_tdata (abfd)->symtab_section; + d->this_hdr.sh_link = elf_onesymtab (abfd); sec = bfd_get_section_by_name (abfd, ".plt"); if (sec) d->this_hdr.sh_info = elf_section_data (sec)->this_idx; @@ -261,34 +260,34 @@ bfd_boolean elf_vxworks_finish_dynamic_entry (bfd *output_bfd, Elf_Internal_Dyn *dyn) { asection *sec; - + switch (dyn->d_tag) { default: return FALSE; - + case DT_VX_WRS_TLS_DATA_START: sec = bfd_get_section_by_name (output_bfd, ".tls_data"); dyn->d_un.d_ptr = sec->vma; break; - + case DT_VX_WRS_TLS_DATA_SIZE: sec = bfd_get_section_by_name (output_bfd, ".tls_data"); dyn->d_un.d_val = sec->size; break; - + case DT_VX_WRS_TLS_DATA_ALIGN: sec = bfd_get_section_by_name (output_bfd, ".tls_data"); dyn->d_un.d_val = (bfd_size_type)1 << bfd_get_section_alignment (output_bfd, sec); break; - + case DT_VX_WRS_TLS_VARS_START: sec = bfd_get_section_by_name (output_bfd, ".tls_vars"); dyn->d_un.d_ptr = sec->vma; break; - + case DT_VX_WRS_TLS_VARS_SIZE: sec = bfd_get_section_by_name (output_bfd, ".tls_vars"); dyn->d_un.d_val = sec->size;