diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 652c074f73..29166e749b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,29 @@ +2017-02-28 Alan Modra + + * elflink.c (_bfd_elf_create_dynamic_sections): Don't make + dynamic .data.rel.ro read-only. + * elf32-arm.c (elf32_arm_finish_dynamic_symbol): Compare section + rather than section flags when deciding where copy reloc goes. + * elf32-cris.c (elf_cris_finish_dynamic_symbol): Likewise. + * elf32-hppa.c (elf32_hppa_finish_dynamic_symbol): Likewise. + * elf32-i386.c (elf_i386_finish_dynamic_symbol): Likewise. + * elf32-metag.c (elf_metag_finish_dynamic_symbol): Likewise. + * elf32-microblaze.c (microblaze_elf_finish_dynamic_symbol): Likewise. + * elf32-nios2.c (nios2_elf32_finish_dynamic_symbol): Likewise. + * elf32-or1k.c (or1k_elf_finish_dynamic_symbol): Likewise. + * elf32-ppc.c (ppc_elf_finish_dynamic_symbol): Likewise. + * elf32-s390.c (elf_s390_finish_dynamic_symbol): Likewise. + * elf32-tic6x.c (elf32_tic6x_finish_dynamic_symbol): Likewise. + * elf32-tilepro.c (tilepro_elf_finish_dynamic_symbol): Likewise. + * elf64-ppc.c (ppc64_elf_finish_dynamic_symbol): Likewise. + * elf64-s390.c (elf_s390_finish_dynamic_symbol): Likewise. + * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Likewise. + * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): Likewise. + * elfnn-riscv.c (riscv_elf_finish_dynamic_symbol): Likewise. + * elfxx-mips.c (_bfd_mips_vxworks_finish_dynamic_symbol): Likewise. + * elfxx-sparc.c (_bfd_sparc_elf_finish_dynamic_symbol): Likewise. + * elfxx-tilegx.c (tilegx_elf_finish_dynamic_symbol): Likewise. + 2017-02-28 Maciej W. Rozycki * elfxx-mips.c (mips_elf_perform_relocation): Also handle the diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 8171b0bd9a..0a785951dc 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -16311,7 +16311,7 @@ elf32_arm_finish_dynamic_symbol (bfd * output_bfd, + h->root.u.def.section->output_section->vma + h->root.u.def.section->output_offset); rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY); - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->root.sdynrelro) s = htab->root.sreldynrelro; else s = htab->root.srelbss; diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index a69c7e4876..97b8cc3eb8 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -2275,7 +2275,7 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd, && (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak)); - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->root.sdynrelro) s = htab->root.sreldynrelro; else s = htab->root.srelbss; diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index d5b911cf6a..1deebf4f03 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -4432,7 +4432,7 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd, + eh->root.u.def.section->output_section->vma); rela.r_addend = 0; rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY); - if ((eh->root.u.def.section->flags & SEC_READONLY) != 0) + if (eh->root.u.def.section == htab->etab.sdynrelro) sec = htab->etab.sreldynrelro; else sec = htab->etab.srelbss; diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index e6e70d8fba..2784ef71cb 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -5666,7 +5666,7 @@ do_glob_dat: + 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); - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elf32-metag.c b/bfd/elf32-metag.c index 40a2bafa2c..c45d719269 100644 --- a/bfd/elf32-metag.c +++ b/bfd/elf32-metag.c @@ -3229,7 +3229,7 @@ elf_metag_finish_dynamic_symbol (bfd *output_bfd, + eh->root.u.def.section->output_section->vma); rel.r_addend = 0; rel.r_info = ELF32_R_INFO (eh->dynindx, R_METAG_COPY); - if ((eh->root.u.def.section->flags & SEC_READONLY) != 0) + if (eh->root.u.def.section == htab->etab.sdynrelro) s = htab->etab.sreldynrelro; else s = htab->etab.srelbss; diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c index 27118c1ef0..325a0d64c3 100644 --- a/bfd/elf32-microblaze.c +++ b/bfd/elf32-microblaze.c @@ -3277,7 +3277,7 @@ microblaze_elf_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = ELF32_R_INFO (h->dynindx, R_MICROBLAZE_COPY); rela.r_addend = 0; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c index 3e4706f35f..d07ef67a85 100644 --- a/bfd/elf32-nios2.c +++ b/bfd/elf32-nios2.c @@ -5280,7 +5280,7 @@ nios2_elf32_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY); rela.r_addend = 0; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->root.sdynrelro) s = htab->root.sreldynrelro; else s = htab->root.srelbss; diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c index 8e0ef727b0..224cbb892c 100644 --- a/bfd/elf32-or1k.c +++ b/bfd/elf32-or1k.c @@ -1949,7 +1949,7 @@ or1k_elf_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY); rela.r_addend = 0; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->root.sdynrelro) s = htab->root.sreldynrelro; else s = htab->root.srelbss; diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index e71757eab0..834ef67d00 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -10355,7 +10355,7 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd, if (ppc_elf_hash_entry (h)->has_sda_refs) s = htab->relsbss; - else if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + else if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index e5cb3b4d59..fd1bc13d5c 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -3827,7 +3827,7 @@ 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; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index 08361d96fc..f65e24f44b 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -1876,7 +1876,7 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd, + h->root.u.def.section->output_offset); rel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_COPY); rel.r_addend = 0; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c index 660b112abe..fb06a47739 100644 --- a/bfd/elf32-tilepro.c +++ b/bfd/elf32-tilepro.c @@ -3813,7 +3813,7 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_COPY); rela.r_addend = 0; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 4d90e0a1a6..7b8bacf391 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -15477,7 +15477,7 @@ 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; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) srel = htab->elf.sreldynrelro; else srel = htab->elf.srelbss; diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index edc9b861ea..b5fd05f263 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -3623,7 +3623,7 @@ 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; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index a058eca3ab..e0e6c16fcd 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -6189,7 +6189,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; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elflink.c b/bfd/elflink.c index 027ce83ce1..776357fe68 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -424,7 +424,7 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) initialize them at run time. The linker script puts the .dynbss section into the .bss section of the final image. */ s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", - (SEC_ALLOC | SEC_LINKER_CREATED)); + SEC_ALLOC | SEC_LINKER_CREATED); if (s == NULL) return FALSE; htab->sdynbss = s; @@ -432,11 +432,10 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (bed->want_dynrelro) { /* Similarly, but for symbols that were originally in read-only - sections. */ + sections. This section doesn't really need to have contents, + but make it like other .data.rel.ro sections. */ s = bfd_make_section_anyway_with_flags (abfd, ".data.rel.ro", - (SEC_ALLOC | SEC_READONLY - | SEC_HAS_CONTENTS - | SEC_LINKER_CREATED)); + flags); if (s == NULL) return FALSE; htab->sdynrelro = s; diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index c86a3e16ee..dfba7f753f 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -8988,7 +8988,7 @@ 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; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->root.sdynrelro) s = htab->root.sreldynrelro; else s = htab->root.srelbss; diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 2ccfc5f08f..e476bb150b 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -2412,7 +2412,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; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 7a1d5f848b..901ddc15f4 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -11173,7 +11173,7 @@ _bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.value); rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY); rel.r_addend = 0; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->root.sdynrelro) srel = htab->root.sreldynrelro; else srel = htab->root.srelbss; diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index f66525e11f..80fda1b0e0 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -4568,7 +4568,7 @@ _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd, + h->root.u.def.section->output_offset); rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY); rela.r_addend = 0; - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss; diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c index eb12695d02..76dfcd8149 100644 --- a/bfd/elfxx-tilegx.c +++ b/bfd/elfxx-tilegx.c @@ -4198,7 +4198,7 @@ tilegx_elf_finish_dynamic_symbol (bfd *output_bfd, /* This symbols needs a copy reloc. Set it up. */ BFD_ASSERT (h->dynindx != -1); - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + if (h->root.u.def.section == htab->elf.sdynrelro) s = htab->elf.sreldynrelro; else s = htab->elf.srelbss;