libgcc: use syscall rather than __mmap/__munmap
PR libgcc/94513 * generic-morestack.c: Give up trying to use __mmap/__munmap, use syscall instead.
This commit is contained in:
parent
3d947f1f27
commit
50c7853216
2 changed files with 53 additions and 8 deletions
|
@ -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>
|
2020-04-04 Ian Lance Taylor <iant@golang.org>
|
||||||
|
|
||||||
* generic-morestack.c: Only use __mmap on glibc >= 2.26.
|
* generic-morestack.c: Only use __mmap on glibc >= 2.26.
|
||||||
|
|
|
@ -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
|
/* Some systems use LD_PRELOAD or similar tricks to add hooks to
|
||||||
mmap/munmap. That breaks this code, because when we call mmap
|
mmap/munmap. That breaks this code, because when we call mmap
|
||||||
there is enough stack space for the system call but there is not,
|
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
|
in general, enough stack space to run a hook. Try to avoid the
|
||||||
glibc on GNU/Linux we can avoid the problem by calling __mmap and
|
problem by calling syscall directly. We only do this on GNU/Linux
|
||||||
__munmap. */
|
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);
|
#include <sys/syscall.h>
|
||||||
extern int __munmap (void *, size_t);
|
|
||||||
|
|
||||||
#define mmap __mmap
|
#if defined(SYS_mmap) || defined(SYS_mmap2)
|
||||||
#define munmap __munmap
|
|
||||||
|
#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__) */
|
#endif /* defined(__gnu_linux__) */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue