summaryrefslogtreecommitdiff
path: root/src/unexw32.c
diff options
context:
space:
mode:
authorFabrice Popineau <fabrice.popineau@gmail.com>2014-05-27 20:31:17 +0300
committerEli Zaretskii <eliz@gnu.org>2014-05-27 20:31:17 +0300
commit587fd086a045f715932f886ecf31015932464ce6 (patch)
treed8c647af107ef94318fd920a05da09af654ef1c9 /src/unexw32.c
parent0da7d35c6754b44d1ef4383e4a8ba9b98afc3a4c (diff)
downloademacs-587fd086a045f715932f886ecf31015932464ce6.tar.gz
Use mmap(2) emulation for buffer text on MS-Windows.
src/Makefile.in (C_HEAP_SWITCH): Get the predefined heap size from configure. (ADDSECTION, MINGW_TEMACS_POST_LINK): Remove, no longer used. src/lisp.h (NONPOINTER_BITS): Modify the condition to define to zero for MinGW, since it no longer uses gmalloc. src/buffer.c: Do not define mmap allocations functions for Windows. Remove mmap_find which is unused. Remove mmap_set_vars which does nothing useful. [WINDOWSNT]: Include w32heap.h. (init_buffer): Always allocate new memory for buffers. src/emacs.c: Remove mmap_set_vars calls. src/image.c (free_image): Undef free for Windows because it is redirected to our private version. src/unexw32.c (COPY_PROC_CHUNK): Use %p format for 64bits compatibility. (copy_executable_and_dump_data): Remove dumping the heap section. (unexec): Restore using_dynamic_heap after dumping. src/w32heap.c (dumped_data_commit, malloc_after_dump) (malloc_before_dump, realloc_after_dump, realloc_before_dump) (free_after_dump, free_before_dump, mmap_alloc, mmap_realloc) (mmap_free): New functions. src/w32heap.h: Declare dumped_data and mmap_* function prototypes. nt/inc/ms-w32.h: Switch to the system heap allocation scheme instead of GNU malloc and ralloc. nt/inc/sys/mman.h: New file. nt/INSTALL: Update for the new build requirements. etc/NEWS: Mention build changes on MS-Windows. configure.ac (C_HEAP_SWITCH) define for different values of dumped heap size depending on 32/64bits arch on Windows. Don't check for pthreads.h on MinGW32/64, it gets in the way. Use mmap(2) for buffers and system malloc for MinGW32/64.
Diffstat (limited to 'src/unexw32.c')
-rw-r--r--src/unexw32.c48
1 files changed, 9 insertions, 39 deletions
diff --git a/src/unexw32.c b/src/unexw32.c
index f70cdd79478..60b926b2499 100644
--- a/src/unexw32.c
+++ b/src/unexw32.c
@@ -83,8 +83,6 @@ PCHAR bss_start_static = 0;
DWORD_PTR bss_size_static = 0;
DWORD_PTR extra_bss_size_static = 0;
-PIMAGE_SECTION_HEADER heap_section;
-
/* MinGW64 doesn't add a leading underscore to external symbols,
whereas configure.ac sets up LD_SWITCH_SYSTEM_TEMACS to force the
entry point at __start, with two underscores. */
@@ -475,8 +473,6 @@ get_section_info (file_data *p_infile)
bss_section_static = 0;
extra_bss_size_static = 0;
}
-
- heap_section = rva_to_section (PTR_TO_RVA (get_heap_start ()), nt_header);
}
@@ -518,9 +514,11 @@ copy_executable_and_dump_data (file_data *p_infile,
if (verbose) \
{ \
printf ("%s\n", (message)); \
- printf ("\t0x%08x Address in process.\n", s); \
- printf ("\t0x%08x Offset in output file.\n", dst - p_outfile->file_base); \
- printf ("\t0x%08x Size in bytes.\n", count); \
+ printf ("\t0x%p Address in process.\n", s); \
+ printf ("\t0x%p Base output file.\n", p_outfile->file_base); \
+ printf ("\t0x%p Offset in output file.\n", dst - p_outfile->file_base); \
+ printf ("\t0x%p Address in output file.\n", dst); \
+ printf ("\t0x%p Size in bytes.\n", count); \
} \
memcpy (dst, s, count); \
dst += count; \
@@ -629,34 +627,6 @@ copy_executable_and_dump_data (file_data *p_infile,
dst_section->Characteristics &= ~IMAGE_SCN_CNT_UNINITIALIZED_DATA;
dst_section->Characteristics |= IMAGE_SCN_CNT_INITIALIZED_DATA;
}
- if (section == heap_section)
- {
- DWORD_PTR heap_start = (DWORD_PTR) get_heap_start ();
- DWORD_PTR heap_size = get_committed_heap_size ();
-
- /* Dump the used portion of the predump heap, adjusting the
- section's size to the appropriate size. */
- dst = dst_save
- + RVA_TO_SECTION_OFFSET (PTR_TO_RVA (heap_start), dst_section);
- COPY_PROC_CHUNK ("Dumping heap...", heap_start, heap_size,
- be_verbose);
- ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
- dst_section->PointerToRawData = PTR_TO_OFFSET (dst_save, p_outfile);
- /* Determine new size of raw data area. */
- dst = max (dst, dst_save + dst_section->SizeOfRawData);
- dst_section->SizeOfRawData = dst - dst_save;
- /* Reduce the size of the heap section to fit (must be last
- section). */
- dst_nt_header->OptionalHeader.SizeOfImage -=
- dst_section->Misc.VirtualSize
- - ROUND_UP (dst_section->SizeOfRawData,
- dst_nt_header->OptionalHeader.SectionAlignment);
- dst_section->Misc.VirtualSize =
- ROUND_UP (dst_section->SizeOfRawData,
- dst_nt_header->OptionalHeader.SectionAlignment);
- dst_section->Characteristics &= ~IMAGE_SCN_CNT_UNINITIALIZED_DATA;
- dst_section->Characteristics |= IMAGE_SCN_CNT_INITIALIZED_DATA;
- }
/* Align the section's raw data area. */
ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
@@ -767,9 +737,6 @@ unexec (const char *new_name, const char *old_name)
printf ("Dumping from %s\n", in_filename);
printf (" to %s\n", out_filename);
- /* We need to round off our heap to NT's page size. */
- round_heap (get_page_size ());
-
/* Open the undumped executable file. */
if (!open_input_file (&in_file, in_filename))
{
@@ -784,7 +751,6 @@ unexec (const char *new_name, const char *old_name)
/* The size of the dumped executable is the size of the original
executable plus the size of the heap and the size of the .bss section. */
size = in_file.size +
- get_committed_heap_size () +
extra_bss_size +
extra_bss_size_static;
if (!open_output_file (&out_file, out_filename, size))
@@ -799,6 +765,10 @@ unexec (const char *new_name, const char *old_name)
copy_executable_and_dump_data (&in_file, &out_file);
+ /* Unset it because it is plain wrong to keep it after dumping.
+ Malloc can still occur! */
+ using_dynamic_heap = FALSE;
+
/* Patch up header fields; profiler is picky about this. */
{
PIMAGE_DOS_HEADER dos_header;