Don't make dynamic .data.rel.ro SEC_READONLY

I'd made this dynamic section read-only so a flag test distinguished
it from .dynbss, but like any other .data.rel.ro section it really
should be marked read-write.  (It is read-only after relocation, not
before.)  When using the standard linker scripts this usually doesn't
matter since the output section is among other read-write sections and
not page aligned.  However, it might matter in the extraordinary case
of the dynamic section being the only .data.rel.ro section with the
output section just happening to be page aligned and a multiple of a
page in size.  In that case the output section would be read-only, and
live it its own read-only PT_LOAD segment, which is incorrect.

	* 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.
This commit is contained in:
Alan Modra 2017-02-28 08:06:02 +10:30
parent 0e39210161
commit afbf7e8e3a
22 changed files with 50 additions and 25 deletions

View File

@ -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> 2017-02-28 Maciej W. Rozycki <macro@imgtec.com>
* elfxx-mips.c (mips_elf_perform_relocation): Also handle the * elfxx-mips.c (mips_elf_perform_relocation): Also handle the

View File

@ -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_section->vma
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY); 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; s = htab->root.sreldynrelro;
else else
s = htab->root.srelbss; s = htab->root.srelbss;

View File

@ -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_defined
|| h->root.type == bfd_link_hash_defweak)); || 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; s = htab->root.sreldynrelro;
else else
s = htab->root.srelbss; s = htab->root.srelbss;

View File

@ -4432,7 +4432,7 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
+ eh->root.u.def.section->output_section->vma); + eh->root.u.def.section->output_section->vma);
rela.r_addend = 0; rela.r_addend = 0;
rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY); 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; sec = htab->etab.sreldynrelro;
else else
sec = htab->etab.srelbss; sec = htab->etab.srelbss;

View File

@ -5666,7 +5666,7 @@ do_glob_dat:
+ h->root.u.def.section->output_section->vma + h->root.u.def.section->output_section->vma
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY); 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -3229,7 +3229,7 @@ elf_metag_finish_dynamic_symbol (bfd *output_bfd,
+ eh->root.u.def.section->output_section->vma); + eh->root.u.def.section->output_section->vma);
rel.r_addend = 0; rel.r_addend = 0;
rel.r_info = ELF32_R_INFO (eh->dynindx, R_METAG_COPY); 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; s = htab->etab.sreldynrelro;
else else
s = htab->etab.srelbss; s = htab->etab.srelbss;

View File

@ -3277,7 +3277,7 @@ microblaze_elf_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_MICROBLAZE_COPY); rela.r_info = ELF32_R_INFO (h->dynindx, R_MICROBLAZE_COPY);
rela.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -5280,7 +5280,7 @@ nios2_elf32_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY); rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY);
rela.r_addend = 0; 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; s = htab->root.sreldynrelro;
else else
s = htab->root.srelbss; s = htab->root.srelbss;

View File

@ -1949,7 +1949,7 @@ or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY); rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
rela.r_addend = 0; 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; s = htab->root.sreldynrelro;
else else
s = htab->root.srelbss; s = htab->root.srelbss;

View File

@ -10355,7 +10355,7 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
if (ppc_elf_hash_entry (h)->has_sda_refs) if (ppc_elf_hash_entry (h)->has_sda_refs)
s = htab->relsbss; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -3827,7 +3827,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_390_COPY); rela.r_info = ELF32_R_INFO (h->dynindx, R_390_COPY);
rela.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -1876,7 +1876,7 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_COPY); rel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_COPY);
rel.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -3813,7 +3813,7 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_COPY); rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_COPY);
rela.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -15477,7 +15477,7 @@ ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY); rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
rela.r_addend = 0; 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; srel = htab->elf.sreldynrelro;
else else
srel = htab->elf.srelbss; srel = htab->elf.srelbss;

View File

@ -3623,7 +3623,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY); rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
rela.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -6189,7 +6189,7 @@ do_glob_dat:
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY); rela.r_info = htab->r_info (h->dynindx, R_X86_64_COPY);
rela.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -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 initialize them at run time. The linker script puts the .dynbss
section into the .bss section of the final image. */ section into the .bss section of the final image. */
s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
(SEC_ALLOC | SEC_LINKER_CREATED)); SEC_ALLOC | SEC_LINKER_CREATED);
if (s == NULL) if (s == NULL)
return FALSE; return FALSE;
htab->sdynbss = s; htab->sdynbss = s;
@ -432,11 +432,10 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
if (bed->want_dynrelro) if (bed->want_dynrelro)
{ {
/* Similarly, but for symbols that were originally in read-only /* 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", s = bfd_make_section_anyway_with_flags (abfd, ".data.rel.ro",
(SEC_ALLOC | SEC_READONLY flags);
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED));
if (s == NULL) if (s == NULL)
return FALSE; return FALSE;
htab->sdynrelro = s; htab->sdynrelro = s;

View File

@ -8988,7 +8988,7 @@ do_glob_dat:
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY)); rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY));
rela.r_addend = 0; 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; s = htab->root.sreldynrelro;
else else
s = htab->root.srelbss; s = htab->root.srelbss;

View File

@ -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_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_info = ELFNN_R_INFO (h->dynindx, R_RISCV_COPY);
rela.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -11173,7 +11173,7 @@ _bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.value); + h->root.u.def.value);
rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY); rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
rel.r_addend = 0; 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; srel = htab->root.sreldynrelro;
else else
srel = htab->root.srelbss; srel = htab->root.srelbss;

View File

@ -4568,7 +4568,7 @@ _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset); + h->root.u.def.section->output_offset);
rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY); rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
rela.r_addend = 0; 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;

View File

@ -4198,7 +4198,7 @@ tilegx_elf_finish_dynamic_symbol (bfd *output_bfd,
/* This symbols needs a copy reloc. Set it up. */ /* This symbols needs a copy reloc. Set it up. */
BFD_ASSERT (h->dynindx != -1); 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; s = htab->elf.sreldynrelro;
else else
s = htab->elf.srelbss; s = htab->elf.srelbss;