Major new features:
- [Add new features here]
+* The ISO C23 memset_explicit function has been added.
Deprecated and removed features, and other changes affecting compatibility:
memmove_chk \
mempcpy_chk \
memset_chk \
+ memset_explicit_chk \
noophooks \
obprintf_chk \
poll_chk \
__inet_ntop_chk;
__inet_pton_chk;
}
+ GLIBC_2.43 {
+ __memset_explicit_chk;
+ }
GLIBC_PRIVATE {
__fortify_fail;
}
--- /dev/null
+/* Generic implementation of __memset_explicit_chk.
+ Copyright (C) 1991-2025 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/>. */
+
+/* This is the generic definition of __memset_explicit_chk. The
+ __memset_explicit_chk symbol is used as the implementation of
+ memset_explicit throughout glibc. If this file is overridden by an
+ architecture, both __memset_explicit_chk and
+ __memset_explicit_chk_internal have to be defined (the latter not as
+ an IFUNC). */
+
+#include <string.h>
+
+void *
+__memset_explicit_chk (void *dst, int c, size_t len, size_t dstlen)
+{
+ /* Inline __memset_chk to avoid a PLT reference to __memset_chk. */
+ if (__glibc_unlikely (dstlen < len))
+ __chk_fail ();
+ memset (dst, c, len);
+ /* Compiler barrier. */
+ asm volatile ("" ::: "memory");
+ return dst;
+}
+
+/* libc-internal references use the hidden
+ __memset_explicit_chk_internal symbol. This is necessary if
+ __memset_explicit_chk is implemented as an IFUNC because some
+ targets do not support hidden references to IFUNC symbols. */
+strong_alias (__memset_explicit_chk, __memset_explicit_chk_internal)
if (memcmp (buf, "aabcda\0\0\0\0", 10))
FAIL ();
+ memset_explicit (buf + 5, 0x1234, 3);
+ if (memcmp (buf, "aabcd444\0\0", 10))
+ FAIL ();
+
strcpy (buf + 4, "EDCBA");
if (memcmp (buf, "aabcEDCBA", 10))
FAIL ();
if (memcmp (buf, "aabcda\0\0\0\0", 10))
FAIL ();
+ memset_explicit (buf + 5, 0x1234, l0 + 3);
+ if (memcmp (buf, "aabcd444\0\0", 10))
+ FAIL ();
+
strcpy (buf + 4, str1 + 5);
if (memcmp (buf, "aabcEDCBA", 10))
FAIL ();
if (memcmp (a.buf1, "aabcda\0\0\0\0", 10))
FAIL ();
+ memset_explicit (a.buf1 + 5, 0x1234, l0 + 3);
+ if (memcmp (a.buf1, "aabcd444\0\0", 10))
+ FAIL ();
+
#if __USE_FORTIFY_LEVEL < 2
/* The following tests are supposed to crash with -D_FORTIFY_SOURCE=2
and sufficient GCC support, as the string operations overflow
explicit_bzero (buf + 9, l0 + 2);
CHK_FAIL_END
+ CHK_FAIL_START
+ memset_explicit (buf + 9, 1, 2);
+ CHK_FAIL_END
+
+ CHK_FAIL_START
+ memset_explicit (buf + 9, 4, l0 + 2);
+ CHK_FAIL_END
+
CHK_FAIL_START
strcpy (buf + 5, str1 + 5);
CHK_FAIL_END
explicit_bzero (a.buf1 + 9, l0 + 2);
CHK_FAIL_END
+ CHK_FAIL_START
+ memset_explicit (a.buf1 + 9, 0, 2);
+ CHK_FAIL_END
+
+ CHK_FAIL_START
+ memset_explicit (a.buf1 + 9, 128, l0 + 2);
+ CHK_FAIL_END
+
# if __USE_FORTIFY_LEVEL >= 2
# define O 0
# else
__THROW __nonnull ((1)) attribute_hidden;
# define explicit_bzero(buf, len) \
__explicit_bzero_chk_internal (buf, len, __glibc_objsize0 (buf))
+/* Avoid hidden reference to IFUNC symbol __memset_explicit_chk. */
+void *__memset_explicit_chk_internal (void *, int, size_t, size_t)
+ __THROW __nonnull ((1)) attribute_hidden;
+# define memset_explicit(buf, c, len) \
+ __memset_explicit_chk_internal (buf, c, len, __glibc_objsize0 (buf))
#elif !IS_IN (nonlib)
void __explicit_bzero_chk (void *, size_t, size_t) __THROW __nonnull ((1));
# define explicit_bzero(buf, len) __explicit_bzero_chk (buf, len, \
__glibc_objsize0 (buf))
+void *__memset_explicit_chk (void *, int, size_t, size_t)
+ __THROW __nonnull ((1));
+# define memset_explicit(buf, c, len) \
+ __memset_explicit_chk (buf, c, len, __glibc_objsize0 (buf))
#endif
libc_hidden_builtin_proto (memchr)
@item @code{memset}
+@item @code{memset_explicit}
+
@item @code{mq_open}
@item @code{obstack_printf}
Since erasure is a precaution against bugs, this optimization is
inappropriate.
-The function @code{explicit_bzero} erases a block of memory, and
-guarantees that the compiler will not remove the erasure as
+The functions @code{explicit_bzero} and @code{memset_explicit} erase a
+block of memory, and guarantee that the compiler will not remove the erasure as
``unnecessary.''
@smallexample
In this example, if @code{memset}, @code{bzero}, or a hand-written
loop had been used, the compiler might remove them as ``unnecessary.''
-@strong{Warning:} @code{explicit_bzero} does not guarantee that
+@strong{Warning:} @code{explicit_bzero} and @code{memset_explicit} do
+not guarantee that
sensitive data is @emph{completely} erased from the computer's memory.
There may be copies in temporary storage areas, such as registers and
``scratch'' stack space; since these are invisible to the source code,
a library function cannot erase them.
-Also, @code{explicit_bzero} only operates on RAM. If a sensitive data
-object never needs to have its address taken other than to call
-@code{explicit_bzero}, it might be stored entirely in CPU registers
-@emph{until} the call to @code{explicit_bzero}. Then it will be
+Also, @code{explicit_bzero} and @code{memset_explicit} only operate on
+RAM. If a sensitive data object never needs to have its address taken
+other than to call @code{explicit_bzero} or @code{memset_explicit}, it
+might be stored entirely in CPU registers @emph{until} the call to
+@code{explicit_bzero} or @code{memset_explicit}. Then it will be
copied into RAM, the copy will be erased, and the original will remain
intact. Data in RAM is more likely to be exposed by a bug than data
in registers, so this creates a brief window where the data is at
qualification on the pointer and remove the erasure anyway.
Having said all that, in most situations, using @code{explicit_bzero}
+or @code{memset_explicit}
is better than not using it. At present, the only way to do a more
thorough job is to write the entire sensitive operation in assembly
language. We anticipate that future compilers will recognize calls to
-@code{explicit_bzero} and take appropriate steps to erase all the
+@code{explicit_bzero} or @code{memset_explicit} and take appropriate
+steps to erase all the
copies of the affected data, wherever they may be.
@deftypefun void explicit_bzero (void *@var{block}, size_t @var{len})
systems it may be in @file{strings.h} instead.
@end deftypefun
+@deftypefun {void *} memset_explicit (void *@var{block}, int @var{c}, size_t @var{size})
+@standards{C23, string.h}
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+
+This function copies the value of @var{c} (converted to an
+@code{unsigned char}) into each of the first @var{size} bytes of the
+object beginning at @var{block}, just as @code{memset} would. It
+returns the value of @var{block}. The bytes are always written, even
+if the compiler could determine that this is ``unnecessary'' because
+no correct program could read them back.
+
+@strong{Note:} The @emph{only} optimization that @code{memset_explicit}
+disables is removal of ``unnecessary'' writes to memory. The compiler
+can perform all the other optimizations that it could for a call to
+@code{memset}. For instance, it may replace the function call with
+inline memory writes, and it may assume that @var{block} cannot be a
+null pointer.
+@end deftypefun
+
@node Shuffling Bytes
@section Shuffling Bytes
mempcpy \
memrchr \
memset \
+ memset_explicit \
rawmemchr \
sigabbrev_np \
sigdescr_np \
memmove \
mempcpy \
memset \
+ memset_explicit \
stpcpy \
stpncpy \
strcat \
test-mempcpy \
test-memrchr \
test-memset \
+ test-memset_explicit \
test-rawmemchr \
test-sig_np \
test-stpcpy \
tst-svc \
tst-svc2 \
tst-xbzero-opt \
+ tst-xmemset-opt \
# tests
tests-static-internal := \
CFLAGS-test-ffs.c += -fno-builtin
CFLAGS-tst-inlcall.c += -fno-builtin
CFLAGS-tst-xbzero-opt.c += -O3
+CFLAGS-tst-xmemset-opt.c += -O3
CFLAGS-test-endian-sign-conversion.c += -Werror -Wsign-conversion
# BZ 21006: Resolve all functions but at least explicit_bzero at startup.
# Otherwise the test fails on s390x as the memcpy in prepare_test_buffer is
# and the call to memmem in count_test_patterns will find a hit of the
# test_pattern on the stack.
LDFLAGS-tst-xbzero-opt = -z now
+LDFLAGS-tst-xmemset-opt = -z now
# Called during TLS initialization.
CFLAGS-memcpy.c += $(no-stack-protector)
strlcat;
strlcpy;
}
+ GLIBC_2.43 {
+ memset_explicit;
+ }
}
__glibc_objsize0 (__dest));
}
+#if defined __USE_MISC || __GLIBC_USE (ISOC23)
+void *__memset_explicit_chk (void *__s, int __c, size_t __n, size_t __destlen)
+ __THROW __nonnull ((1)) __fortified_attr_access (__write_only__, 1, 3);
+
+__fortify_function void *
+__NTH (memset_explicit (void *__dest, int __ch, size_t __len))
+{
+ return __memset_explicit_chk (__dest, __ch, __len,
+ __glibc_objsize0 (__dest));
+}
+#endif
+
#ifdef __USE_MISC
# include <bits/strings_fortified.h>
--- /dev/null
+/* Erasure of sensitive data, generic implementation.
+ Copyright (C) 2016-2025 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/>. */
+
+/* An assembler implementation of memset_explicit can be created as an
+ assembler alias of an optimized memset implementation.
+ Architecture-specific implementations also need to define
+ __memset_explicit_chk. */
+
+#include <string.h>
+
+/* glibc-internal users use __memset_explicit_chk, and memset_explicit
+ redirects to that. */
+#undef memset_explicit
+
+/* Set LEN bytes of S to C. The compiler will not delete a call to
+ this function, even if S is dead after the call. */
+void *
+memset_explicit (void *s, int c, size_t len)
+{
+ memset (s, c, len);
+ /* Compiler barrier. */
+ asm volatile ("" ::: "memory");
+ return s;
+}
/* Set N bytes of S to C. */
extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
+#if defined __USE_MISC || __GLIBC_USE (ISOC23)
+/* Like memset, but the compiler will not delete a call to this
+ function, even if S is dead after the call. */
+extern void *memset_explicit (void *__s, int __c, size_t __n)
+ __THROW __nonnull ((1)) __fortified_attr_access (__write_only__, 1, 3);
+#endif
+
/* Compare N bytes of S1 and S2. */
extern int memcmp (const void *__s1, const void *__s2, size_t __n)
__THROW __attribute_pure__ __nonnull ((1, 2));
# endif
#else
# ifndef WIDE
-# define TEST_NAME "memset"
+# ifdef TEST_MEMSET_EXPLICIT
+# define TEST_NAME "memset_explicit"
+# else
+# define TEST_NAME "memset"
+# endif
# else
# define TEST_NAME "wmemset"
# endif /* WIDE */
#include "test-string.h"
#ifndef WIDE
-# define MEMSET memset
+# ifdef TEST_MEMSET_EXPLICIT
+# define MEMSET memset_explicit
+# else
+# define MEMSET memset
+# endif
# define CHAR char
# define UCHAR unsigned char
# define SIMPLE_MEMSET simple_memset
--- /dev/null
+/* Test and measure memset_explicit.
+ Copyright (C) 2025 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/>. */
+#define TEST_MEMSET_EXPLICIT
+#include "test-memset.c"
{
unsigned char buf[TEST_BUFFER_SIZE];
prepare_test_buffer (buf);
+#ifdef TEST_MEMSET_EXPLICIT
+ memset_explicit (buf, 0, TEST_BUFFER_SIZE);
+#else
explicit_bzero (buf, TEST_BUFFER_SIZE);
+#endif
}
enum test_expectation
--- /dev/null
+#define TEST_MEMSET_EXPLICIT 1
+#include "tst-xbzero-opt.c"
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.43 pthread_cancel F
GLIBC_2.43 pthread_clockjoin_np F
GLIBC_2.43 pthread_detach F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.43 pthread_cancel F
GLIBC_2.43 pthread_clockjoin_np F
GLIBC_2.43 pthread_detach F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
GLIBC_2.42 uimaxabs F
GLIBC_2.42 ulabs F
GLIBC_2.42 ullabs F
+GLIBC_2.43 __memset_explicit_chk F
+GLIBC_2.43 memset_explicit F