PR24144, pdp11-ld overwriting section data with zeros
authorAlan Modra <amodra@gmail.com>
Sun, 24 Feb 2019 06:14:48 +0000 (16:44 +1030)
committerAlan Modra <amodra@gmail.com>
Sun, 24 Feb 2019 08:27:04 +0000 (18:57 +1030)
bfd/
PR 24144
* pdp11.c (set_section_contents): Revert 2015-02-24 change.
gas/
PR 24144
* config/obj-aout.c (obj_aout_frob_file_before_fix): Write to end
of section to ensure file contents cover aligned section size.

bfd/ChangeLog
bfd/pdp11.c
gas/ChangeLog
gas/config/obj-aout.c

index ce088c9..e206629 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-24  Alan Modra  <amodra@gmail.com>
+
+       PR 24144
+       * pdp11.c (set_section_contents): Revert 2015-02-24 change.
+
 2019-02-20  Eric Tsai  <erictsai@cadence.com>
 
        * elf32-xtensa.c (is_resolvable_asm_expansion): Scan output
index a46775a..b16c78f 100644 (file)
@@ -1146,14 +1146,6 @@ NAME (aout, set_section_contents) (bfd *abfd,
       if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
          || bfd_bwrite (location, count, abfd) != count)
        return FALSE;
-
-      /* If necessary, pad the section to its aligned size.  */
-      if ((section == obj_datasec (abfd)
-          || section == obj_textsec (abfd))
-         && count < section->size
-         && (bfd_seek (abfd, section->filepos + offset + section->size - 1, SEEK_SET) != 0
-             || bfd_bwrite ("", 1, abfd) != 1))
-       return FALSE;
     }
 
   return TRUE;
index a301c04..03c9b4e 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-24  Alan Modra  <amodra@gmail.com>
+
+       PR 24144
+       * config/obj-aout.c (obj_aout_frob_file_before_fix): Write to end
+       of section to ensure file contents cover aligned section size.
+
 2019-02-22  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/tc-arm.c (arm_cpus): Add neoverse-n1.
index 22e103b..03e0ef3 100644 (file)
@@ -118,17 +118,27 @@ obj_aout_frob_file_before_fix (void)
 {
   /* Relocation processing may require knowing the VMAs of the sections.
      Since writing to a section will cause the BFD back end to compute the
-     VMAs, fake it out here....  */
-  bfd_byte b = 0;
-  bfd_boolean x = TRUE;
-  if (bfd_section_size (stdoutput, text_section) != 0)
-    x = bfd_set_section_contents (stdoutput, text_section, &b, (file_ptr) 0,
-                                 (bfd_size_type) 1);
-  else if (bfd_section_size (stdoutput, data_section) != 0)
-    x = bfd_set_section_contents (stdoutput, data_section, &b, (file_ptr) 0,
-                                 (bfd_size_type) 1);
-
-  gas_assert (x);
+     VMAs, fake it out here....
+     Writing to the end of the section ensures the file contents
+     extend to cover the entire aligned size.  We possibly won't know
+     the aligned size until after VMAs and sizes are set on the first
+     bfd_set_section_contents call, so it might be necessary to repeat.  */
+  asection *sec = NULL;
+  if (data_section->size != 0)
+    sec = data_section;
+  else if (text_section->size != 0)
+    sec = text_section;
+  if (sec)
+    {
+      bfd_size_type size;
+      do
+       {
+         bfd_byte b = 0;
+         size = sec->size;
+         gas_assert (bfd_set_section_contents (stdoutput, sec, &b,
+                                               size - 1, (bfd_size_type) 1));
+       } while (size != sec->size);
+    }
 }
 
 static void