From: Alan Modra Date: Sun, 25 Dec 2016 13:51:06 +0000 (+1030) Subject: Put .dynbss and .rel.bss shortcuts in main elf hash table X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d19e4fdb7c684329c8b1b72796a0071708dabc7;p=binutils-gdb.git Put .dynbss and .rel.bss shortcuts in main elf hash table Also, create .rel{,a}.bss for PIEs on all targets, not just x86. * elf-bfd.h (struct elf_link_hash_table): Add sdynbss and srelbss. * elflink.c (_bfd_elf_create_dynamic_sections): Set them. Create .rel.bss/.rela.bss for executables, both PIE and non-PIE. * elf32-arc.c (struct elf_arc_link_hash_table): Delete srelbss. Use ELF hash table var throughout. * elf32-arm.c (struct elf32_arm_link_hash_table): Delete sdynbss and srelbss. Use ELF hash table vars throughout. * elf32-hppa.c (struct elf32_hppa_link_hash_table): Likewise. * elf32-i386.c (struct elf_i386_link_hash_table): Likewise. * elf32-metag.c (struct elf_metag_link_hash_table): Likewise. * elf32-microblaze.c (struct elf32_mb_link_hash_table): Likewise. * elf32-nios2.c (struct elf32_nios2_link_hash_table): Likewise. * elf32-or1k.c (struct elf_or1k_link_hash_table): Likewise. * elf32-ppc.c (struct ppc_elf_link_hash_table): Likewise. * elf32-s390.c (struct elf_s390_link_hash_table): Likewise. * elf32-tic6x.c (struct elf32_tic6x_link_hash_table): Likewise. * elf32-tilepro.c (struct tilepro_elf_link_hash_table): Likewise. * elf64-ppc.c (struct ppc_link_hash_table): Likewise. * elf64-s390.c (struct elf_s390_link_hash_table): Likewise. * elf64-x86-64.c (struct elf_x86_64_link_hash_table): Likewise. * elfnn-aarch64.c (struct elf_aarch64_link_hash_table): Likewise. * elfnn-riscv.c (struct riscv_elf_link_hash_table): Likewise. * elfxx-mips.c (struct mips_elf_link_hash_table): Likewise. * elfxx-sparc.h (struct _bfd_sparc_elf_link_hash_table): Likewise. * elfxx-sparc.c: Likewise. * elfxx-tilegx.c (struct tilegx_elf_link_hash_table): Likewise. * elf32-arc.c (arc_elf_create_dynamic_sections): Delete. (elf_backend_create_dynamic_sections): Use base ELF version. * elf32-microblaze.c (microblaze_elf_create_dynamic_sections): Delete. (elf_backend_create_dynamic_sections): Use base ELF version. * elf32-or1k.c (or1k_elf_create_dynamic_sections): Delete. (elf_backend_create_dynamic_sections): Use base ELF version. * elf32-s390.c (elf_s390_create_dynamic_sections): Delete. (elf_backend_create_dynamic_sections): Use base ELF version. * elf64-ppc.c (ppc64_elf_create_dynamic_sections): Delete. (elf_backend_create_dynamic_sections): Use base ELF version. * elf64-s390.c (elf_s390_create_dynamic_sections): Delete. (elf_backend_create_dynamic_sections): Use base ELF version. * elf32-tilepro.c (tilepro_elf_create_dynamic_sections): Remove extraneous tests. * elfnn-aarch64.c (elfNN_aarch64_create_dynamic_sections): Likewise. * elfxx-mips.c (_bfd_mips_elf_create_dynamic_sections): Likewise. * elfxx-tilegx.c (tilegx_elf_create_dynamic_sections): Likewise. * elf32-i386.c (elf_i386_create_dynamic_sections): Don't create ".rel.bss" for executables. * elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Don't create ".rela.bss" for executables. * elf32-nios2.c (nios2_elf32_create_dynamic_sections): Don't ignore return status from _bfd_elf_create_dynamic_sections. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 38f7d39b301..d1ecdea3f9d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,58 @@ +2016-12-26 Alan Modra + + * elf-bfd.h (struct elf_link_hash_table): Add sdynbss and srelbss. + * elflink.c (_bfd_elf_create_dynamic_sections): Set them. Create + .rel.bss/.rela.bss for executables, both PIE and non-PIE. + * elf32-arc.c (struct elf_arc_link_hash_table): Delete srelbss. + Use ELF hash table var throughout. + * elf32-arm.c (struct elf32_arm_link_hash_table): Delete sdynbss + and srelbss. Use ELF hash table vars throughout. + * elf32-hppa.c (struct elf32_hppa_link_hash_table): Likewise. + * elf32-i386.c (struct elf_i386_link_hash_table): Likewise. + * elf32-metag.c (struct elf_metag_link_hash_table): Likewise. + * elf32-microblaze.c (struct elf32_mb_link_hash_table): Likewise. + * elf32-nios2.c (struct elf32_nios2_link_hash_table): Likewise. + * elf32-or1k.c (struct elf_or1k_link_hash_table): Likewise. + * elf32-ppc.c (struct ppc_elf_link_hash_table): Likewise. + * elf32-s390.c (struct elf_s390_link_hash_table): Likewise. + * elf32-tic6x.c (struct elf32_tic6x_link_hash_table): Likewise. + * elf32-tilepro.c (struct tilepro_elf_link_hash_table): Likewise. + * elf64-ppc.c (struct ppc_link_hash_table): Likewise. + * elf64-s390.c (struct elf_s390_link_hash_table): Likewise. + * elf64-x86-64.c (struct elf_x86_64_link_hash_table): Likewise. + * elfnn-aarch64.c (struct elf_aarch64_link_hash_table): Likewise. + * elfnn-riscv.c (struct riscv_elf_link_hash_table): Likewise. + * elfxx-mips.c (struct mips_elf_link_hash_table): Likewise. + * elfxx-sparc.h (struct _bfd_sparc_elf_link_hash_table): Likewise. + * elfxx-sparc.c: Likewise. + * elfxx-tilegx.c (struct tilegx_elf_link_hash_table): Likewise. + + * elf32-arc.c (arc_elf_create_dynamic_sections): Delete. + (elf_backend_create_dynamic_sections): Use base ELF version. + * elf32-microblaze.c (microblaze_elf_create_dynamic_sections): Delete. + (elf_backend_create_dynamic_sections): Use base ELF version. + * elf32-or1k.c (or1k_elf_create_dynamic_sections): Delete. + (elf_backend_create_dynamic_sections): Use base ELF version. + * elf32-s390.c (elf_s390_create_dynamic_sections): Delete. + (elf_backend_create_dynamic_sections): Use base ELF version. + * elf64-ppc.c (ppc64_elf_create_dynamic_sections): Delete. + (elf_backend_create_dynamic_sections): Use base ELF version. + * elf64-s390.c (elf_s390_create_dynamic_sections): Delete. + (elf_backend_create_dynamic_sections): Use base ELF version. + + * elf32-tilepro.c (tilepro_elf_create_dynamic_sections): Remove + extraneous tests. + * elfnn-aarch64.c (elfNN_aarch64_create_dynamic_sections): Likewise. + * elfxx-mips.c (_bfd_mips_elf_create_dynamic_sections): Likewise. + * elfxx-tilegx.c (tilegx_elf_create_dynamic_sections): Likewise. + + * elf32-i386.c (elf_i386_create_dynamic_sections): Don't create + ".rel.bss" for executables. + * elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Don't create + ".rela.bss" for executables. + * elf32-nios2.c (nios2_elf32_create_dynamic_sections): Don't + ignore return status from _bfd_elf_create_dynamic_sections. + 2016-12-23 Maciej W. Rozycki * bfd/elfxx-mips.c (_bfd_mips_post_process_headers): Revert diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 06bd800b4cd..4093434e646 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -595,6 +595,8 @@ struct elf_link_hash_table asection *srelgot; asection *splt; asection *srelplt; + asection *sdynbss; + asection *srelbss; asection *igotplt; asection *iplt; asection *irelplt; diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index 9ef53688a71..5c52650534b 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -314,9 +314,6 @@ struct elf_arc_link_hash_entry struct elf_arc_link_hash_table { struct elf_link_hash_table elf; - - /* Short-cuts to get to dynamic linker sections. */ - asection *srelbss; }; static struct bfd_hash_entry * @@ -375,8 +372,6 @@ arc_elf_link_hash_table_create (bfd *abfd) return NULL; } - ret->srelbss = NULL; - ret->elf.init_got_refcount.refcount = 0; ret->elf.init_got_refcount.glist = NULL; ret->elf.init_got_offset.offset = 0; @@ -1567,45 +1562,6 @@ elf_arc_relocate_section (bfd * output_bfd, (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ == ARC_ELF_DATA ? ((struct elf_arc_link_hash_table *) ((p)->hash)) : NULL) -/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and - .rela.bss sections in DYNOBJ, and set up shortcuts to them in our - hash table. */ - -static bfd_boolean -arc_elf_create_dynamic_sections (bfd *dynobj, - struct bfd_link_info *info) -{ - struct elf_arc_link_hash_table *htab; - - if (!_bfd_elf_create_dynamic_sections (dynobj, info)) - return FALSE; - - htab = elf_arc_hash_table (info); - if (htab == NULL) - return FALSE; - - if (bfd_link_executable (info)) - { - /* Always allow copy relocs for building executables. */ - asection *s = bfd_get_linker_section (dynobj, ".rela.bss"); - if (s == NULL) - { - const struct elf_backend_data *bed = get_elf_backend_data (dynobj); - s = bfd_make_section_anyway_with_flags (dynobj, - ".rela.bss", - (bed->dynamic_sec_flags - | SEC_READONLY)); - if (s == NULL - || ! bfd_set_section_alignment (dynobj, s, - bed->s->log_file_align)) - return FALSE; - } - htab->srelbss = s; - } - - return TRUE; -} - static struct dynamic_sections arc_create_dynamic_sections (bfd * abfd, struct bfd_link_info *info) { @@ -2105,8 +2061,8 @@ elf_arc_adjust_dynamic_symbol (struct bfd_link_info *info, { struct elf_arc_link_hash_table *arc_htab = elf_arc_hash_table (info); - BFD_ASSERT (arc_htab->srelbss != NULL); - arc_htab->srelbss->size += sizeof (Elf32_External_Rela); + BFD_ASSERT (arc_htab->elf.srelbss != NULL); + arc_htab->elf.srelbss->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; } @@ -2161,16 +2117,16 @@ elf_arc_finish_dynamic_symbol (bfd * output_bfd, if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || arc_htab->srelbss == NULL) + || arc_htab->elf.srelbss == NULL) abort (); bfd_vma rel_offset = (h->root.u.def.value + h->root.u.def.section->output_section->vma + h->root.u.def.section->output_offset); - bfd_byte * loc = arc_htab->srelbss->contents - + (arc_htab->srelbss->reloc_count * sizeof (Elf32_External_Rela)); - arc_htab->srelbss->reloc_count++; + bfd_byte * loc = arc_htab->elf.srelbss->contents + + (arc_htab->elf.srelbss->reloc_count * sizeof (Elf32_External_Rela)); + arc_htab->elf.srelbss->reloc_count++; Elf_Internal_Rela rel; rel.r_addend = 0; @@ -2604,7 +2560,7 @@ elf32_arc_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) #define elf_backend_relocate_section elf_arc_relocate_section #define elf_backend_check_relocs elf_arc_check_relocs -#define elf_backend_create_dynamic_sections arc_elf_create_dynamic_sections +#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections #define elf_backend_reloc_type_class elf32_arc_reloc_type_class diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index fd6d3ac0fd4..47611361d68 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -3158,10 +3158,6 @@ struct elf32_arm_link_hash_table /* How many R_ARM_TLS_DESC relocations were generated so far. */ bfd_vma num_tls_desc; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */ asection *srelplt2; @@ -3648,11 +3644,6 @@ elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) 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, - RELOC_SECTION (htab, ".bss")); - if (htab->vxworks_p) { if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2)) @@ -3694,8 +3685,8 @@ elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) if (!htab->root.splt || !htab->root.srelplt - || !htab->sdynbss - || (!bfd_link_pic (info) && !htab->srelbss)) + || !htab->root.sdynbss + || (!bfd_link_pic (info) && !htab->root.srelbss)) abort (); return TRUE; @@ -15372,7 +15363,7 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info, determine the address it must put in the global offset table, so both the dynamic object and the regular object will refer to the same memory location for the variable. */ - s = bfd_get_linker_section (dynobj, ".dynbss"); + s = globals->root.sdynbss; BFD_ASSERT (s != NULL); /* If allowed, we must generate a R_ARM_COPY reloc to tell the dynamic @@ -16100,7 +16091,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, && s != htab->root.sgotplt && s != htab->root.iplt && s != htab->root.igotplt - && s != htab->sdynbss) + && s != htab->root.sdynbss) { /* It's not one of our sections, so don't allocate space. */ continue; @@ -16310,7 +16301,7 @@ elf32_arm_finish_dynamic_symbol (bfd * output_bfd, && (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak)); - s = htab->srelbss; + s = htab->root.srelbss; BFD_ASSERT (s != NULL); rel.r_addend = 0; diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index de3b7ead52d..3ce4b928f50 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -274,10 +274,6 @@ struct elf32_hppa_link_hash_table asection **input_list; Elf_Internal_Sym **all_local_syms; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* Used during a final link to store the base of the text and data segments so that we can perform SEGREL relocations. */ bfd_vma text_segment_base; @@ -998,9 +994,6 @@ elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (! _bfd_elf_create_dynamic_sections (abfd, info)) return FALSE; - htab->sdynbss = bfd_get_linker_section (abfd, ".dynbss"); - htab->srelbss = bfd_get_linker_section (abfd, ".rela.bss"); - /* hppa-linux needs _GLOBAL_OFFSET_TABLE_ to be visible from the main application, because __canonicalize_funcptr_for_compare needs it. */ eh = elf_hash_table (info)->hgot; @@ -1908,11 +1901,11 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info, runtime process image. */ if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0) { - htab->srelbss->size += sizeof (Elf32_External_Rela); + htab->etab.srelbss->size += sizeof (Elf32_External_Rela); eh->needs_copy = 1; } - sec = htab->sdynbss; + sec = htab->etab.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, eh, sec); } @@ -2381,7 +2374,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, } } else if (sec == htab->etab.sgot - || sec == htab->sdynbss) + || sec == htab->etab.sdynbss) ; else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela")) { @@ -4434,7 +4427,7 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd, || eh->root.type == bfd_link_hash_defweak))) abort (); - sec = htab->srelbss; + sec = htab->etab.srelbss; rela.r_offset = (eh->root.u.def.value + eh->root.u.def.section->output_offset diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 6b1f1b02a60..eb287a81ba6 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -848,8 +848,6 @@ struct elf_i386_link_hash_table /* Short-cuts to get to dynamic linker sections. */ asection *interp; - asection *sdynbss; - asection *srelbss; asection *plt_eh_frame; asection *plt_got; @@ -1084,29 +1082,6 @@ elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) htab->interp = s; } - htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!htab->sdynbss) - abort (); - - if (bfd_link_executable (info)) - { - /* Always allow copy relocs for building executables. */ - asection *s = bfd_get_linker_section (dynobj, ".rel.bss"); - if (s == NULL) - { - const struct elf_backend_data *bed = get_elf_backend_data (dynobj); - s = bfd_make_section_anyway_with_flags (dynobj, - ".rel.bss", - (bed->dynamic_sec_flags - | SEC_READONLY)); - if (s == NULL - || ! bfd_set_section_alignment (dynobj, s, - bed->s->log_file_align)) - return FALSE; - } - htab->srelbss = s; - } - if (get_elf_i386_backend_data (dynobj)->is_vxworks && !elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2)) @@ -2611,11 +2586,11 @@ elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info, runtime process image. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += sizeof (Elf32_External_Rel); + htab->elf.srelbss->size += sizeof (Elf32_External_Rel); h->needs_copy = 1; } - s = htab->sdynbss; + s = htab->elf.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -3430,7 +3405,7 @@ elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) || s == htab->elf.igotplt || s == htab->plt_got || s == htab->plt_eh_frame - || s == htab->sdynbss) + || s == htab->elf.sdynbss) { /* Strip these too. */ } @@ -5595,14 +5570,14 @@ do_glob_dat: if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || htab->srelbss == NULL) + || htab->elf.srelbss == NULL) abort (); rel.r_offset = (h->root.u.def.value + h->root.u.def.section->output_section->vma + h->root.u.def.section->output_offset); rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY); - elf_append_rel (output_bfd, htab->srelbss, &rel); + elf_append_rel (output_bfd, htab->elf.srelbss, &rel); } return TRUE; diff --git a/bfd/elf32-metag.c b/bfd/elf32-metag.c index 39d3fffcb66..4ec2266d30b 100644 --- a/bfd/elf32-metag.c +++ b/bfd/elf32-metag.c @@ -842,10 +842,6 @@ struct elf_metag_link_hash_table asection **input_list; Elf_Internal_Sym **all_local_syms; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* Small local sym cache. */ struct sym_cache sym_cache; @@ -2069,9 +2065,6 @@ elf_metag_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) htab->etab.hgot = eh; - htab->sdynbss = bfd_get_linker_section (abfd, ".dynbss"); - htab->srelbss = bfd_get_linker_section (abfd, ".rela.bss"); - return TRUE; } @@ -2573,11 +2566,11 @@ elf_metag_adjust_dynamic_symbol (struct bfd_link_info *info, runtime process image. */ if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0) { - htab->srelbss->size += sizeof (Elf32_External_Rela); + htab->etab.srelbss->size += sizeof (Elf32_External_Rela); eh->needs_copy = 1; } - s = htab->sdynbss; + s = htab->etab.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, eh, s); } @@ -2940,7 +2933,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (s == htab->etab.splt || s == htab->etab.sgot || s == htab->etab.sgotplt - || s == htab->sdynbss) + || s == htab->etab.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ @@ -3222,7 +3215,7 @@ elf_metag_finish_dynamic_symbol (bfd *output_bfd, || eh->root.type == bfd_link_hash_defweak))) abort (); - s = htab->srelbss; + s = htab->etab.srelbss; rel.r_offset = (eh->root.u.def.value + eh->root.u.def.section->output_offset diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c index c1691f857ca..33c6026e853 100644 --- a/bfd/elf32-microblaze.c +++ b/bfd/elf32-microblaze.c @@ -730,10 +730,6 @@ struct elf32_mb_link_hash_table { struct elf_link_hash_table elf; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* Small local sym to section mapping cache. */ struct sym_cache sym_sec; @@ -2503,32 +2499,6 @@ microblaze_elf_check_relocs (bfd * abfd, return TRUE; } -static bfd_boolean -microblaze_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) -{ - struct elf32_mb_link_hash_table *htab; - - htab = elf32_mb_hash_table (info); - if (htab == NULL) - return FALSE; - - if (!htab->elf.sgot && !_bfd_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; -} - /* Copy the extra info we tack onto an elf_link_hash_entry. */ static void @@ -2692,7 +2662,7 @@ microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, BFD_ASSERT (dynobj != NULL); if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) { - htab->srelbss->size += sizeof (Elf32_External_Rela); + htab->elf.srelbss->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; } @@ -2702,7 +2672,7 @@ microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if (power_of_two > 3) power_of_two = 3; - sdynbss = htab->sdynbss; + sdynbss = htab->elf.sdynbss; /* Apply the required alignment. */ sdynbss->size = BFD_ALIGN (sdynbss->size, (bfd_size_type) (1 << power_of_two)); if (power_of_two > bfd_get_section_alignment (dynobj, sdynbss)) @@ -3473,7 +3443,7 @@ microblaze_elf_add_symbol_hook (bfd *abfd, #define elf_backend_dtrel_excludes_plt 1 #define elf_backend_adjust_dynamic_symbol microblaze_elf_adjust_dynamic_symbol -#define elf_backend_create_dynamic_sections microblaze_elf_create_dynamic_sections +#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections #define elf_backend_finish_dynamic_sections microblaze_elf_finish_dynamic_sections #define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c index c63932fd1b0..a4ce99c7cd3 100644 --- a/bfd/elf32-nios2.c +++ b/bfd/elf32-nios2.c @@ -1820,8 +1820,6 @@ struct elf32_nios2_link_hash_table Elf_Internal_Sym **all_local_syms; /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; asection *sbss; /* GOT pointer symbol _gp_got. */ @@ -4602,26 +4600,14 @@ nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) if (!htab->root.sgot && !create_got_section (dynobj, info)) return FALSE; - _bfd_elf_create_dynamic_sections (dynobj, info); + if (!_bfd_elf_create_dynamic_sections (dynobj, info)) + return FALSE; /* In order for the two loads in a shared object .PLTresolve to share the same %hiadj, the start of the PLT (as well as the GOT) must be aligned to a 16-byte boundary. This is because the addresses for these loads include the -(.plt+4) PIC correction. */ - if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4)) - return FALSE; - - htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!htab->sdynbss) - return FALSE; - if (!bfd_link_pic (info)) - { - htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); - if (!htab->srelbss) - return FALSE; - } - - return TRUE; + return bfd_set_section_alignment (dynobj, htab->root.splt, 4); } /* Implement elf_backend_copy_indirect_symbol: @@ -5289,7 +5275,7 @@ nios2_elf32_finish_dynamic_symbol (bfd *output_bfd, && (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak)); - s = htab->srelbss; + s = htab->root.srelbss; BFD_ASSERT (s != NULL); rela.r_offset = (h->root.u.def.value @@ -5537,7 +5523,7 @@ nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info, determine the address it must put in the global offset table, so both the dynamic object and the regular object will refer to the same memory location for the variable. */ - s = htab->sdynbss; + s = htab->root.sdynbss; BFD_ASSERT (s != NULL); /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to @@ -5548,7 +5534,7 @@ nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info, { asection *srel; - srel = htab->srelbss; + srel = htab->root.srelbss; BFD_ASSERT (srel != NULL); srel->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c index 23de76221b9..c75a2ce1252 100644 --- a/bfd/elf32-or1k.c +++ b/bfd/elf32-or1k.c @@ -615,10 +615,6 @@ struct elf_or1k_link_hash_table { struct elf_link_hash_table root; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* Small local sym to section mapping cache. */ struct sym_cache sym_sec; }; @@ -2102,7 +2098,7 @@ or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if (htab == NULL) return FALSE; - s = htab->sdynbss; + s = htab->root.sdynbss; BFD_ASSERT (s != NULL); /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker @@ -2113,7 +2109,7 @@ or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info, { asection *srel; - srel = htab->srelbss; + srel = htab->root.srelbss; BFD_ASSERT (srel != NULL); srel->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; @@ -2476,7 +2472,7 @@ or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (s == htab->root.splt || s == htab->root.sgot || s == htab->root.sgotplt - || s == htab->sdynbss) + || s == htab->root.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ @@ -2574,34 +2570,6 @@ or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, return TRUE; } -/* Create dynamic sections when linking against a dynamic object. */ - -static bfd_boolean -or1k_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) -{ - struct elf_or1k_link_hash_table *htab; - - htab = or1k_elf_hash_table (info); - if (htab == NULL) - return FALSE; - - if (!htab->root.sgot && !_bfd_elf_create_got_section (dynobj, info)) - return FALSE; - - if (!_bfd_elf_create_dynamic_sections (dynobj, info)) - return FALSE; - - htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); - if (!bfd_link_pic (info)) - htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss"); - - if (!htab->root.splt || !htab->root.srelplt || !htab->sdynbss - || (!bfd_link_pic (info) && !htab->srelbss)) - abort (); - - return TRUE; -} - /* Copy the extra info we tack onto an elf_link_hash_entry. */ static void @@ -2777,7 +2745,7 @@ elf32_or1k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) #define bfd_elf32_bfd_link_hash_table_create or1k_elf_link_hash_table_create #define elf_backend_copy_indirect_symbol or1k_elf_copy_indirect_symbol -#define elf_backend_create_dynamic_sections or1k_elf_create_dynamic_sections +#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections #define elf_backend_finish_dynamic_sections or1k_elf_finish_dynamic_sections #define elf_backend_size_dynamic_sections or1k_elf_size_dynamic_sections #define elf_backend_adjust_dynamic_symbol or1k_elf_adjust_dynamic_symbol diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 323cc0f482e..7f541d16b06 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -3276,8 +3276,6 @@ struct ppc_elf_link_hash_table /* Short-cuts to get to dynamic linker sections. */ asection *glink; - asection *dynbss; - asection *relbss; asection *dynsbss; asection *relsbss; elf_linker_section_t sdata[2]; @@ -3556,7 +3554,6 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) && !ppc_elf_create_glink (abfd, info)) return FALSE; - htab->dynbss = bfd_get_linker_section (abfd, ".dynbss"); s = bfd_make_section_anyway_with_flags (abfd, ".dynsbss", SEC_ALLOC | SEC_LINKER_CREATED); htab->dynsbss = s; @@ -3565,7 +3562,6 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (! bfd_link_pic (info)) { - htab->relbss = bfd_get_linker_section (abfd, ".rela.bss"); flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); s = bfd_make_section_anyway_with_flags (abfd, ".rela.sbss", flags); @@ -5811,7 +5807,7 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if (ppc_elf_hash_entry (h)->has_sda_refs) s = htab->dynsbss; else - s = htab->dynbss; + s = htab->elf.sdynbss; BFD_ASSERT (s != NULL); /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to @@ -5825,7 +5821,7 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if (ppc_elf_hash_entry (h)->has_sda_refs) srel = htab->relsbss; else - srel = htab->relbss; + srel = htab->elf.srelbss; BFD_ASSERT (srel != NULL); srel->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; @@ -6639,7 +6635,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd, || s == htab->glink_eh_frame || s == htab->elf.sgotplt || s == htab->sbss - || s == htab->dynbss + || s == htab->elf.sdynbss || s == htab->dynsbss) { /* Strip these too. */ @@ -10361,7 +10357,7 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd, if (ppc_elf_hash_entry (h)->has_sda_refs) s = htab->relsbss; else - s = htab->relbss; + s = htab->elf.srelbss; BFD_ASSERT (s != NULL); rela.r_offset = SYM_VAL (h); diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 9226eb03d37..79c40509381 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -738,8 +738,6 @@ struct elf_s390_link_hash_table struct elf_link_hash_table elf; /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; asection *irelifunc; union @@ -818,33 +816,6 @@ elf_s390_link_hash_table_create (bfd *abfd) return &ret->elf.root; } -/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and - .rela.bss sections in DYNOBJ, and set up shortcuts to them in our - hash table. */ - -static bfd_boolean -elf_s390_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) -{ - struct elf_s390_link_hash_table *htab; - - htab = elf_s390_hash_table (info); - if (!htab->elf.sgot && !_bfd_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; -} - /* Copy the extra info we tack onto an elf_link_hash_entry. */ static void @@ -1788,11 +1759,11 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, runtime process image. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += sizeof (Elf32_External_Rela); + htab->elf.srelbss->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; } - s = htab->sdynbss; + s = htab->elf.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -2185,7 +2156,7 @@ elf_s390_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.iplt || s == htab->elf.igotplt || s == htab->irelifunc) @@ -3836,7 +3807,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || htab->srelbss == NULL) + || htab->elf.srelbss == NULL) abort (); rela.r_offset = (h->root.u.def.value @@ -3844,8 +3815,8 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = ELF32_R_INFO (h->dynindx, R_390_COPY); rela.r_addend = 0; - loc = htab->srelbss->contents; - loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rela); + loc = htab->elf.srelbss->contents; + loc += htab->elf.srelbss->reloc_count++ * sizeof (Elf32_External_Rela); bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); } @@ -4197,7 +4168,7 @@ elf32_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) #define elf_backend_adjust_dynamic_symbol elf_s390_adjust_dynamic_symbol #define elf_backend_check_relocs elf_s390_check_relocs #define elf_backend_copy_indirect_symbol elf_s390_copy_indirect_symbol -#define elf_backend_create_dynamic_sections elf_s390_create_dynamic_sections +#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections #define elf_backend_finish_dynamic_sections elf_s390_finish_dynamic_sections #define elf_backend_finish_dynamic_symbol elf_s390_finish_dynamic_symbol #define elf_backend_gc_mark_hook elf_s390_gc_mark_hook diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index 80ddfaff0bd..c2b22ee89a8 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -43,10 +43,6 @@ struct elf32_tic6x_link_hash_table { struct elf_link_hash_table elf; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* C6X specific command line arguments. */ struct elf32_tic6x_params params; @@ -1660,14 +1656,6 @@ elf32_tic6x_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) || ! bfd_set_section_alignment (dynobj, htab->elf.splt, 5)) 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->sdynbss - || (!bfd_link_pic (info) && !htab->srelbss)) - abort (); - return TRUE; } @@ -1878,7 +1866,7 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd, if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || htab->srelbss == NULL) + || htab->elf.srelbss == NULL) abort (); rel.r_offset = (h->root.u.def.value @@ -1887,7 +1875,7 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd, rel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_COPY); rel.r_addend = 0; - elf32_tic6x_install_rela (output_bfd, htab->srelbss, &rel); + elf32_tic6x_install_rela (output_bfd, htab->elf.srelbss, &rel); } /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ @@ -2160,11 +2148,11 @@ elf32_tic6x_adjust_dynamic_symbol (struct bfd_link_info *info, runtime process image. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += sizeof (Elf32_External_Rela); + htab->elf.srelbss->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; } - s = htab->sdynbss; + s = htab->elf.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -3388,7 +3376,7 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) else if (s == htab->elf.splt || s == htab->elf.sgot || s == htab->elf.sgotplt - || s == htab->sdynbss) + || s == htab->elf.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c index 9430b78000f..18aabb030ec 100644 --- a/bfd/elf32-tilepro.c +++ b/bfd/elf32-tilepro.c @@ -754,10 +754,6 @@ struct tilepro_elf_link_hash_table { struct elf_link_hash_table elf; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* Small local sym to section mapping cache. */ struct sym_cache sym_cache; }; @@ -1295,26 +1291,10 @@ static bfd_boolean tilepro_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) { - struct tilepro_elf_link_hash_table *htab; - - htab = tilepro_elf_hash_table (info); - BFD_ASSERT (htab != NULL); - if (!tilepro_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. */ @@ -2186,11 +2166,11 @@ tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info, .rel.bss section we are going to use. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += TILEPRO_ELF_RELA_BYTES; + htab->elf.srelbss->size += TILEPRO_ELF_RELA_BYTES; h->needs_copy = 1; } - return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss); + return _bfd_elf_adjust_dynamic_copy (info, h, htab->elf.sdynbss); } /* Allocate space in .plt, .got and associated reloc sections for @@ -2585,7 +2565,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, if (s == htab->elf.splt || s == htab->elf.sgot || s == htab->elf.sgotplt - || s == htab->sdynbss) + || s == htab->elf.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ @@ -3817,7 +3797,7 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd, /* This symbols needs a copy reloc. Set it up. */ BFD_ASSERT (h->dynindx != -1); - s = htab->srelbss; + s = htab->elf.srelbss; BFD_ASSERT (s != NULL); rela.r_offset = (h->root.u.def.value diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index b3975f85844..c421426508b 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -93,7 +93,7 @@ static bfd_vma opd_entry_value #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo #define elf_backend_write_core_note ppc64_elf_write_core_note -#define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections +#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook #define elf_backend_check_directives ppc64_elf_before_check_relocs @@ -4053,8 +4053,6 @@ struct ppc_link_hash_table struct ppc_link_hash_entry *dot_syms; /* Shortcuts to get to dynamic linker sections. */ - asection *dynbss; - asection *relbss; asection *glink; asection *sfpr; asection *brlt; @@ -4638,31 +4636,6 @@ create_got_section (bfd *abfd, struct bfd_link_info *info) return TRUE; } -/* Create the dynamic sections, and set up shortcuts. */ - -static bfd_boolean -ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) -{ - struct ppc_link_hash_table *htab; - - if (!_bfd_elf_create_dynamic_sections (dynobj, info)) - return FALSE; - - htab = ppc_hash_table (info); - if (htab == NULL) - return FALSE; - - htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!bfd_link_pic (info)) - htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss"); - - if (!htab->elf.sgot || !htab->elf.splt || !htab->elf.srelplt || !htab->dynbss - || (!bfd_link_pic (info) && !htab->relbss)) - abort (); - - return TRUE; -} - /* Follow indirect and warning symbol links. */ static inline struct bfd_link_hash_entry * @@ -7394,11 +7367,11 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info, .rela.bss section we are going to use. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->relbss->size += sizeof (Elf64_External_Rela); + htab->elf.srelbss->size += sizeof (Elf64_External_Rela); h->needs_copy = 1; } - s = htab->dynbss; + s = htab->elf.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -10201,7 +10174,7 @@ ppc64_elf_size_dynamic_sections (bfd *output_bfd, || s == htab->elf.splt || s == htab->elf.iplt || s == htab->glink - || s == htab->dynbss) + || s == htab->elf.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ @@ -15452,7 +15425,7 @@ ppc64_elf_finish_dynamic_symbol (bfd *output_bfd, if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || htab->relbss == NULL) + || htab->elf.srelbss == NULL) abort (); rela.r_offset = (h->root.u.def.value @@ -15460,8 +15433,8 @@ ppc64_elf_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY); rela.r_addend = 0; - loc = htab->relbss->contents; - loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela); + loc = htab->elf.srelbss->contents; + loc += htab->elf.srelbss->reloc_count++ * sizeof (Elf64_External_Rela); bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); } diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index 46d3099134e..ab2bbaa9331 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -651,8 +651,6 @@ struct elf_s390_link_hash_table struct elf_link_hash_table elf; /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; asection *irelifunc; union { @@ -730,37 +728,6 @@ elf_s390_link_hash_table_create (bfd *abfd) return &ret->elf.root; } -/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and - .rela.bss sections in DYNOBJ, and set up shortcuts to them in our - hash table. */ - -static bfd_boolean -elf_s390_create_dynamic_sections (bfd *dynobj, - struct bfd_link_info *info) -{ - struct elf_s390_link_hash_table *htab; - - htab = elf_s390_hash_table (info); - if (htab == NULL) - return FALSE; - - if (!htab->elf.sgot && !_bfd_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; -} - /* Copy the extra info we tack onto an elf_link_hash_entry. */ static void @@ -1728,11 +1695,11 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, runtime process image. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += sizeof (Elf64_External_Rela); + htab->elf.srelbss->size += sizeof (Elf64_External_Rela); h->needs_copy = 1; } - s = htab->sdynbss; + s = htab->elf.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -2131,7 +2098,7 @@ elf_s390_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.iplt || s == htab->elf.igotplt || s == htab->irelifunc) @@ -3625,7 +3592,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || htab->srelbss == NULL) + || htab->elf.srelbss == NULL) abort (); rela.r_offset = (h->root.u.def.value @@ -3633,8 +3600,8 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY); rela.r_addend = 0; - loc = htab->srelbss->contents; - loc += htab->srelbss->reloc_count++ * sizeof (Elf64_External_Rela); + loc = htab->elf.srelbss->contents; + loc += htab->elf.srelbss->reloc_count++ * sizeof (Elf64_External_Rela); bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); } @@ -4025,7 +3992,7 @@ const struct elf_size_info s390_elf64_size_info = #define elf_backend_adjust_dynamic_symbol elf_s390_adjust_dynamic_symbol #define elf_backend_check_relocs elf_s390_check_relocs #define elf_backend_copy_indirect_symbol elf_s390_copy_indirect_symbol -#define elf_backend_create_dynamic_sections elf_s390_create_dynamic_sections +#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections #define elf_backend_finish_dynamic_sections elf_s390_finish_dynamic_sections #define elf_backend_finish_dynamic_symbol elf_s390_finish_dynamic_symbol #define elf_backend_gc_mark_hook elf_s390_gc_mark_hook diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 2e21899f0e5..d5a36bcc749 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -862,8 +862,6 @@ struct elf_x86_64_link_hash_table /* Short-cuts to get to dynamic linker sections. */ asection *interp; - asection *sdynbss; - asection *srelbss; asection *plt_eh_frame; asection *plt_bnd; asection *plt_got; @@ -1127,29 +1125,6 @@ elf_x86_64_create_dynamic_sections (bfd *dynobj, htab->interp = s; } - htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!htab->sdynbss) - abort (); - - if (bfd_link_executable (info)) - { - /* Always allow copy relocs for building executables. */ - asection *s = bfd_get_linker_section (dynobj, ".rela.bss"); - if (s == NULL) - { - const struct elf_backend_data *bed = get_elf_backend_data (dynobj); - s = bfd_make_section_anyway_with_flags (dynobj, - ".rela.bss", - (bed->dynamic_sec_flags - | SEC_READONLY)); - if (s == NULL - || ! bfd_set_section_alignment (dynobj, s, - bed->s->log_file_align)) - return FALSE; - } - htab->srelbss = s; - } - if (!info->no_ld_generated_unwind_info && htab->plt_eh_frame == NULL && htab->elf.splt != NULL) @@ -3015,11 +2990,11 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info, { const struct elf_backend_data *bed; bed = get_elf_backend_data (info->output_bfd); - htab->srelbss->size += bed->s->sizeof_rela; + htab->elf.srelbss->size += bed->s->sizeof_rela; h->needs_copy = 1; } - s = htab->sdynbss; + s = htab->elf.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -3836,7 +3811,7 @@ elf_x86_64_size_dynamic_sections (bfd *output_bfd, || s == htab->plt_bnd || s == htab->plt_got || s == htab->plt_eh_frame - || s == htab->sdynbss) + || s == htab->elf.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ @@ -6055,7 +6030,7 @@ do_glob_dat: if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || htab->srelbss == NULL) + || htab->elf.srelbss == NULL) abort (); rela.r_offset = (h->root.u.def.value @@ -6063,7 +6038,7 @@ do_glob_dat: + h->root.u.def.section->output_offset); rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY); rela.r_addend = 0; - elf_append_rela (output_bfd, htab->srelbss, &rela); + elf_append_rela (output_bfd, htab->elf.srelbss, &rela); } return TRUE; diff --git a/bfd/elflink.c b/bfd/elflink.c index 07b79013d90..9728e29feaf 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -427,6 +427,7 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) (SEC_ALLOC | SEC_LINKER_CREATED)); if (s == NULL) return FALSE; + htab->sdynbss = s; /* The .rel[a].bss section holds copy relocs. This section is not normally needed. We need to create it here, though, so that the @@ -439,7 +440,7 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) be needed, we can discard it later. We will never need this section when generating a shared object, since they do not use copy relocs. */ - if (! bfd_link_pic (info)) + if (bfd_link_executable (info)) { s = bfd_make_section_anyway_with_flags (abfd, (bed->rela_plts_and_copies_p @@ -448,6 +449,7 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (s == NULL || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align)) return FALSE; + htab->srelbss = s; } } diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index d6cc2a0f542..8a5559685e7 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -2296,10 +2296,6 @@ struct elf_aarch64_link_hash_table /* The number of bytes in the subsequent PLT etries. */ bfd_size_type plt_entry_size; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - /* Small local sym cache. */ struct sym_cache sym_cache; @@ -6916,11 +6912,11 @@ elfNN_aarch64_adjust_dynamic_symbol (struct bfd_link_info *info, runtime process image. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += RELOC_SIZE (htab); + htab->root.srelbss->size += RELOC_SIZE (htab); h->needs_copy = 1; } - s = htab->sdynbss; + s = htab->root.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); @@ -7914,24 +7910,11 @@ static bfd_boolean elfNN_aarch64_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) { - struct elf_aarch64_link_hash_table *htab; - /* We need to create .got section. */ if (!aarch64_elf_create_got_section (dynobj, info)) return FALSE; - if (!_bfd_elf_create_dynamic_sections (dynobj, info)) - return FALSE; - - htab = elf_aarch64_hash_table (info); - htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!bfd_link_pic (info)) - htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); - - if (!htab->sdynbss || (!bfd_link_pic (info) && !htab->srelbss)) - abort (); - - return TRUE; + return _bfd_elf_create_dynamic_sections (dynobj, info); } @@ -8533,7 +8516,8 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, || s == htab->root.sgot || s == htab->root.sgotplt || s == htab->root.iplt - || s == htab->root.igotplt || s == htab->sdynbss) + || s == htab->root.igotplt + || s == htab->root.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ @@ -8944,7 +8928,7 @@ do_glob_dat: if (h->dynindx == -1 || (h->root.type != bfd_link_hash_defined && h->root.type != bfd_link_hash_defweak) - || htab->srelbss == NULL) + || htab->root.srelbss == NULL) abort (); rela.r_offset = (h->root.u.def.value @@ -8952,8 +8936,8 @@ do_glob_dat: + h->root.u.def.section->output_offset); rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY)); rela.r_addend = 0; - loc = htab->srelbss->contents; - loc += htab->srelbss->reloc_count++ * RELOC_SIZE (htab); + loc = htab->root.srelbss->contents; + loc += htab->root.srelbss->reloc_count++ * RELOC_SIZE (htab); bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc); } diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 7f3ca728b92..db4b7821df1 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -123,8 +123,6 @@ struct riscv_elf_link_hash_table struct elf_link_hash_table elf; /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; asection *sdyntdata; /* Small local sym to section mapping cache. */ @@ -363,17 +361,15 @@ riscv_elf_create_dynamic_sections (bfd *dynobj, 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"); htab->sdyntdata = bfd_make_section_anyway_with_flags (dynobj, ".tdata.dyn", SEC_ALLOC | SEC_THREAD_LOCAL); } - if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss - || (!bfd_link_pic (info) && (!htab->srelbss || !htab->sdyntdata))) + if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss + || (!bfd_link_pic (info) && (!htab->elf.srelbss || !htab->sdyntdata))) abort (); return TRUE; @@ -971,14 +967,14 @@ riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info, .rel.bss section we are going to use. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += sizeof (ElfNN_External_Rela); + htab->elf.srelbss->size += sizeof (ElfNN_External_Rela); h->needs_copy = 1; } if (eh->tls_type & ~GOT_NORMAL) return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdyntdata); - return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss); + return _bfd_elf_adjust_dynamic_copy (info, h, htab->elf.sdynbss); } /* Allocate space in .plt, .got and associated reloc sections for @@ -1332,7 +1328,7 @@ riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) if (s == htab->elf.splt || s == htab->elf.sgot || s == htab->elf.sgotplt - || s == htab->sdynbss) + || s == htab->elf.sdynbss) { /* Strip this section if we don't need it; see the comment below. */ @@ -2400,7 +2396,7 @@ riscv_elf_finish_dynamic_symbol (bfd *output_bfd, rela.r_offset = sec_addr (h->root.u.def.section) + h->root.u.def.value; rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY); rela.r_addend = 0; - riscv_elf_append_rela (output_bfd, htab->srelbss, &rela); + riscv_elf_append_rela (output_bfd, htab->elf.srelbss, &rela); } /* Mark some specially defined symbols as absolute. */ diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 486607c11ab..086d537e795 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -451,8 +451,6 @@ struct mips_elf_link_hash_table /* Shortcuts to some dynamic sections, or NULL if they are not being used. */ - asection *srelbss; - asection *sdynbss; asection *srelplt2; asection *sstubs; @@ -7893,16 +7891,6 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (!_bfd_elf_create_dynamic_sections (abfd, info)) return FALSE; - /* Cache the sections created above. */ - htab->sdynbss = bfd_get_linker_section (abfd, ".dynbss"); - if (htab->is_vxworks) - htab->srelbss = bfd_get_linker_section (abfd, ".rela.bss"); - if (!htab->sdynbss - || (htab->is_vxworks && !htab->srelbss && !bfd_link_pic (info)) - || !htab->root.srelplt - || !htab->root.splt) - abort (); - /* Do the usual VxWorks handling. */ if (htab->is_vxworks && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2)) @@ -9386,7 +9374,7 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) { if (htab->is_vxworks) - htab->srelbss->size += sizeof (Elf32_External_Rela); + htab->root.srelbss->size += sizeof (Elf32_External_Rela); else mips_elf_allocate_dynamic_relocations (dynobj, info, 1); h->needs_copy = 1; @@ -9396,7 +9384,7 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info, dynamic will now refer to the local copy instead. */ hmips->possibly_dynamic_relocs = 0; - return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss); + return _bfd_elf_adjust_dynamic_copy (info, h, htab->root.sdynbss); } /* This function is called after all the input files have been read, @@ -9918,7 +9906,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd, && s != htab->root.sgot && s != htab->root.sgotplt && s != htab->sstubs - && s != htab->sdynbss) + && s != htab->root.sdynbss) { /* It's not one of our sections, so don't allocate space. */ continue; @@ -11317,10 +11305,10 @@ _bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd, rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY); rel.r_addend = 0; bfd_elf32_swap_reloca_out (output_bfd, &rel, - htab->srelbss->contents - + (htab->srelbss->reloc_count + htab->root.srelbss->contents + + (htab->root.srelbss->reloc_count * sizeof (Elf32_External_Rela))); - ++htab->srelbss->reloc_count; + ++htab->root.srelbss->reloc_count; } /* If this is a mips16/microMIPS symbol, force the value to be even. */ diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index f191d57296d..050993ce1b3 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -1206,10 +1206,6 @@ _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj, 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->is_vxworks) { if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2)) @@ -1230,8 +1226,8 @@ _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj, } } - if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss - || (!bfd_link_pic (info) && !htab->srelbss)) + if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss + || (!bfd_link_pic (info) && !htab->elf.srelbss)) abort (); return TRUE; @@ -2205,11 +2201,11 @@ _bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, .rel.bss section we are going to use. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += SPARC_ELF_RELA_BYTES (htab); + htab->elf.srelbss->size += SPARC_ELF_RELA_BYTES (htab); h->needs_copy = 1; } - s = htab->sdynbss; + s = htab->elf.sdynbss; return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -2689,7 +2685,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd, if (s == htab->elf.splt || s == htab->elf.sgot - || s == htab->sdynbss + || s == htab->elf.sdynbss || s == htab->elf.iplt || s == htab->elf.sgotplt) { diff --git a/bfd/elfxx-sparc.h b/bfd/elfxx-sparc.h index f7ac456a80b..5270a37213b 100644 --- a/bfd/elfxx-sparc.h +++ b/bfd/elfxx-sparc.h @@ -46,10 +46,6 @@ struct _bfd_sparc_elf_link_hash_table { struct elf_link_hash_table elf; - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; - union { bfd_signed_vma refcount; diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c index 9cd71b64650..92b9de8aedf 100644 --- a/bfd/elfxx-tilegx.c +++ b/bfd/elfxx-tilegx.c @@ -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; @@ -1500,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. */ @@ -2453,11 +2433,11 @@ tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info, .rel.bss section we are going to use. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += TILEGX_ELF_RELA_BYTES (htab); + htab->elf.srelbss->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, htab->elf.sdynbss); } /* Allocate space in .plt, .got and associated reloc sections for @@ -2846,7 +2826,7 @@ 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) { /* Strip this section if we don't need it; see the comment below. */ @@ -4207,7 +4187,7 @@ 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; + s = htab->elf.srelbss; BFD_ASSERT (s != NULL); rela.r_offset = (h->root.u.def.value