PR24144, pdp11-ld overwriting section data with zeros

Alan Modra amodra@gmail.com
Sun Feb 24 08:26:00 GMT 2019


I think this is more like Nick intended..

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.

diff --git a/bfd/pdp11.c b/bfd/pdp11.c
index a46775a4ed..b16c78f939 100644
--- a/bfd/pdp11.c
+++ b/bfd/pdp11.c
@@ -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;
diff --git a/gas/config/obj-aout.c b/gas/config/obj-aout.c
index 22e103b1e3..03e0ef3c0a 100644
--- a/gas/config/obj-aout.c
+++ b/gas/config/obj-aout.c
@@ -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

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list