X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/3a880af4a79688e90da45311a8d85bae2d59a811..dff4a9f6a4e9e42de6177e29faa7e3524b47e6d4:/src/unexcw.c diff --git a/src/unexcw.c b/src/unexcw.c index 96c4b4a9ae..7636b05a12 100644 --- a/src/unexcw.c +++ b/src/unexcw.c @@ -1,7 +1,7 @@ /* unexec() support for Cygwin; complete rewrite of xemacs Cygwin unexec() code - Copyright (C) 2004-2012 Free Software Foundation, Inc. + Copyright (C) 2004-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -20,8 +20,8 @@ along with GNU Emacs. If not, see . */ #include #include "unexec.h" +#include "lisp.h" -#include #include #include #include @@ -30,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; @@ -72,11 +74,14 @@ 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) / - sizeof (exe_header_buffer->section_header[0])); + ARRAYELTS (exe_header_buffer->section_header)); assert (exe_header_buffer->file_header.f_opthdr > 0); ret = @@ -84,7 +89,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) { @@ -131,7 +140,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 @@ -148,7 +157,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", @@ -182,6 +191,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 + @@ -219,7 +241,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", @@ -263,21 +285,14 @@ unexec (const char *outfile, const char *infile) int ret; int ret2; - if (bss_sbrk_did_unexec) - { - /* can only dump once */ - printf ("You can only dump Emacs once on this platform.\n"); - return; - } - report_sheap_usage (1); 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 (;;) { @@ -293,13 +308,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); }