The split-stack code invokes mmap and munmap with a limited amount of stack space. That is fine when the functions just make a system call, but it's not fine when programs use LD_PRELOAD or linker tricks to add hooks to mmap/munmap. Those hooks may use too much stack space, leading to an obscure program crash.
Avoid that at least on GNU/Linux by calling __mmap/__munmap instead. Bootstrapped and ran Go and split-stack tests on x86_64-pc-linux-gnu. Committed to mainline. Ian 2020-04-03 Ian Lance Taylor <i...@golang.org> * generic-morestack.c: On GNU/Linux use __mmap/__munmap rather than mmap/munmap, to avoid hooks.
diff --git a/libgcc/generic-morestack.c b/libgcc/generic-morestack.c index c26dba1ae4a..bb9f67a7366 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