mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-24 13:32:41 -08:00
[!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS
if defined, 0 otherwise. (MAP_FAILED): Define if not defined and use it to test mmap failure. (unexec) [!MAP_ANON]: Use /dev/zero as file to map.
This commit is contained in:
parent
ed931f3ea9
commit
c7ae63a6ff
2 changed files with 39 additions and 4 deletions
|
|
@ -1,3 +1,10 @@
|
|||
2002-01-14 Andreas Schwab <schwab@suse.de>
|
||||
|
||||
* unexelf.c [!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS
|
||||
if defined, 0 otherwise.
|
||||
(MAP_FAILED): Define if not defined and use it to test mmap failure.
|
||||
(unexec) [!MAP_ANON]: Use /dev/zero as file to map.
|
||||
|
||||
2002-01-14 Pavel Jan,Bm(Bk <Pavel@Janik.cz>
|
||||
|
||||
* sound.c (Fplay_sound): Initialize header_size also for :data
|
||||
|
|
|
|||
|
|
@ -448,6 +448,18 @@ extern void fatal (char *, ...);
|
|||
#include <syms.h> /* for HDRR declaration */
|
||||
#endif /* __sgi */
|
||||
|
||||
#ifndef MAP_ANON
|
||||
#ifdef MAP_ANONYMOUS
|
||||
#define MAP_ANON MAP_ANONYMOUS
|
||||
#else
|
||||
#define MAP_ANON 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED ((void *) -1)
|
||||
#endif
|
||||
|
||||
#if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)
|
||||
/* Declare COFF debugging symbol table. This used to be in
|
||||
/usr/include/sym.h, but this file is no longer included in Red Hat
|
||||
|
|
@ -663,6 +675,12 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
|
|||
/* Pointers to the base of the image of the two files. */
|
||||
caddr_t old_base, new_base;
|
||||
|
||||
#if MAP_ANON == 0
|
||||
int mmap_fd;
|
||||
#else
|
||||
# define mmap_fd -1
|
||||
#endif
|
||||
|
||||
/* Pointers to the file, program and section headers for the old and new
|
||||
* files.
|
||||
*/
|
||||
|
|
@ -696,14 +714,20 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
|
|||
if (fstat (old_file, &stat_buf) == -1)
|
||||
fatal ("Can't fstat (%s): errno %d\n", old_name, errno);
|
||||
|
||||
#if MAP_ANON == 0
|
||||
mmap_fd = open ("/dev/zero", O_RDONLY);
|
||||
if (mmap_fd < 0)
|
||||
fatal ("Can't open /dev/zero for reading: errno %d\n", errno);
|
||||
#endif
|
||||
|
||||
/* 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)
|
||||
MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
|
||||
if (old_base == MAP_FAILED)
|
||||
fatal ("Can't allocate buffer for %s\n", old_name);
|
||||
|
||||
if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size)
|
||||
|
|
@ -793,8 +817,8 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
|
|||
fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
|
||||
|
||||
new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE,
|
||||
MAP_ANON | MAP_PRIVATE, -1, 0);
|
||||
if (new_base == (caddr_t) -1)
|
||||
MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
|
||||
if (new_base == MAP_FAILED)
|
||||
fatal ("Can't allocate buffer for %s\n", old_name);
|
||||
|
||||
new_file_h = (ElfW(Ehdr) *) new_base;
|
||||
|
|
@ -1227,6 +1251,10 @@ unexec (new_name, old_name, data_start, bss_start, entry_address)
|
|||
|
||||
/* Close old_file, and free the corresponding buffer */
|
||||
|
||||
#if MAP_ANON == 0
|
||||
close (mmap_fd);
|
||||
#endif
|
||||
|
||||
if (close (old_file))
|
||||
fatal ("Can't close (%s): errno %d\n", old_name, errno);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue