diff options
-rw-r--r-- | bfd/ChangeLog | 26 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 2 | ||||
-rw-r--r-- | bfd/elf32-cris.c | 2 | ||||
-rw-r--r-- | bfd/elf32-hppa.c | 2 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 2 | ||||
-rw-r--r-- | bfd/elf32-metag.c | 2 | ||||
-rw-r--r-- | bfd/elf32-microblaze.c | 2 | ||||
-rw-r--r-- | bfd/elf32-nios2.c | 2 | ||||
-rw-r--r-- | bfd/elf32-or1k.c | 2 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 2 | ||||
-rw-r--r-- | bfd/elf32-s390.c | 2 | ||||
-rw-r--r-- | bfd/elf32-tic6x.c | 2 | ||||
-rw-r--r-- | bfd/elf32-tilepro.c | 2 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 2 | ||||
-rw-r--r-- | bfd/elf64-s390.c | 2 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 2 | ||||
-rw-r--r-- | bfd/elflink.c | 9 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 2 | ||||
-rw-r--r-- | bfd/elfnn-riscv.c | 2 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 2 | ||||
-rw-r--r-- | bfd/elfxx-sparc.c | 2 | ||||
-rw-r--r-- | bfd/elfxx-tilegx.c | 2 |
22 files changed, 50 insertions, 25 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 652c074..29166e7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,29 @@ +2017-02-28 Alan Modra <amodra@gmail.com> + + * 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 <macro@imgtec.com> * elfxx-mips.c (mips_elf_perform_relocation): Also handle the diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 8171b0b..0a78595 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 a69c7e4..97b8cc3 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 d5b911c..1deebf4 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 e6e70d8..2784ef7 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 40a2baf..c45d719 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 27118c1..325a0d6 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 3e4706f..d07ef67 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 8e0ef72..224cbb8 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 e71757e..834ef67 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 e5cb3b4..fd1bc13 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 08361d9..f65e24f 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 660b112..fb06a47 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 4d90e0a..7b8bacf 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 edc9b86..b5fd05f 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 a058eca..e0e6c16 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 027ce83..776357f 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 c86a3e1..dfba7f7 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 2ccfc5f..e476bb1 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 7a1d5f8..901ddc1 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 f66525e..80fda1b 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 eb12695..76dfcd8 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; |