@@ -14,6 +14,10 @@ Major new features:
constant on Linux. MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ)
and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).
+* The <sys/cstack.h> header file, the type cstack_t, and the functions
+ cstack_allocate, stack_free, stack_get have been added. It provides
+ the facilities for stack allocation.
+
* The dynamic linker implements the --list-diagnostics option, printing
a dump of information related to IFUNC resolver operation and
glibc-hwcaps subdirectory selection.
new file mode 100644
@@ -0,0 +1,39 @@
+/* Allocating call stacks. Wrapper header.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <misc/sys/cstack.h>
+
+#ifndef _ISOMAC
+struct __cstack
+{
+ /* This describes the region of the entire stack, including guard
+ areas. */
+ char *entire_region_start;
+ size_t entire_region_size;
+
+ /* Returned by cstack_get. */
+ stack_t stack;
+};
+
+extern __typeof (cstack_allocate) __cstack_allocate;
+libc_hidden_proto (__cstack_allocate)
+extern __typeof (cstack_free) __cstack_free;
+libc_hidden_proto (__cstack_free)
+extern __typeof (cstack_get) __cstack_get;
+libc_hidden_proto (__cstack_get)
+#endif
@@ -19,6 +19,7 @@ and allocation of real memory.
* Resizing the Data Segment:: @code{brk}, @code{sbrk}
* Memory Protection:: Controlling access to memory regions.
* Locking Pages:: Preventing page faults
+* Allocating Stacks:: Interfaces for allocating stacks.
@end menu
Memory mapped I/O is not discussed in this chapter. @xref{Memory-mapped I/O}.
@@ -3771,8 +3772,106 @@ calls can fail, so there are no specific @code{errno} values.
@end deftypefun
+@node Allocating Stacks
+@section Allocating Stacks
+
+With the @code{cstack_} family of functions, @theglibc{} provides
+functions for allocating @dfn{call stacks} or @dfn{C stacks}. Such
+stacks can be used to implement cooperative (non-preemptive)
+multi-threading or coroutines. They are also useful as alternate
+signal stacks. @xref{Signal Stack}
+
+These stacks do not come with their own thread control block and
+therefore need to be scheduled on an existing thread. On most
+targets, resuming a pending computation with its own stack on a
+different thread than the one it was suspended on is undefined because
+active stack frames are typically tied to one particlar thread control
+block.
+
+By default, allocated stacks are bracketed by guard regions.
+Applications that would otherwise run into the map limit can
+optionally disable these guard pages. For targets which fully support
+the GCC @option{-fstack-clash-protection} option, the guard region at
+the top of the stack is sized so that it can reliable detect stack
+overflow (exhaustion).
+
+Allocated stacks are not explicitly allocated with executable memory
+even if the current process image uses an executable stack. The
+stacks can still be executable for other reasons, e.g., lack of
+hardware support for non-executable stacks.
+
+@deftp {Data Type} cstack_t
+Values of this type are handles for allocated stacks. Handles become
+invalid when freed by the @code{cstack_free} function, and further use
+of them is invalid.
+
+The value @code{NULL} is not a valid stack handle and is used to
+indicate errors.
+@end deftp
+
+@deftypefun cstack_t cstack_allocate (size_t @var{size}, uint64_t @var{flags})
+@standards{GNU, sys/cstack.h}
+@safety{@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}}
+This function allocates a stack memory area and returns its handle.
+The @var{size} argument indicates the number of bytes on the stack
+that are available for use by the application. @Theglibc{} ensures
+that in addition to the requested space, there is enough memory
+available to deliver one signal to code running on this stack, plus
+some extra reservation for the signal handler itself.
+
+If the specified stack size is zero, the function picks a reasonable
+stack size that provides enough space for delivering one (non-nested)
+signal and invoking most functions provided by @theglibc{}.
+
+The @var{flags} argument is the bitwise-or of a set of flag constants.
+The following flags are defined
+
+@vtable @code
+@item CSTACK_ALLOCATE_NOBOTTOMGUARD
+@standards{GNU, sys/cstack.h}
+This flags requests that @code{cstack_allocate} does not allocate a
+guard region at the bottom of the stack (below the first activation
+frame). This guard region can sometimes catch stack-based buffer
+overflows and turn them into a segmentation fault.
+
+@item CSTACK_ALLOCATE_NOTOPGUARD
+This flags requests that no guard region is allocated at the top end
+of the stack. This guard region can be used to detect stack overflow
+(exahustion) and generate a segmentation fault in such sitations.
+@end vtable
+
+If allocating the stack fails, @code{cstack_allocate} returns
+@code{NULL} to indicate an error. The following errors are specific
+to this function:
+@table @code
+@item ENOMEM
+Insufficient memory is available to allocate the stack, or @var{size}
+is too large.
+@item EINVAL
+The @var{flags} argument contains unsupported flags.
+@end table
+@end deftypefun
+
+@deftypefun void cstack_free (cstack_t @var{stack})
+@standards{GNU, sys/cstack.h}
+@safety{@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}}
+This functions deallocations the stack handle @var{stack} and
+deallocates the associated memory.
+@end deftypefun
+
+@deftypefun void cstack_get (cstack_t @var{stack}, stack_t *@var{altstack})
+@standards{GNU, sys/cstack.h}
+@safety{@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}}
+This function obtains the usable stack region of @var{stack}
+(excluding any guard regions) and writes it to @var{altstack}. The
+resulting structure is suitable for use with the @code{sigaltstack}
+function.
+
+The @code{ss_flags} member of the @code{stack_t} result is currently
+set to zero.
+@end deftypefun
@ignore
@c This was never actually implemented. -zw
@@ -3124,6 +3124,9 @@ BSD. The @code{sigaltstack} interface has the advantage that it does
not require your program to know which direction the stack grows, which
depends on the specific machine and operating system.
+Memory for signal stacks can be allocated using @code{cstack_allocate}.
+@xref{Allocating Stacks}
+
@deftp {Data Type} stack_t
@standards{XPG, signal.h}
This structure describes a signal stack. It contains the following members:
@@ -38,7 +38,7 @@ headers := sys/uio.h bits/uio-ext.h bits/uio_lim.h \
bits/select2.h bits/hwcap.h sys/auxv.h \
sys/sysmacros.h bits/sysmacros.h bits/types/struct_iovec.h \
bits/err-ldbl.h bits/error-ldbl.h \
- sys/single_threaded.h
+ sys/single_threaded.h sys/cstack.h
routines := brk sbrk sstk ioctl \
readv writev preadv preadv64 pwritev pwritev64 \
@@ -73,7 +73,8 @@ routines := brk sbrk sstk ioctl \
fgetxattr flistxattr fremovexattr fsetxattr getxattr \
listxattr lgetxattr llistxattr lremovexattr lsetxattr \
removexattr setxattr getauxval ifunc-impl-list makedev \
- allocate_once fd_to_filename single_threaded unwind-link
+ allocate_once fd_to_filename single_threaded unwind-link \
+ cstack_allocate cstack_free cstack_get
generated += tst-error1.mtrace tst-error1-mem.out \
tst-allocate_once.mtrace tst-allocate_once-mem.out
@@ -88,7 +89,8 @@ tests := tst-dirname tst-tsearch tst-fdset tst-mntent tst-hsearch \
tst-preadvwritev tst-preadvwritev64 tst-makedev tst-empty \
tst-preadvwritev2 tst-preadvwritev64v2 tst-warn-wide \
tst-ldbl-warn tst-ldbl-error tst-dbl-efgcvt tst-ldbl-efgcvt \
- tst-mntent-autofs tst-syscalls tst-mntent-escape tst-select
+ tst-mntent-autofs tst-syscalls tst-mntent-escape tst-select \
+ tst-cstack
# Tests which need libdl.
ifeq (yes,$(build-shared))
@@ -164,6 +164,11 @@ libc {
GLIBC_2.32 {
__libc_single_threaded;
}
+ GLIBC_2.34 {
+ cstack_allocate;
+ cstack_free;
+ cstack_get;
+ }
GLIBC_PRIVATE {
__madvise;
__mktemp;
new file mode 100644
@@ -0,0 +1,121 @@
+/* Allocating a call stack.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+#include <errno.h>
+#include <ldsodefs.h>
+#include <stdlib.h>
+#include <sys/cstack.h>
+#include <sys/mman.h>
+#include <sysconf-sigstksz.h>
+
+cstack_t
+__cstack_allocate (size_t size, uint64_t flags)
+{
+ if (flags & ~(uint64_t) (CSTACK_ALLOCATE_NOBOTTOMGUARD
+ | CSTACK_ALLOCATE_NOTOPGUARD))
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ size_t pagesize = GLRO (dl_pagesize);
+
+ /* Buffer overflow guard. */
+ size_t bottom_guard_size;
+ if (flags & CSTACK_ALLOCATE_NOBOTTOMGUARD)
+ bottom_guard_size = 0;
+ else
+ bottom_guard_size = pagesize;
+
+ /* -fstack-clash-protection guard. */
+ size_t top_guard_size;
+ if (flags & CSTACK_ALLOCATE_NOTOPGUARD)
+ top_guard_size = 0;
+ else
+ {
+ if (ARCH_MIN_GUARD_SIZE != 0)
+ bottom_guard_size = roundup (ARCH_MIN_GUARD_SIZE, pagesize);
+ else
+ bottom_guard_size = pagesize;
+ }
+
+ if (size == 0)
+ /* Use SIGSTKSZ by default. */
+ size = sysconf_sigstksz ();
+ else
+ {
+ /* Otherwise add MINSIGSTKSZ to the user-requested size. */
+ if (__builtin_add_overflow (size, GLRO (dl_minsigstacksize), &size))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+ }
+
+ size_t rounded_size = roundup (size, pagesize);
+ size_t total_size;
+ if (rounded_size < size
+ || __builtin_add_overflow (rounded_size, bottom_guard_size, &total_size)
+ || __builtin_add_overflow (total_size, top_guard_size, &total_size))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+ assert ((total_size & (pagesize - 1)) == 0);
+
+ cstack_t result = malloc (sizeof (*result));
+ if (result == NULL)
+ return result;
+
+ int map_flags = MAP_PRIVATE | MAP_ANON;
+#ifdef MAP_STACK
+ map_flags |= MAP_STACK;
+#endif
+ result->entire_region_start = __mmap (NULL, total_size,
+ PROT_NONE, map_flags, -1, 0);
+ if (result->entire_region_start == MAP_FAILED)
+ {
+ free (result);
+ return NULL;
+ }
+ result->entire_region_size = total_size;
+
+#if _STACK_GROWS_DOWN
+ char *sp = result->entire_region_start + top_guard_size;
+#endif
+#if _STACK_GROWS_UP
+ char *sp = result->entire_region_start + bottom_guard_size;
+#endif
+
+ if (__mprotect (sp, rounded_size, PROT_READ | PROT_WRITE) != 0)
+ {
+ __cstack_free (result);
+ return NULL;
+ }
+
+ result->stack = (stack_t)
+ {
+ .ss_sp = sp,
+ .ss_size = rounded_size,
+ };
+
+ return result;
+}
+libc_hidden_def (__cstack_allocate)
+weak_alias (__cstack_allocate, cstack_allocate)
new file mode 100644
@@ -0,0 +1,35 @@
+/* Deallocating a call stack.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/cstack.h>
+#include <sys/mman.h>
+
+void
+__cstack_free (cstack_t stack)
+{
+ int saved_errno = errno;
+ /* This may leak the mapping if it causes the map count to be
+ exceeded (and clobber errno). */
+ __munmap (stack->entire_region_start, stack->entire_region_size);
+ free (stack);
+ __set_errno (saved_errno);
+}
+libc_hidden_def (__cstack_free)
+weak_alias (__cstack_free, cstack_free)
new file mode 100644
@@ -0,0 +1,27 @@
+/* Obtaining the stack region of a call stack.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/cstack.h>
+
+void
+__cstack_get (cstack_t stack, stack_t *result)
+{
+ *result = stack->stack;
+}
+libc_hidden_def (__cstack_get)
+weak_alias (__cstack_get, cstack_get)
new file mode 100644
@@ -0,0 +1,53 @@
+/* Allocating call stacks.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_CSTACK_H
+#define _SYS_CSTACK_H
+
+#include <bits/types/stack_t.h>
+#include <features.h>
+#include <stddef.h>
+#include <stdint.h>
+
+struct __cstack;
+
+/* Call stack handles returned by cstack_allocate. */
+typedef struct __cstack *cstack_t;
+
+/* Allocate guard region below the first activation frame. */
+#define CSTACK_ALLOCATE_NOBOTTOMGUARD 1
+
+/* Do not add a guard region to detect stack overflow/exhaustion. */
+#define CSTACK_ALLOCATE_NOTOPGUARD 2
+
+__BEGIN_DECLS
+
+/* Allocates a handle for a new call stack of the requested SIZE.
+ Flags should be a combination of CSTACK_ALLOCATE_* constants.
+ Returns NULL and sets errno on error. */
+extern cstack_t cstack_allocate (size_t __size, uint64_t __flags) __THROW;
+
+/* Deallocates STACK. */
+extern void cstack_free (cstack_t __stack) __THROW;
+
+/* Obtains the usable stack region of STACK and writes it to *RESULT. */
+extern void cstack_get (cstack_t __stack, stack_t *result) __THROW;
+
+__END_DECLS
+
+#endif /* _SYS_CSTACK_H */
new file mode 100644
@@ -0,0 +1,176 @@
+/* Tests for allocating call stacks.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/cstack.h>
+
+#include <signal.h>
+#include <setjmp.h>
+#include <stdbool.h>
+#include <string.h>
+#include <support/check.h>
+#include <support/xsignal.h>
+
+static stack_t expected_stack;
+static volatile bool test_ran;
+
+void __attribute__ ((weak)) /* Compiler barrier. */
+check_on_stack (void *ptr)
+{
+ TEST_VERIFY (expected_stack.ss_sp != 0);
+ TEST_VERIFY (expected_stack.ss_size > 0);
+ TEST_VERIFY (ptr >= expected_stack.ss_sp);
+ TEST_VERIFY (ptr - expected_stack.ss_sp < expected_stack.ss_size);
+}
+
+/* Used for testing an on-stack buffer with a non-default stack
+ size. */
+enum { large_buffer_size = 8 * 1024 * 1024 };
+
+static void
+default_stack_test (int ignored)
+{
+ /* The default stack allocation should be large enough to accomodate
+ a small buffer. */
+ char buf[512];
+ TEST_VERIFY (expected_stack.ss_size < large_buffer_size);
+ explicit_bzero (buf, sizeof (buf));
+ check_on_stack (buf);
+ check_on_stack (buf + sizeof (buf));
+ test_ran = true;
+}
+
+static void
+large_stack_test (int ignored)
+{
+ /* This needs a stack allocation with a non-default buffer size. */
+ char buf[large_buffer_size];
+ explicit_bzero (buf, sizeof (buf));
+ check_on_stack (buf);
+ check_on_stack (buf + sizeof (buf));
+ test_ran = true;
+}
+
+static void
+run_test_on_stack (cstack_t stack, void (*test) (int))
+{
+ cstack_get (stack, &expected_stack);
+ stack_t savestk;
+ TEST_COMPARE (sigaltstack (&expected_stack, &savestk), 0);
+
+ struct sigaction saveact;
+ const struct sigaction sigact =
+ {
+ .sa_handler = test,
+ .sa_flags = SA_ONSTACK,
+ };
+ xsigaction (SIGUSR1, &sigact, &saveact);
+
+ test_ran = false;
+ xraise (SIGUSR1);
+ TEST_VERIFY (test_ran);
+
+ xsigaction (SIGUSR1, &saveact, NULL);
+ TEST_COMPARE (sigaltstack (&savestk, NULL), 0);
+}
+
+static jmp_buf fault_jmp;
+static volatile void *volatile fault_address;
+static volatile bool fault_handler_ran;
+
+static void
+fault_handler (int signum, siginfo_t *info, void *ctx)
+{
+ fault_address = info->si_addr;
+ fault_handler_ran = true;
+ siglongjmp (fault_jmp, 1);
+}
+
+static void
+check_for_fault (const stack_t *stack, volatile char *address)
+{
+ struct sigaction saveact;
+ const struct sigaction sigact =
+ {
+ .sa_sigaction = fault_handler,
+ .sa_flags = SA_SIGINFO,
+ };
+ xsigaction (SIGSEGV, &sigact, &saveact);
+
+ fault_address = NULL;
+ fault_handler_ran = false;
+ if (sigsetjmp (fault_jmp, 1) != 0)
+ {
+ TEST_VERIFY (fault_handler_ran);
+ TEST_VERIFY (address == fault_address);
+ xsigaction (SIGSEGV, &saveact, NULL);
+ return;
+ }
+
+ *address = 1;
+ FAIL_EXIT1 ("write to %p did not trap (stack: %p, %zu)",
+ address, stack->ss_sp, stack->ss_size);
+}
+
+/* Check that right below and above the stack area, there is a
+ fault. */
+static void
+check_for_faults (size_t size)
+{
+ cstack_t stack = cstack_allocate (0, 0);
+ TEST_VERIFY_EXIT (stack != NULL);
+ stack_t st;
+ cstack_get (stack, &st);
+ check_for_fault (&st, st.ss_sp - 1);
+ check_for_fault (&st, st.ss_sp + st.ss_size);
+ cstack_free (stack);
+}
+
+static int
+do_test (void)
+{
+ for (int do_nobottomguard = 0; do_nobottomguard < 2; ++do_nobottomguard)
+ for (int do_notopguard = 0; do_notopguard < 2; ++do_notopguard)
+ {
+ uint64_t flags = 0;
+ if (do_nobottomguard)
+ flags |= CSTACK_ALLOCATE_NOBOTTOMGUARD;
+ if (do_notopguard)
+ flags |= CSTACK_ALLOCATE_NOTOPGUARD;
+
+ {
+ cstack_t stack = cstack_allocate (0, flags);
+ TEST_VERIFY_EXIT (stack != NULL);
+ run_test_on_stack (stack, default_stack_test);
+ cstack_free (stack);
+ }
+
+ {
+ cstack_t stack = cstack_allocate (large_buffer_size + 1024, flags);
+ TEST_VERIFY_EXIT (stack != NULL);
+ run_test_on_stack (stack, large_stack_test);
+ cstack_free (stack);
+ }
+ }
+
+ check_for_faults (0);
+ check_for_faults (large_buffer_size);
+
+ return 0;
+}
+
+#include <support/test-driver.c>
@@ -2207,6 +2207,9 @@ GLIBC_2.33 stat64 F
GLIBC_2.34 __isnanf128 F
GLIBC_2.34 __libc_start_main F
GLIBC_2.34 _hurd_libc_proc_init F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 timespec_getres F
GLIBC_2.4 __confstr_chk F
@@ -2340,6 +2340,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2431,6 +2431,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2099,6 +2099,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -206,6 +206,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -203,6 +203,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2283,6 +2283,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2236,6 +2236,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2419,6 +2419,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2272,6 +2272,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -207,6 +207,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2362,6 +2362,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2334,6 +2334,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2331,6 +2331,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2327,6 +2327,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2325,6 +2325,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2333,6 +2333,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2327,6 +2327,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2373,6 +2373,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2389,6 +2389,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2422,6 +2422,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2237,6 +2237,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2536,6 +2536,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2101,6 +2101,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2301,6 +2301,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2387,6 +2387,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2274,6 +2274,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2243,6 +2243,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2240,6 +2240,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2380,6 +2380,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2293,6 +2293,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2252,6 +2252,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F
@@ -2355,6 +2355,9 @@ GLIBC_2.34 cnd_init F
GLIBC_2.34 cnd_signal F
GLIBC_2.34 cnd_timedwait F
GLIBC_2.34 cnd_wait F
+GLIBC_2.34 cstack_allocate F
+GLIBC_2.34 cstack_free F
+GLIBC_2.34 cstack_get F
GLIBC_2.34 execveat F
GLIBC_2.34 mtx_destroy F
GLIBC_2.34 mtx_init F