changeset 24236:c83c9b5cc93f

ROUND_UP_DST_AND_ZERO): Renamed from ROUND_UP_DST. Zeroes the alignment slop. (copy_executable_and_add_section): Update the SizeOfHeaders field properly.
author Andrew Innes <andrewi@gnu.org>
date Sun, 31 Jan 1999 21:50:21 +0000
parents d8812963530b
children 16e5582ed876
files nt/addsection.c
diffstat 1 files changed, 16 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/nt/addsection.c	Sun Jan 31 18:31:15 1999 +0000
+++ b/nt/addsection.c	Sun Jan 31 21:50:21 1999 +0000
@@ -293,8 +293,14 @@
   } while (0)
 
 #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
@@ -333,14 +339,16 @@
   else
     new_section_name = NULL;
 
+  /* 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);
-
       /* Update the file-relative offset for this section's raw data (if
          it has any) in case things have been relocated; we will update
          the other offsets below once we know where everything is.  */
@@ -357,13 +365,13 @@
 	ROUND_UP (dst_section->SizeOfRawData,
 		  dst_nt_header->OptionalHeader.FileAlignment);
 
+      /* Align the next section's raw data area.  */
+      ROUND_UP_DST_AND_ZERO (dst_nt_header->OptionalHeader.FileAlignment);
+
       section++;
       dst_section++;
     }
 
-  /* Pad out the final section raw data area.  */
-  ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
-
   /* Add the extra section entry (which adds no raw data).  */
   if (new_section_name != NULL)
     {