changeset 24237:16e5582ed876

(ROUND_UP_DST_AND_ZERO): New macro. (copy_executable_and_dump_data): Use it to ensure alignment slop is zeroed.
author Andrew Innes <andrewi@gnu.org>
date Sun, 31 Jan 1999 21:53:14 +0000
parents c83c9b5cc93f
children 20d23ea9713b
files src/unexw32.c
diffstat 1 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/unexw32.c	Sun Jan 31 21:50:21 1999 +0000
+++ b/src/unexw32.c	Sun Jan 31 21:53:14 1999 +0000
@@ -99,7 +99,7 @@
 {
   extern void mainCRTStartup (void);
 
-#if 0
+#if 1
   /* Give us a way to debug problems with crashes on startup when
      running under the MSVC profiler. */
   if (GetEnvironmentVariable ("EMACS_DEBUG", NULL, 0) > 0)
@@ -499,6 +499,14 @@
 #define DST_TO_OFFSET()  PTR_TO_OFFSET (dst, p_outfile)
 #define ROUND_UP_DST(align) \
   (dst = p_outfile->file_base + ROUND_UP (DST_TO_OFFSET (), (align)))
+#define ROUND_UP_DST_AND_ZERO(align)						\
+  do {										\
+    unsigned char *newdst = p_outfile->file_base				\
+      + ROUND_UP (DST_TO_OFFSET (), (align));					\
+    /* Zero the alignment slop; it may actually initialize real data.  */	\
+    memset (dst, 0, newdst - dst);						\
+    dst = newdst;								\
+  } while (0)
 
   /* Copy the source image sequentially, ie. section by section after
      copying the headers and section table, to simplify the process of
@@ -522,13 +530,16 @@
   COPY_CHUNK ("Copying section table...", section,
 	      nt_header->FileHeader.NumberOfSections * sizeof (*section));
 
+  /* Align the first section's raw data area, and set the header size
+     field accordingly.  */
+  ROUND_UP_DST_AND_ZERO (dst_nt_header->OptionalHeader.FileAlignment);
+  dst_nt_header->OptionalHeader.SizeOfHeaders = DST_TO_OFFSET ();
+
   for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
     {
       char msg[100];
       sprintf (msg, "Copying raw data for %s...", section->Name);
 
-      /* Align the section's raw data area.  */
-      ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
       dst_save = dst;
 
       /* Update the file-relative offset for this section's raw data (if
@@ -541,6 +552,8 @@
       COPY_CHUNK
 	(msg, OFFSET_TO_PTR (section->PointerToRawData, p_infile),
 	 section->SizeOfRawData);
+      /* Ensure alignment slop is zeroed.  */
+      ROUND_UP_DST_AND_ZERO (dst_nt_header->OptionalHeader.FileAlignment);
 
       /* Note that various sections below may be aliases.  */
       if (section == data_section)
@@ -608,13 +621,13 @@
 	  dst_section->Characteristics |= IMAGE_SCN_CNT_INITIALIZED_DATA;
 	}
 
+      /* Align the section's raw data area.  */
+      ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
+
       section++;
       dst_section++;
     }
 
-  /* Pad out the final section raw data area.  */
-  ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
-
   /* Copy remainder of source image.  */
   do
     section--;