aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-04-03 14:57:18 -0700
committerIan Lance Taylor <iant@golang.org>2020-04-03 14:58:27 -0700
commit710d54ed4e343a08d2fa0abc6b63c53dec0d9bcb (patch)
treeb52b7f2d554303b4f51ffbdb01c6d5e994f98334
parentbbcdf9bb3fd04adc59f41e4e1ff6293c84cbecc4 (diff)
downloadgcc-710d54ed4e343a08d2fa0abc6b63c53dec0d9bcb.zip
gcc-710d54ed4e343a08d2fa0abc6b63c53dec0d9bcb.tar.gz
gcc-710d54ed4e343a08d2fa0abc6b63c53dec0d9bcb.tar.bz2
libgcc: avoid mmap/munmap hooks in split-stack code on GNU/Linux
* generic-morestack.c: On GNU/Linux use __mmap/__munmap rather than mmap/munmap, to avoid hooks.
-rw-r--r--libgcc/ChangeLog5
-rw-r--r--libgcc/generic-morestack.c17
2 files changed, 22 insertions, 0 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 7548e34..66e57ec 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,8 @@
+2020-04-03 Ian Lance Taylor <iant@golang.org>
+
+ * generic-morestack.c: On GNU/Linux use __mmap/__munmap rather
+ than mmap/munmap, to avoid hooks.
+
2020-04-03 Jim Johnston <jjohnst@us.ibm.com>
* config/s390/tpf-unwind.h (MIN_PATRANGE, MAX_PATRANGE)
diff --git a/libgcc/generic-morestack.c b/libgcc/generic-morestack.c
index c26dba1..bb9f67a 100644
--- a/libgcc/generic-morestack.c
+++ b/libgcc/generic-morestack.c
@@ -53,6 +53,23 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "generic-morestack.h"
+/* 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. */
+
+#ifdef __gnu_linux__
+
+extern void *__mmap (void *, size_t, int, int, int, off_t);
+extern int __munmap (void *, size_t);
+
+#define mmap __mmap
+#define munmap __munmap
+
+#endif /* defined(__gnu_linux__) */
+
typedef unsigned uintptr_type __attribute__ ((mode (pointer)));
/* This file contains subroutines that are used by code compiled with