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:
parent
0e39210161
commit
afbf7e8e3a
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user