-/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000
+/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000, 2001
Free Software Foundation, Inc.
This file is part of GNU Emacs.
int old_data_index, new_data2_index;
int old_mdebug_index;
struct stat stat_buf;
+ int old_file_size;
/* Open the old file, allocate a buffer of the right size, and read
* in the file contents. */
if (fstat (old_file, &stat_buf) == -1)
fatal ("Can't fstat (%s): errno %d\n", old_name, errno);
- old_base = malloc (stat_buf.st_size);
-
- if (old_base == 0)
+ /* We cannot use malloc here because that may use sbrk. If it does,
+ we'd dump our temporary buffers with Emacs, and we'd have to be
+ extra careful to use the correct value of sbrk(0) after
+ allocating all buffers in the code below, which we aren't. */
+ old_file_size = stat_buf.st_size;
+ old_base = mmap (NULL, old_file_size, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, -1, 0);
+ if (old_base == (caddr_t) -1)
fatal ("Can't allocate buffer for %s\n", old_name);
-#ifdef DEBUG
- fprintf (stderr, "%s: malloc(%d) -> %x\n", old_name, stat_buf.st_size,
- old_base);
-#endif
-
if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size)
fatal ("Didn't read all of %s: errno %d\n", old_name, errno);
if (ftruncate (new_file, new_file_size))
fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
- new_base = malloc (new_file_size);
-
- if (new_base == 0)
+ new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, -1, 0);
+ if (new_base == (caddr_t) -1)
fatal ("Can't allocate buffer for %s\n", old_name);
-#ifdef DEBUG
- fprintf (stderr, "%s: malloc(%d) -> %x\n", new_name, new_file_size
- new_base);
-#endif
-
new_file_h = (ElfW(Ehdr) *) new_base;
new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
new_section_h = (ElfW(Shdr) *)
if (close (new_file))
fatal ("Can't close (%s): errno %d\n", new_name, errno);
- free (new_base);
+ munmap (new_base, new_file_size);
/* Close old_file, and free the corresponding buffer */
if (close (old_file))
fatal ("Can't close (%s): errno %d\n", old_name, errno);
- free (old_base);
+ munmap (old_base, old_file_size);
/* Make the new file executable */