aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-04-07 11:29:41 -0700
committerIan Lance Taylor <iant@golang.org>2020-04-07 11:30:10 -0700
commit50c7853216e8511971c55b51d7fe29173db4749b (patch)
tree7e200c42bded18d4077ae846817e390ae31735e4 /libgcc
parent3d947f1f27188e3a61ba7f42399b1c348469fe13 (diff)
downloadgcc-50c7853216e8511971c55b51d7fe29173db4749b.zip
gcc-50c7853216e8511971c55b51d7fe29173db4749b.tar.gz
gcc-50c7853216e8511971c55b51d7fe29173db4749b.tar.bz2
libgcc: use syscall rather than __mmap/__munmap
PR libgcc/94513 * generic-morestack.c: Give up trying to use __mmap/__munmap, use syscall instead.
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog6
-rw-r--r--libgcc/generic-morestack.c55
2 files changed, 53 insertions, 8 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index ec225d1..6340cfb 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-04-07 Ian Lance Taylor <iant@golang.org>
+
+ PR libgcc/94513
+ * generic-morestack.c: Give up trying to use __mmap/__munmap, use
+ syscall instead.
+
2020-04-04 Ian Lance Taylor <iant@golang.org>
* generic-morestack.c: Only use __mmap on glibc >= 2.26.
diff --git a/libgcc/generic-morestack.c b/libgcc/generic-morestack.c
index fa2062e..35764a8 100644
--- a/libgcc/generic-morestack.c
+++ b/libgcc/generic-morestack.c
@@ -56,17 +56,56 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
/* Some systems use LD_PRELOAD or similar tricks to add hooks to
mmap/munmap. That breaks this code, because when we call mmap
there is enough stack space for the system call but there is not,
- in general, enough stack space to run a hook. At least when using
- glibc on GNU/Linux we can avoid the problem by calling __mmap and
- __munmap. */
+ in general, enough stack space to run a hook. Try to avoid the
+ problem by calling syscall directly. We only do this on GNU/Linux
+ for now, but it should be easy to add support for more systems with
+ testing. */
-#if defined(__gnu_linux__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 26))
+#if defined(__gnu_linux__)
-extern void *__mmap (void *, size_t, int, int, int, off_t);
-extern int __munmap (void *, size_t);
+#include <sys/syscall.h>
-#define mmap __mmap
-#define munmap __munmap
+#if defined(SYS_mmap) || defined(SYS_mmap2)
+
+#ifdef SYS_mmap2
+#define MORESTACK_MMAP SYS_mmap2
+#define MORESTACK_ADJUST_OFFSET(x) ((x) / 4096ULL)
+#else
+#define MORESTACK_MMAP SYS_mmap
+#define MORESTACK_ADJUST_OFFSET(x) (x)
+#endif
+
+static void *
+morestack_mmap (void *addr, size_t length, int prot, int flags, int fd,
+ off_t offset)
+{
+ offset = MORESTACK_ADJUST_OFFSET (offset);
+
+#ifdef __s390__
+ long args[6] = { (long) addr, (long) length, (long) prot, (long) flags,
+ (long) fd, (long) offset };
+ return (void *) syscall (MORESTACK_MMAP, args);
+#else
+ return (void *) syscall (MORESTACK_MMAP, addr, length, prot, flags, fd,
+ offset);
+#endif
+}
+
+#define mmap morestack_mmap
+
+#endif /* defined(SYS_MMAP) || defined(SYS_mmap2) */
+
+#if defined(SYS_munmap)
+
+static int
+morestack_munmap (void * addr, size_t length)
+{
+ return (int) syscall (SYS_munmap, addr, length);
+}
+
+#define munmap morestack_munmap
+
+#endif /* defined(SYS_munmap) */
#endif /* defined(__gnu_linux__) */