]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Don't make dynamic .data.rel.ro SEC_READONLY
authorAlan Modra <amodra@gmail.com>
Mon, 27 Feb 2017 21:36:02 +0000 (08:06 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 28 Feb 2017 06:33:30 +0000 (17:03 +1030)
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.

22 files changed:
bfd/ChangeLog
bfd/elf32-arm.c
bfd/elf32-cris.c
bfd/elf32-hppa.c
bfd/elf32-i386.c
bfd/elf32-metag.c
bfd/elf32-microblaze.c
bfd/elf32-nios2.c
bfd/elf32-or1k.c
bfd/elf32-ppc.c
bfd/elf32-s390.c
bfd/elf32-tic6x.c
bfd/elf32-tilepro.c
bfd/elf64-ppc.c
bfd/elf64-s390.c
bfd/elf64-x86-64.c
bfd/elflink.c
bfd/elfnn-aarch64.c
bfd/elfnn-riscv.c
bfd/elfxx-mips.c
bfd/elfxx-sparc.c
bfd/elfxx-tilegx.c

index a791fd01a1b9d9e56c6f16df36f431a8e29cdadd..5a61bd5e0403477b87ac89d0a08c960943e0d161 100644 (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  Alan Modra  <amodra@gmail.com>
 
        * reloc.c (BFD_RELOC_PPC_16DX_HA): New.
index 8171b0bd9a5ea6f27369f80d1ccf0c61957497c0..0a785951dcaeb42ad82e07dfa2ceac324a9dda1c 100644 (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_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;
index a69c7e48767b87c69ea7a148b29f851447a99f7a..97b8cc3eb85c4c983d16fbaef68478c6deba2a97 100644 (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_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;
index d5b911cf6a18bc85a7c79df8c87b3e07dddef7e2..1deebf4f038ee595757be714e2429331620300a2 100644 (file)
@@ -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;
index b564d672d0862bc36428cc48c42afcc916ceb7ed..24beba3e1d5fef9d48d174c001c4b30edc458571 100644 (file)
@@ -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;
index 40a2bafa2cf93bde96fd68cb064b7dd43943817d..c45d719269e12954875a480bb10007a6780264e6 100644 (file)
@@ -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;
index 52c60efce651d73b3b46203554be746e702fec07..7765fe8e293a193fcc2f4d7379716ea443ababb4 100644 (file)
@@ -3269,7 +3269,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;
index 3e4706f35f09aac50bfac1d7ee6be4d01809de4e..d07ef67a85e17d55e398f4af5dd3c2526b975217 100644 (file)
@@ -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;
index 8e0ef727b0f1e72949a79fabdb3bc04a66138753..224cbb892c1170a5be1bac3b8170e3a5fb48e8da 100644 (file)
@@ -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;
index b98e60dd88dbdc18e32ed316c91591274c00ca38..0f3eb68d35a2c7082c53581b1088e7be17c1989d 100644 (file)
@@ -10366,7 +10366,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;
index e5cb3b4d595d150ecbddf513f1ca0d88bf1e9f6f..fd1bc13d5c09383984731da0bcb28282e1ac8024 100644 (file)
@@ -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;
index 08361d96fc1d4468d1eeec3728e7c0fcd7f33f43..f65e24f44b38c47c0ad2874d707017879af48c41 100644 (file)
@@ -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;
index 660b112abe13b53684cbbb567c78c570b330572d..fb06a477396f8a065743bf4f4326d6170f455d99 100644 (file)
@@ -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;
index 28fbbb8685a02f4c5bfad18839d7dddf040d7f79..e7d479224548c1f5d4d9ef325be1c8b8ad8cd5ee 100644 (file)
@@ -15463,7 +15463,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;
index edc9b861ea54a505f82146adcd8ec853457beb72..b5fd05f2630e53b67e3a32bfdb25f67a9b13539d 100644 (file)
@@ -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;
index a058eca3abf03cc2f79601d170b2d6b9f9c459e5..e0e6c16fcd32b077228851597d087b98d053d9f0 100644 (file)
@@ -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;
index a9df6bd603f775c4fde4a34ba75fea9a65081fa1..69b66f2831f350968a96b968d43d6cadcdf84adb 100644 (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
         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;
index 6ea2d355d412ec5cbbfa7aba3f1cc72926ebee5e..d632b3c3f5d563b6dc5ba6712fbb7388e7a748ac 100644 (file)
@@ -8946,7 +8946,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;
index 732a989a82f2cb7da84feda72f71dd15bdd6b2ad..ff25ebd32edfeea83c213660620aea8fbdd8faf0 100644 (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_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;
index c184d2e0e01e8f23e40467d4979dbf852da4888c..723853f8216ed86b44062552cca686f04010ed54 100644 (file)
@@ -11328,7 +11328,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;
index f66525e11ffd5e5270283d2f3ab5f3a5e6a4c7fc..80fda1b0e04ff80c3c0206e624d58120e25ab817 100644 (file)
@@ -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;
index eb12695d027f7c2e29a037704fd247ff61988f44..76dfcd81499318c3fe23b170c76c2c4b25eb3d2c 100644 (file)
@@ -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;