* m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Don't define HAVE_MAP_ANONYMOUS.
* m4/memchr.m4 (gl_FUNC_MEMCHR): Assume that mmap supports MAP_ANONYMOUS
or MAP_ANON.
* m4/strncat.m4 (gl_FUNC_STRNCAT): Likewise.
* lib/get-rusage-as.c (MAP_FILE): Remove macro.
(get_rusage_as_via_setrlimit): Assume that mmap supports MAP_ANONYMOUS
or MAP_ANON.
* modules/get-rusage-as (Depends-on): Remove 'open'.
* lib/pagealign_alloc.c (MAP_FILE): Remove macro.
(pagealign_alloc): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
* modules/pagealign_alloc (Depends-on): Remove 'open'.
* lib/vma-iter.c: Remove code for IRIX.
(vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
* lib/vma-iter.h: Remove code for IRIX.
* lib/stackvma.c: Remove code for IRIX.
(vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
* lib/stackvma.h: Remove code for IRIX.
* tests/mmap-anon-util.h: (zero_fd, map_flags, MAP_FILE): Remove macros.
(mmap_zeromap): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
* tests/zerosize-ptr.h (MAP_FILE): Remove macro.
(zerosize_ptr): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
* tests/jit/test-cache.c (main): Assume that mmap supports MAP_ANONYMOUS
or MAP_ANON.
* tests/test-sigsegv-catch-segv1.c (main): Assume that mmap supports
MAP_ANONYMOUS or MAP_ANON.
* tests/test-sigsegv-catch-segv2.c (main): Likewise.
* tests/test-sigsegv-catch-stackoverflow2.c (main): Likewise.
* tests/test-vma-prot.c: Test HAVE_MMAP instead of HAVE_MAP_ANONYMOUS.
2025-09-10 Bruno Haible <bruno@clisp.org>
+ Remove support for IRIX and Solaris <= 7 regarding old mmap.
+ * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Don't define HAVE_MAP_ANONYMOUS.
+ * m4/memchr.m4 (gl_FUNC_MEMCHR): Assume that mmap supports MAP_ANONYMOUS
+ or MAP_ANON.
+ * m4/strncat.m4 (gl_FUNC_STRNCAT): Likewise.
+ * lib/get-rusage-as.c (MAP_FILE): Remove macro.
+ (get_rusage_as_via_setrlimit): Assume that mmap supports MAP_ANONYMOUS
+ or MAP_ANON.
+ * modules/get-rusage-as (Depends-on): Remove 'open'.
+ * lib/pagealign_alloc.c (MAP_FILE): Remove macro.
+ (pagealign_alloc): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
+ * modules/pagealign_alloc (Depends-on): Remove 'open'.
+ * lib/vma-iter.c: Remove code for IRIX.
+ (vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
+ * lib/vma-iter.h: Remove code for IRIX.
+ * lib/stackvma.c: Remove code for IRIX.
+ (vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
+ * lib/stackvma.h: Remove code for IRIX.
+ * tests/mmap-anon-util.h: (zero_fd, map_flags, MAP_FILE): Remove macros.
+ (mmap_zeromap): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
+ * tests/zerosize-ptr.h (MAP_FILE): Remove macro.
+ (zerosize_ptr): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON.
+ * tests/jit/test-cache.c (main): Assume that mmap supports MAP_ANONYMOUS
+ or MAP_ANON.
+ * tests/test-sigsegv-catch-segv1.c (main): Assume that mmap supports
+ MAP_ANONYMOUS or MAP_ANON.
+ * tests/test-sigsegv-catch-segv2.c (main): Likewise.
+ * tests/test-sigsegv-catch-stackoverflow2.c (main): Likewise.
+ * tests/test-vma-prot.c: Test HAVE_MMAP instead of HAVE_MAP_ANONYMOUS.
+
signbit, *-ieee: Remove support for IRIX.
* m4/signbit.m4 (gl_SIGNBIT_TEST_PROGRAM): Remove code for IRIX.
is slightly larger higher than get_rusage_as_via_setrlimit(), by 4 KB in
32-bit mode and by 40 KB in 64-bit mode.
- IRIX:
- a) setrlimit with RLIMIT_AS works.
- b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP.
- Both methods agree,
-
Solaris:
a) setrlimit with RLIMIT_AS works.
b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP, and the
# include <fcntl.h>
# include <sys/types.h>
# include <sys/mman.h> /* mmap, munmap */
-/* Define MAP_FILE when it isn't otherwise. */
-# ifndef MAP_FILE
-# define MAP_FILE 0
-# endif
#endif
struct rlimit orig_limit;
-# if HAVE_MAP_ANONYMOUS
- const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
- const int fd = -1;
-# else /* !HAVE_MAP_ANONYMOUS */
- const int flags = MAP_FILE | MAP_PRIVATE;
- int fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0666);
- if (fd < 0)
- return 0;
-# endif
-
/* Record the original limit. */
if (getrlimit (RLIMIT_AS, &orig_limit) < 0)
{
/* Allocate a page of memory, to compare the current address space
size with try_limit.rlim_cur. */
void *new_page =
- mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0);
+ mmap (NULL, pagesize, PROT_READ | PROT_WRITE,
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (new_page != (void *)(-1))
{
/* Allocate a page of memory, to compare the current address space
size with try_limit.rlim_cur. */
void *new_page =
- mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0);
+ mmap (NULL, pagesize, PROT_READ | PROT_WRITE,
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (new_page != (void *)(-1))
{
abort ();
done2:
-# if !HAVE_MAP_ANONYMOUS
- close (fd);
-# endif
return result;
}
#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#if HAVE_MMAP
-/* Define MAP_FILE when it isn't otherwise. */
-# ifndef MAP_FILE
-# define MAP_FILE 0
-# endif
/* Define MAP_FAILED for old systems which neglect to. */
# ifndef MAP_FAILED
# define MAP_FAILED ((void *)-1)
based approaches, since the latter often waste an entire memory page
per call. */
#if HAVE_MMAP
-# ifdef HAVE_MAP_ANONYMOUS
- const int fd = -1;
- const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
-# else /* !HAVE_MAP_ANONYMOUS */
- static int fd = -1; /* Only open /dev/zero once in order to avoid limiting
- the amount of memory we may allocate based on the
- number of open file descriptors. */
- const int flags = MAP_FILE | MAP_PRIVATE;
- if (fd == -1)
- {
- fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0666);
- if (fd < 0)
- error (EXIT_FAILURE, errno, _("Failed to open /dev/zero for read"));
- }
-# endif /* HAVE_MAP_ANONYMOUS */
- ret = mmap (NULL, size, PROT_READ | PROT_WRITE, flags, fd, 0);
+ ret = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE,
+ -1, 0);
if (ret == MAP_FAILED)
return NULL;
new_memnode (ret, size);
|| defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ \
|| defined __NetBSD__ \
|| (defined __APPLE__ && defined __MACH__) \
- || defined _AIX || defined __sgi || defined __sun \
+ || defined _AIX || defined __sun \
|| defined __CYGWIN__ || defined __HAIKU__
/* This file contains the proximity test function for the simple cases, where
/* --------------------------- stackvma-procfs.c --------------------------- */
-#elif defined __sgi || defined __sun /* IRIX, Solaris */
+#elif defined __sun /* Solaris */
# include <errno.h> /* errno, EINTR */
# include <fcntl.h> /* open, O_RDONLY */
int fd;
int nmaps;
size_t memneed;
-# if HAVE_MAP_ANONYMOUS
-# define zero_fd -1
-# define map_flags MAP_ANONYMOUS
-# else /* !HAVE_MAP_ANONYMOUS */
- int zero_fd;
-# define map_flags 0
-# endif
void *auxmap;
uintptr_t auxmap_start;
uintptr_t auxmap_end;
and thus pre-allocate available memory.
So use mmap(), and ignore the resulting VMA. */
memneed = ((memneed - 1) / pagesize + 1) * pagesize;
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY, 0644);
- if (zero_fd < 0)
- goto fail2;
-# endif
auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE,
- map_flags | MAP_PRIVATE, zero_fd, 0);
-# if !HAVE_MAP_ANONYMOUS
- close (zero_fd);
-# endif
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (auxmap == (void *) -1)
goto fail2;
auxmap_start = (uintptr_t) auxmap;
int fd;
int nmaps;
size_t memneed;
-# if HAVE_MAP_ANONYMOUS
-# define zero_fd -1
-# define map_flags MAP_ANONYMOUS
-# else /* !HAVE_MAP_ANONYMOUS */
- int zero_fd;
-# define map_flags 0
-# endif
void *auxmap;
uintptr_t auxmap_start;
uintptr_t auxmap_end;
and thus pre-allocate available memory.
So use mmap(), and ignore the resulting VMA. */
memneed = ((memneed - 1) / pagesize + 1) * pagesize;
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY, 0644);
- if (zero_fd < 0)
- goto fail2;
-# endif
auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE,
- map_flags | MAP_PRIVATE, zero_fd, 0);
-# if !HAVE_MAP_ANONYMOUS
- close (zero_fd);
-# endif
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (auxmap == (void *) -1)
goto fail2;
auxmap_start = (uintptr_t) auxmap;
|| defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ \
|| defined __NetBSD__ || defined __OpenBSD__ \
|| (defined __APPLE__ && defined __MACH__) \
- || defined _AIX || defined __sgi || defined __sun \
+ || defined _AIX || defined __sun \
|| defined __CYGWIN__ || defined __HAIKU__
# define HAVE_STACKVMA 1
#endif
# include <sys/procfs.h> /* prmap_t */
#endif
-#if defined __sgi /* IRIX */
-# include <string.h> /* memcpy */
-# include <sys/types.h>
-# include <sys/mman.h> /* mmap, munmap */
-# include <sys/procfs.h> /* PIOC*, prmap_t */
-#endif
-
#if defined __sun /* Solaris */
# include <string.h> /* memcpy */
# include <sys/types.h>
close (fd);
return 0;
-#elif defined __sgi /* IRIX */
-
- size_t pagesize;
- char fnamebuf[6+10+1];
- char *fname;
- int fd;
- int nmaps;
- size_t memneed;
-# if HAVE_MAP_ANONYMOUS
-# define zero_fd -1
-# define map_flags MAP_ANONYMOUS
-# else
- int zero_fd;
-# define map_flags 0
-# endif
- void *auxmap;
- unsigned long auxmap_start;
- unsigned long auxmap_end;
- prmap_t* maps;
- prmap_t* mp;
-
- pagesize = getpagesize ();
-
- /* Construct fname = sprintf (fnamebuf+i, "/proc/%u", getpid ()). */
- fname = fnamebuf + sizeof (fnamebuf) - 1;
- *fname = '\0';
- {
- unsigned int value = getpid ();
- do
- *--fname = (value % 10) + '0';
- while ((value = value / 10) > 0);
- }
- fname -= 6;
- memcpy (fname, "/proc/", 6);
-
- fd = open (fname, O_RDONLY | O_CLOEXEC);
- if (fd < 0)
- return -1;
-
- if (ioctl (fd, PIOCNMAP, &nmaps) < 0)
- goto fail2;
-
- memneed = (nmaps + 10) * sizeof (prmap_t);
- /* Allocate memneed bytes of memory.
- We cannot use alloca here, because not much stack space is guaranteed.
- We also cannot use malloc here, because a malloc() call may call mmap()
- and thus pre-allocate available memory.
- So use mmap(), and ignore the resulting VMA. */
- memneed = ((memneed - 1) / pagesize + 1) * pagesize;
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644);
- if (zero_fd < 0)
- goto fail2;
-# endif
- auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE,
- map_flags | MAP_PRIVATE, zero_fd, 0);
-# if !HAVE_MAP_ANONYMOUS
- close (zero_fd);
-# endif
- if (auxmap == (void *) -1)
- goto fail2;
- auxmap_start = (unsigned long) auxmap;
- auxmap_end = auxmap_start + memneed;
- maps = (prmap_t *) auxmap;
-
- if (ioctl (fd, PIOCMAP, maps) < 0)
- goto fail1;
-
- for (mp = maps;;)
- {
- unsigned long start, end;
- unsigned int flags;
-
- start = (unsigned long) mp->pr_vaddr;
- end = start + mp->pr_size;
- if (start == 0 && end == 0)
- break;
- flags = 0;
- if (mp->pr_mflags & MA_READ)
- flags |= VMA_PROT_READ;
- if (mp->pr_mflags & MA_WRITE)
- flags |= VMA_PROT_WRITE;
- if (mp->pr_mflags & MA_EXEC)
- flags |= VMA_PROT_EXECUTE;
- mp++;
- if (start <= auxmap_start && auxmap_end - 1 <= end - 1)
- {
- /* Consider [start,end-1] \ [auxmap_start,auxmap_end-1]
- = [start,auxmap_start-1] u [auxmap_end,end-1]. */
- if (start < auxmap_start)
- if (callback (data, start, auxmap_start, flags))
- break;
- if (auxmap_end - 1 < end - 1)
- if (callback (data, auxmap_end, end, flags))
- break;
- }
- else
- {
- if (callback (data, start, end, flags))
- break;
- }
- }
- munmap (auxmap, memneed);
- close (fd);
- return 0;
-
- fail1:
- munmap (auxmap, memneed);
- fail2:
- close (fd);
- return -1;
-
#elif defined __sun /* Solaris */
/* Note: Solaris <sys/procfs.h> defines a different type prmap_t with
int fd;
int nmaps;
size_t memneed;
-# if HAVE_MAP_ANONYMOUS
-# define zero_fd -1
-# define map_flags MAP_ANONYMOUS
-# else /* Solaris <= 7 */
- int zero_fd;
-# define map_flags 0
-# endif
void *auxmap;
unsigned long auxmap_start;
unsigned long auxmap_end;
and thus pre-allocate available memory.
So use mmap(), and ignore the resulting VMA. */
memneed = ((memneed - 1) / pagesize + 1) * pagesize;
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644);
- if (zero_fd < 0)
- goto fail2;
-# endif
auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE,
- map_flags | MAP_PRIVATE, zero_fd, 0);
-# if !HAVE_MAP_ANONYMOUS
- close (zero_fd);
-# endif
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (auxmap == (void *) -1)
goto fail2;
auxmap_start = (unsigned long) auxmap;
int fd;
int nmaps;
size_t memneed;
-# if HAVE_MAP_ANONYMOUS
-# define zero_fd -1
-# define map_flags MAP_ANONYMOUS
-# else /* Solaris <= 7 */
- int zero_fd;
-# define map_flags 0
-# endif
void *auxmap;
unsigned long auxmap_start;
unsigned long auxmap_end;
and thus pre-allocate available memory.
So use mmap(), and ignore the resulting VMA. */
memneed = ((memneed - 1) / pagesize + 1) * pagesize;
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644);
- if (zero_fd < 0)
- goto fail2;
-# endif
auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE,
- map_flags | MAP_PRIVATE, zero_fd, 0);
-# if !HAVE_MAP_ANONYMOUS
- close (zero_fd);
-# endif
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (auxmap == (void *) -1)
goto fail2;
auxmap_start = (unsigned long) auxmap;
this platform.
Note that even when this macro is defined, vma_iterate() may still fail to
find any virtual memory area, for example if /proc is not mounted. */
-#if defined __linux__ || defined __ANDROID__ || defined __gnu_hurd__ || defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__ || defined _AIX || defined __sgi || defined __sun || HAVE_PSTAT_GETPROCVM || (defined __APPLE__ && defined __MACH__) || defined _WIN32 || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || defined __minix || HAVE_MQUERY
+#if defined __linux__ || defined __ANDROID__ || defined __gnu_hurd__ || defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__ || defined _AIX || defined __sun || HAVE_PSTAT_GETPROCVM || (defined __APPLE__ && defined __MACH__) || defined _WIN32 || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || defined __minix || HAVE_MQUERY
# define VMA_ITERATE_SUPPORTED 1
#endif
# memchr.m4
-# serial 20
+# serial 21
dnl Copyright (C) 2002-2004, 2009-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
# include <unistd.h>
# include <sys/types.h>
# include <sys/mman.h>
-# ifndef MAP_FILE
-# define MAP_FILE 0
-# endif
#endif
]], [[
int result = 0;
char *fence = NULL;
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
-# if HAVE_MAP_ANONYMOUS
- const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
- const int fd = -1;
-# else /* !HAVE_MAP_ANONYMOUS */
- const int flags = MAP_FILE | MAP_PRIVATE;
- int fd = open ("/dev/zero", O_RDONLY, 0666);
- if (fd >= 0)
-# endif
- {
- long int pagesize = sysconf (_SC_PAGESIZE);
- char *two_pages =
- (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
- flags, fd, 0);
- if (two_pages != (char *)(-1)
- && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
- fence = two_pages + pagesize;
- }
+ {
+ long int pagesize = sysconf (_SC_PAGESIZE);
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ fence = two_pages + pagesize;
+ }
#endif
if (fence)
{
# mmap-anon.m4
-# serial 13
+# serial 14
dnl Copyright (C) 2005, 2007, 2009-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
# MAP_ANON exist and have the same value.
# - On HP-UX, only MAP_ANONYMOUS exists.
# - On Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, only MAP_ANON exists.
-# - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be
-# used.
AC_DEFUN_ONCE([gl_FUNC_MMAP_ANON],
[
gl_have_mmap_anonymous=yes])
fi
AC_MSG_RESULT([$gl_have_mmap_anonymous])
- if test $gl_have_mmap_anonymous = yes; then
- AC_DEFINE([HAVE_MAP_ANONYMOUS], [1],
- [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
- config.h and <sys/mman.h>.])
- fi
fi
])
# strncat.m4
-# serial 9
+# serial 10
dnl Copyright (C) 2002-2004, 2009-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
# include <unistd.h>
# include <sys/types.h>
# include <sys/mman.h>
-# ifndef MAP_FILE
-# define MAP_FILE 0
-# endif
#endif
]GL_MDA_DEFINES],
[[
char *fence = NULL;
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
-# if HAVE_MAP_ANONYMOUS
- const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
- const int fd = -1;
-# else /* !HAVE_MAP_ANONYMOUS */
- const int flags = MAP_FILE | MAP_PRIVATE;
- int fd = open ("/dev/zero", O_RDONLY, 0666);
- if (fd >= 0)
-# endif
- {
- long int pagesize = sysconf (_SC_PAGESIZE);
- char *two_pages =
- (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
- flags, fd, 0);
- if (two_pages != (char *)(-1)
- && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
- fence = two_pages + pagesize;
- }
+ {
+ long int pagesize = sysconf (_SC_PAGESIZE);
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ fence = two_pages + pagesize;
+ }
#endif
if (fence)
{
unistd-h
extensions
getpagesize
-open
vma-iter
configure.ac:
getpagesize
gettext-h
gnulib-i18n
-open
stdlib-h
xalloc
unistd-h
return 1;
start_rw = start;
#else
-# ifdef HAVE_MAP_ANONYMOUS
- int flags = MAP_ANONYMOUS | MAP_PRIVATE;
- int fd = -1;
-# else
- int flags = MAP_FILE | MAP_PRIVATE;
- int fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0666);
- if (fd < 0)
- return 1;
-# endif
start = mmap (NULL, mapping_size, PROT_READ | PROT_WRITE | PROT_EXEC,
- flags, fd, 0);
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (start != (char *) (-1))
{
/* A platform that allows a mmap'ed memory region to be simultaneously
if (register_temporary_file (filename) < 0)
return 2;
# endif
- fd = open (filename, O_CREAT | O_RDWR | O_TRUNC, 0700);
+ int fd = open (filename, O_CREAT | O_RDWR | O_TRUNC, 0700);
if (fd < 0)
return 3;
# ifndef KEEP_TEMP_FILE_VISIBLE
# endif
# define PROT_READ_WRITE (PROT_READ|PROT_WRITE)
-# if HAVE_MAP_ANONYMOUS
-# define zero_fd -1
-# define map_flags MAP_ANONYMOUS | MAP_PRIVATE
-# else
-# ifndef MAP_FILE
-# define MAP_FILE 0
-# endif
-static int zero_fd;
-# define map_flags MAP_FILE | MAP_PRIVATE
-# endif
-
static void *
mmap_zeromap (void *map_addr_hint, size_t map_len)
{
# ifdef __hpux
/* HP-UX 10 mmap() often fails when given a hint. So give the OS complete
freedom about the address range. */
- return (void *) mmap ((void *) 0, map_len, PROT_READ_WRITE, map_flags, zero_fd, 0);
+ return (void *) mmap ((void *) 0, map_len, PROT_READ_WRITE,
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
# else
- return (void *) mmap (map_addr_hint, map_len, PROT_READ_WRITE, map_flags, zero_fd, 0);
+ return (void *) mmap (map_addr_hint, map_len, PROT_READ_WRITE,
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
# endif
}
int prot_unwritable;
void *p;
- /* Preparations. */
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY, 0644);
-# endif
-
# if defined __linux__ && defined __sparc__
/* On Linux 2.6.26/SPARC64, PROT_READ has the same effect as
PROT_READ | PROT_WRITE. */
void *p;
sigset_t emptyset;
- /* Preparations. */
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY, 0644);
-# endif
-
# if defined __linux__ && defined __sparc__
/* On Linux 2.6.26/SPARC64, PROT_READ has the same effect as
PROT_READ | PROT_WRITE. */
< 0)
exit (2);
- /* Preparations. */
-# if !HAVE_MAP_ANONYMOUS
- zero_fd = open ("/dev/zero", O_RDONLY, 0644);
-# endif
-
# if defined __linux__ && defined __sparc__
/* On Linux 2.6.26/SPARC64, PROT_READ has the same effect as
PROT_READ | PROT_WRITE. */
#include <stdlib.h>
-#if HAVE_MAP_ANONYMOUS
+#if HAVE_MMAP
# include <sys/mman.h>
# include <unistd.h>
#endif
ASSERT (((VMA_PROT_READ | VMA_PROT_WRITE) & ~prot) == 0);
}
-#if HAVE_MAP_ANONYMOUS
+#if HAVE_MMAP
/* Test on memory allocated through mmap(). */
{
char *mem = mmap (NULL, 1024*1024, PROT_READ | PROT_WRITE,
# include <unistd.h>
# include <sys/types.h>
# include <sys/mman.h>
-/* Define MAP_FILE when it isn't otherwise. */
-# ifndef MAP_FILE
-# define MAP_FILE 0
-# endif
#endif
/* Return a pointer to a zero-size object in memory (that is, actually, a
/* Use mmap and mprotect when they exist. Don't test HAVE_MMAP, because it is
not defined on HP-UX 11 (since it does not support MAP_FIXED). */
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT && !defined __KLIBC__
-# if HAVE_MAP_ANONYMOUS
- const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
- const int fd = -1;
-# else /* !HAVE_MAP_ANONYMOUS */
- const int flags = MAP_FILE | MAP_PRIVATE;
- int fd = open ("/dev/zero", O_RDONLY, 0666);
- if (fd >= 0)
-# endif
- {
- size_t pagesize = sysconf (_SC_PAGESIZE);
- char *two_pages =
- (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
- flags, fd, 0);
- if (two_pages != (char *)(-1)
- && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
- return two_pages + pagesize;
- }
+ size_t pagesize = sysconf (_SC_PAGESIZE);
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ return two_pages + pagesize;
#endif
return NULL;
}