summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/unexw32.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/unexw32.c b/src/unexw32.c
index 4cdffac287d..743ce0086f6 100644
--- a/src/unexw32.c
+++ b/src/unexw32.c
@@ -99,7 +99,7 @@ _start (void)
{
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 @@ copy_executable_and_dump_data (file_data *p_infile,
#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_executable_and_dump_data (file_data *p_infile,
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_executable_and_dump_data (file_data *p_infile,
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 @@ copy_executable_and_dump_data (file_data *p_infile,
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--;