X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/dacbc44ca3fc825c9e5ffa799f1a0937c1da0020..11dde529083c0b3df2e8e91913426ed4975b77c3:/src/unexcw.c
diff --git a/src/unexcw.c b/src/unexcw.c
index 8b69e60a1b..12435a8505 100644
--- a/src/unexcw.c
+++ b/src/unexcw.c
@@ -20,9 +20,8 @@ along with GNU Emacs. If not, see . */
#include
#include "unexec.h"
-#include "w32common.h"
+#include "lisp.h"
-#include
#include
#include
#include
@@ -31,6 +30,8 @@ along with GNU Emacs. If not, see . */
#define DOTEXE ".exe"
+extern void report_sheap_usage (int);
+
extern int bss_sbrk_did_unexec;
extern int __malloc_initialized;
@@ -73,7 +74,11 @@ read_exe_header (int fd, exe_header_t * exe_header_buffer)
assert (exe_header_buffer->file_header.e_magic == 0x5a4d);
assert (exe_header_buffer->file_header.nt_signature == 0x4550);
+#ifdef __x86_64__
+ assert (exe_header_buffer->file_header.f_magic == 0x8664);
+#else
assert (exe_header_buffer->file_header.f_magic == 0x014c);
+#endif
assert (exe_header_buffer->file_header.f_nscns > 0);
assert (exe_header_buffer->file_header.f_nscns <=
sizeof (exe_header_buffer->section_header) /
@@ -85,7 +90,11 @@ read_exe_header (int fd, exe_header_t * exe_header_buffer)
sizeof (exe_header_buffer->file_optional_header));
assert (ret == sizeof (exe_header_buffer->file_optional_header));
+#ifdef __x86_64__
+ assert (exe_header_buffer->file_optional_header.magic == 0x020b);
+#else
assert (exe_header_buffer->file_optional_header.magic == 0x010b);
+#endif
for (i = 0; i < exe_header_buffer->file_header.f_nscns; ++i)
{
@@ -132,7 +141,7 @@ fixup_executable (int fd)
exe_header->file_optional_header.ImageBase +
exe_header->section_header[i].s_paddr;
if (debug_unexcw)
- printf ("%8s start 0x%08x end 0x%08x\n",
+ printf ("%8s start %#lx end %#lx\n",
exe_header->section_header[i].s_name,
start_address, end_address);
if (my_edata >= (char *) start_address
@@ -149,7 +158,7 @@ fixup_executable (int fd)
assert (ret == my_edata - (char *) start_address);
++found_data;
if (debug_unexcw)
- printf (" .data, mem start 0x%08x mem length %d\n",
+ printf (" .data, mem start %#lx mem length %d\n",
start_address, my_edata - (char *) start_address);
if (debug_unexcw)
printf (" .data, file start %d file length %d\n",
@@ -183,6 +192,19 @@ fixup_executable (int fd)
exe_header->file_optional_header.FileAlignment *
exe_header->file_optional_header.FileAlignment;
+ /* Make sure the generated bootstrap binary isn't
+ * sparse. NT doesn't use a file cache for sparse
+ * executables, so if we bootstrap Emacs using a sparse
+ * bootstrap-emacs.exe, bootstrap takes about twenty
+ * times longer than it would otherwise. */
+
+ ret = posix_fallocate (fd,
+ ( exe_header->section_header[i].s_scnptr +
+ exe_header->section_header[i].s_size ),
+ 1);
+
+ assert (ret != -1);
+
ret =
lseek (fd,
(long) (exe_header->section_header[i].s_scnptr +
@@ -220,7 +242,7 @@ fixup_executable (int fd)
__malloc_initialized = 1;
assert (ret == (my_endbss - (char *) start_address));
if (debug_unexcw)
- printf (" .bss, mem start 0x%08x mem length %d\n",
+ printf (" .bss, mem start %#lx mem length %d\n",
start_address, my_endbss - (char *) start_address);
if (debug_unexcw)
printf (" .bss, file start %d file length %d\n",
@@ -276,9 +298,9 @@ unexec (const char *outfile, const char *infile)
infile = add_exe_suffix_if_necessary (infile, infile_buffer);
outfile = add_exe_suffix_if_necessary (outfile, outfile_buffer);
- fd_in = open (infile, O_RDONLY | O_BINARY);
+ fd_in = emacs_open (infile, O_RDONLY | O_BINARY, 0);
assert (fd_in >= 0);
- fd_out = open (outfile, O_RDWR | O_TRUNC | O_CREAT | O_BINARY, 0755);
+ fd_out = emacs_open (outfile, O_RDWR | O_TRUNC | O_CREAT | O_BINARY, 0755);
assert (fd_out >= 0);
for (;;)
{
@@ -294,13 +316,13 @@ unexec (const char *outfile, const char *infile)
ret2 = write (fd_out, buffer, ret);
assert (ret2 == ret);
}
- ret = close (fd_in);
+ ret = emacs_close (fd_in);
assert (ret == 0);
bss_sbrk_did_unexec = 1;
fixup_executable (fd_out);
bss_sbrk_did_unexec = 0;
- ret = close (fd_out);
+ ret = emacs_close (fd_out);
assert (ret == 0);
}