[PATCH v2 1/2] Disable SFrame support by default
Adhemerval Zanella
adhemerval.zanella@linaro.org
Mon Jul 21 23:41:26 GMT 2025
And add extra checks to enable for binutils 2.45 and if the archicture
explicitly enables it. When SFrame is disabled, all the related code
is also not enabled for backtrace() and _dl_find_object(), so SFrame
backtracking is not used even if the binary has the SFrame segment.
This patch also adds some other related fixes:
* Fixed an issue with AC_CHECK_PROG_VER, where the READELF_SFRAME
usage prevented specifying a different readelf through READELF
environment variable at configure time.
* Add an extra arch-specific internal definition,
libc_cv_support_sframe, to disable --enable-sframe on architectures
that have binutils but not glibc support (s390x).
* Renamed the tests without the .sframe segment and move the
tst-backtrace1 from pthread to debug.
* Use the built compiler strip to remove the .sframe segment,
instead of the system one (which might not support SFrame).
Checked on x86_64-linux-gnu and aarch64-linux-gnu.
---
INSTALL | 9 +--
aclocal.m4 | 4 ++
config.h.in | 3 +
config.make.in | 2 +-
configure | 62 ++++++++++++---------
configure.ac | 26 +++++----
debug/Makefile | 16 ++++--
debug/backtrace.c | 8 +++
{sysdeps/pthread => debug}/tst-backtrace1.c | 0
elf/dl-find_object.h | 10 ++++
manual/install.texi | 11 ++--
sysdeps/aarch64/configure | 2 +
sysdeps/aarch64/configure.ac | 2 +
sysdeps/generic/Makefile | 2 +
sysdeps/pthread/Makefile | 1 -
sysdeps/x86_64/configure | 2 +
sysdeps/x86_64/configure.ac | 2 +
17 files changed, 108 insertions(+), 54 deletions(-)
rename {sysdeps/pthread => debug}/tst-backtrace1.c (100%)
diff --git a/INSTALL b/INSTALL
index cf60e1a380..85382a8139 100644
--- a/INSTALL
+++ b/INSTALL
@@ -291,10 +291,11 @@ passed to 'configure'. For example:
Default is to disable fortification.
-'--disable-sframe'
- By default, the GNU C Library is built with '-Wa,--gsframe' if the
- current GNU 'binutils' supports it. You may want to use this
- option if you don't plan to use SFrame stack tracer.
+'--enable-sframe'
+ Experimental option supported by some architectures, where
+ the GNU C Library is built with '-Wa,--gsframe' if the binutils
+ supports it. You may want to use this option if you plan to use
+ SFrame stack tracer.
To build the library and related programs, type 'make'. This will
produce a lot of output, some of which may look like errors from 'make'
diff --git a/aclocal.m4 b/aclocal.m4
index e06366cdb2..450646b0e4 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -145,6 +145,10 @@ if test -z "$NM"; then
NM=`$CC -print-prog-name=nm`
fi
AC_SUBST(NM)
+if test -z "$STRIP"; then
+ STRIP=`$CC -print-prog-name=nm`
+fi
+AC_SUBST(STRIP)
])
dnl Run a static link test with -nostdlib -nostartfiles.
diff --git a/config.h.in b/config.h.in
index 29126ea933..8b4077f578 100644
--- a/config.h.in
+++ b/config.h.in
@@ -287,6 +287,9 @@
/* Define if static PIE is enabled. */
#define ENABLE_STATIC_PIE 0
+/* Define if SFrame v2 is enabled. */
+#define ENABLE_SFRAME 0
+
/* The default value of x86 CET control. */
#define DEFAULT_DL_X86_CET_CONTROL cet_elf_property
diff --git a/config.make.in b/config.make.in
index 382e003d87..fca75ab5d3 100644
--- a/config.make.in
+++ b/config.make.in
@@ -51,7 +51,6 @@ c++-cstdlib-header = @CXX_CSTDLIB_HEADER@
c++-cmath-header = @CXX_CMATH_HEADER@
c++-bits-std_abs-h = @CXX_BITS_STD_ABS_H@
enable-werror = @enable_werror@
-enable-gsframe = @enable_gsframe@
have-z-execstack = @libc_cv_z_execstack@
have-no-error-execstack = @libc_cv_no_error_execstack@
@@ -114,6 +113,7 @@ OBJDUMP = @OBJDUMP@
OBJCOPY = @OBJCOPY@
GPROF = @GPROF@
READELF = @READELF@
+STRIP = @STRIP@
# Installation tools.
INSTALL = @INSTALL@
diff --git a/configure b/configure
index 6595d6be54..2efa7e1bde 100755
--- a/configure
+++ b/configure
@@ -620,8 +620,6 @@ DEFINES
static_nss
profile
libc_cv_multidir
-enable_gsframe
-READELF_SFRAME
libc_cv_test_x86_have_amx_tile
test_enable_cet
libc_cv_test_cc_mprefer_vector_width
@@ -694,6 +692,7 @@ MAKEINFO
MSGFMT
MAKE
LD
+STRIP
NM
OBJDUMP
READELF
@@ -1510,8 +1509,8 @@ Optional Features:
Use -D_FORTIFY_SOURCE=[1|2|3] to control code
hardening, defaults to highest possible value
supported by the build compiler.
- --disable-sframe Disable building with SFrame stack trace information
- [default=yes if GNU as is 2.41 or older]
+ --enable-sframe Enable building with SFrame stack trace information
+ [default=no]
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -4895,7 +4894,7 @@ if test ${enable_sframe+y}
then :
enableval=$enable_sframe; use_sframe=$enableval
else case e in #(
- e) use_sframe=notset ;;
+ e) use_sframe=no ;;
esac
fi
@@ -5142,6 +5141,10 @@ if test -z "$NM"; then
NM=`$CC -print-prog-name=nm`
fi
+if test -z "$STRIP"; then
+ STRIP=`$CC -print-prog-name=nm`
+fi
+
# Accept binutils 2.39 or newer.
@@ -9357,7 +9360,7 @@ have-libgcc_s = $libc_cv_have_libgcc_s"
# Glibc stacktracer supports SFrame v2 or newer
-libc_cv_readelf_version_ok=yes
+libc_cv_sframe_readelf_version=yes
# SFrame is supported from 2.41 or higher
for ac_prog in $READELF
do
@@ -9365,12 +9368,12 @@ do
set dummy $ac_prog; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
printf %s "checking for $ac_word... " >&6; }
-if test ${ac_cv_prog_READELF_SFRAME+y}
+if test ${ac_cv_prog_READELF+y}
then :
printf %s "(cached) " >&6
else case e in #(
- e) if test -n "$READELF_SFRAME"; then
- ac_cv_prog_READELF_SFRAME="$READELF_SFRAME" # Let the user override the test.
+ e) if test -n "$READELF"; then
+ ac_cv_prog_READELF="$READELF" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
@@ -9383,7 +9386,7 @@ do
esac
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
- ac_cv_prog_READELF_SFRAME="$ac_prog"
+ ac_cv_prog_READELF="$ac_prog"
printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
@@ -9394,29 +9397,29 @@ IFS=$as_save_IFS
fi ;;
esac
fi
-READELF_SFRAME=$ac_cv_prog_READELF_SFRAME
-if test -n "$READELF_SFRAME"; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $READELF_SFRAME" >&5
-printf "%s\n" "$READELF_SFRAME" >&6; }
+READELF=$ac_cv_prog_READELF
+if test -n "$READELF"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5
+printf "%s\n" "$READELF" >&6; }
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
fi
- test -n "$READELF_SFRAME" && break
+ test -n "$READELF" && break
done
-if test -z "$READELF_SFRAME"; then
+if test -z "$READELF"; then
ac_verc_fail=yes
else
# Found it, now check the version.
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $READELF_SFRAME" >&5
-printf %s "checking version of $READELF_SFRAME... " >&6; }
- ac_prog_version=`$READELF_SFRAME --version 2>&1 | sed -n 's/^.*GNU readelf.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $READELF" >&5
+printf %s "checking version of $READELF... " >&6; }
+ ac_prog_version=`$READELF --version 2>&1 | sed -n 's/^.*GNU readelf.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
- 2.4[1-9]*|2.[5-9][0-9]*|[3-9].*|[1-9][0-9][0-9]*)
+ 2.4[5-9]*|2.[5-9][0-9]*|[3-9].*|[1-9][0-9][0-9]*)
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
@@ -9425,12 +9428,12 @@ printf %s "checking version of $READELF_SFRAME... " >&6; }
printf "%s\n" "$ac_prog_version" >&6; }
fi
if test $ac_verc_fail = yes; then
- libc_cv_readelf_version_ok=no
+ libc_cv_sframe_readelf_version=no
fi
# Check the current toolchain for SFrame support
-if test $libc_cv_readelf_version_ok = yes; then
+if test $libc_cv_sframe_readelf_version = yes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SFrame support" >&5
printf %s "checking for SFrame support... " >&6; }
if test ${libc_cv_default_sframe+y}
@@ -9459,16 +9462,23 @@ fi
# Prevent enabling sframe on non-supporting toolchains
enable_gsframe=no
-if test $use_sframe$libc_cv_default_sframe = yesyes || \
- test $use_sframe$libc_cv_default_sframe = notsetyes; then
- enable_gsframe=yes
+if test $use_sframe$libc_cv_default_sframe$libc_cv_support_sframe = yesyesyes; then
+ enable_gsframe=yes
+ printf "%s\n" "#define ENABLE_SFRAME 1" >>confdefs.h
+
+elif test -z $libc_cv_support_sframe; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+as_fn_error $? "the architecture doesn't support SFrame
+See 'config.log' for more details" "$LINENO" 5; }
elif test $use_sframe = yes; then
{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "toolchain doesn't support SFrame v2 or higher
See 'config.log' for more details" "$LINENO" 5; }
fi
-
+config_vars="$config_vars
+enable-gsframe = $enable_gsframe"
# Set the `multidir' variable by grabbing the variable from the compiler.
# We do it once and save the result in a generated makefile.
diff --git a/configure.ac b/configure.ac
index 25b80e34e4..13fc4624ce 100644
--- a/configure.ac
+++ b/configure.ac
@@ -441,10 +441,10 @@ case "$enable_fortify_source" in
esac
AC_ARG_ENABLE([sframe],
- [AS_HELP_STRING([--disable-sframe],
- [Disable building with SFrame stack trace information @<:@default=yes if GNU as is 2.41 or older@:>@])],
+ [AS_HELP_STRING([--enable-sframe],
+ [Enable building with SFrame stack trace information @<:@default=no@:>@])],
[use_sframe=$enableval],
- [use_sframe=notset])
+ [use_sframe=no])
# We keep the original values in `$config_*' and never modify them, so we
# can write them unchanged into config.make. Everything else uses
@@ -2122,15 +2122,15 @@ AC_SUBST(test_enable_cet)
AC_SUBST(libc_cv_test_x86_have_amx_tile)
# Glibc stacktracer supports SFrame v2 or newer
-libc_cv_readelf_version_ok=yes
+libc_cv_sframe_readelf_version=yes
# SFrame is supported from 2.41 or higher
-AC_CHECK_PROG_VER(READELF_SFRAME, $READELF, --version,
+AC_CHECK_PROG_VER(READELF, $READELF, --version,
[GNU readelf.* \([0-9][0-9]*\.[0-9.]*\)],
- [2.4[1-9]*|2.[5-9][0-9]*|[3-9].*|[1-9][0-9][0-9]*],
- libc_cv_readelf_version_ok=no)
+ [2.4[5-9]*|2.[5-9][0-9]*|[3-9].*|[1-9][0-9][0-9]*],
+ libc_cv_sframe_readelf_version=no)
# Check the current toolchain for SFrame support
-if test $libc_cv_readelf_version_ok = yes; then
+if test $libc_cv_sframe_readelf_version = yes; then
AC_CACHE_CHECK([for SFrame support], libc_cv_default_sframe,
[dnl
cat > conftest.c <<EOF
@@ -2151,13 +2151,15 @@ fi
# Prevent enabling sframe on non-supporting toolchains
enable_gsframe=no
-if test $use_sframe$libc_cv_default_sframe = yesyes || \
- test $use_sframe$libc_cv_default_sframe = notsetyes; then
- enable_gsframe=yes
+if test $use_sframe$libc_cv_default_sframe$libc_cv_support_sframe = yesyesyes; then
+ enable_gsframe=yes
+ AC_DEFINE(ENABLE_SFRAME)
+elif test -z $libc_cv_support_sframe; then
+ AC_MSG_FAILURE([the architecture doesn't support SFrame])
elif test $use_sframe = yes; then
AC_MSG_FAILURE([toolchain doesn't support SFrame v2 or higher])
fi
-AC_SUBST(enable_gsframe)
+LIBC_CONFIG_VAR([enable-gsframe], [$enable_gsframe])
# Set the `multidir' variable by grabbing the variable from the compiler.
# We do it once and save the result in a generated makefile.
diff --git a/debug/Makefile b/debug/Makefile
index 919bf91c42..6fcb30429e 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -285,14 +285,17 @@ LDFLAGS-tst-backtrace4 = -rdynamic
LDFLAGS-tst-backtrace5 = -rdynamic
LDFLAGS-tst-backtrace6 = -rdynamic
+$(objpfx)tst-backtrace1: $(shared-thread-library)
+
# When SFrame is enabled, make sure the dwarf unwinder is also exercised.
ifeq ($(enable-gsframe),yes)
dw_unwind_pair := \
- tst-backtrace7:tst-backtrace2 \
- tst-backtrace8:tst-backtrace3 \
- tst-backtrace9:tst-backtrace4 \
- tst-backtrace10:tst-backtrace5 \
- tst-backtrace11:tst-backtrace6
+ tst-backtrace1-nosframe:tst-backtrace1 \
+ tst-backtrace2-nosframe:tst-backtrace2 \
+ tst-backtrace3-nosframe:tst-backtrace3 \
+ tst-backtrace4-nosframe:tst-backtrace4 \
+ tst-backtrace5-nosframe:tst-backtrace5 \
+ tst-backtrace6-nosframe:tst-backtrace6
first_column = $(foreach pair,$(dw_unwind_pair),$(word 1,$(subst :, ,$(pair))))
tests-dw-unwind = $(patsubst %,$(objpfx)%.out,$(first_column))
@@ -301,7 +304,7 @@ endif
define make-strip-rule
$(objpfx)$(word 1,$(subst :, ,$(1))): $(objpfx)$(word 2,$(subst :, ,$(1)))
- strip --remove-section=.sframe $$< -o $$@
+ $(STRIP) --remove-section=.sframe $$< -o $$@
endef
$(foreach pair,$(dw_unwind_pair),$(eval $(call make-strip-rule,$(pair))))
@@ -324,6 +327,7 @@ tests = \
backtrace-tst \
test-stpcpy_chk \
test-strcpy_chk \
+ tst-backtrace1 \
tst-backtrace2 \
tst-backtrace3 \
tst-backtrace4 \
diff --git a/debug/backtrace.c b/debug/backtrace.c
index 161999c17e..ea7ac4ddf0 100644
--- a/debug/backtrace.c
+++ b/debug/backtrace.c
@@ -20,7 +20,9 @@
#include <stdlib.h>
#include <unwind.h>
#include <unwind-link.h>
+#if ENABLE_SFRAME
#include <sframe.h>
+#endif
struct trace_arg
{
@@ -31,6 +33,7 @@ struct trace_arg
int size;
};
+#if ENABLE_SFRAME
/* Initialize the SFrame backtrace routine and attempt to backtrace
the current stack using SFrame information. For the SFrame
backtrace to be considered valid, the tracer must return more than
@@ -64,6 +67,7 @@ do_sframe_backtrace (void **array, int size)
frame.fp = (_Unwind_Ptr) __builtin_frame_address (0);
return __stacktrace_sframe (array, size, &frame);
}
+#endif
static _Unwind_Reason_Code
backtrace_helper (struct _Unwind_Context *ctx, void *a)
@@ -110,6 +114,7 @@ __backtrace (void **array, int size)
if (size <= 0)
return 0;
+#if ENABLE_SFRAME
/* Try first the SFrame backtracer. */
int cnt = do_sframe_backtrace (array, size);
if (cnt > 1)
@@ -117,6 +122,9 @@ __backtrace (void **array, int size)
/* Try the dwarf unwinder. */
if (arg.unwind_link == NULL)
+#else
+ if (arg.unwind_link == NULL)
+#endif
return 0;
UNWIND_LINK_PTR (arg.unwind_link, _Unwind_Backtrace)
diff --git a/sysdeps/pthread/tst-backtrace1.c b/debug/tst-backtrace1.c
similarity index 100%
rename from sysdeps/pthread/tst-backtrace1.c
rename to debug/tst-backtrace1.c
diff --git a/elf/dl-find_object.h b/elf/dl-find_object.h
index 9aa2439eaa..6a50b4becf 100644
--- a/elf/dl-find_object.h
+++ b/elf/dl-find_object.h
@@ -43,7 +43,9 @@ struct dl_find_object_internal
#if DLFO_STRUCT_HAS_EH_COUNT
int eh_count;
#endif
+#if ENABLE_SFRAME
void *sframe;
+#endif
};
/* Create a copy of *SOURCE in *COPY using relaxed MO loads and
@@ -68,8 +70,10 @@ _dl_find_object_internal_copy (const struct dl_find_object_internal *source,
atomic_store_relaxed (©->eh_count,
atomic_load_relaxed (&source->eh_count));
#endif
+#if ENABLE_SFRAME
atomic_store_relaxed (©->sframe,
atomic_load_relaxed (&source->sframe));
+#endif
}
static inline void
@@ -86,10 +90,12 @@ _dl_find_object_to_external (struct dl_find_object_internal *internal,
# if DLFO_STRUCT_HAS_EH_COUNT
external->dlfo_eh_count = internal->eh_count;
# endif
+# if ENABLE_SFRAME
external->dlfo_sframe = internal->sframe;
if (internal->sframe != NULL)
external->dlfo_flags = DLFO_FLAG_SFRAME;
else
+# endif
external->dlfo_flags = 0;
}
@@ -112,7 +118,9 @@ _dl_find_object_from_map (struct link_map *l,
/* Initialize object's exception handling segment and SFrame segment
data. */
+#if ENABLE_SFRAME
atomic_store_relaxed (&result->sframe, NULL);
+#endif
atomic_store_relaxed (&result->eh_frame, NULL);
#if DLFO_STRUCT_HAS_EH_COUNT
atomic_store_relaxed (&result->eh_count, 0);
@@ -132,11 +140,13 @@ _dl_find_object_from_map (struct link_map *l,
read_seg |= 1;
break;
+#if ENABLE_SFRAME
case PT_GNU_SFRAME:
atomic_store_relaxed (&result->sframe,
(void *) (ph->p_vaddr + l->l_addr));
read_seg |= 2;
/* Fall through. */
+#endif
default:
break;
}
diff --git a/manual/install.texi b/manual/install.texi
index 0c8d448362..e360aa7589 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -321,10 +321,13 @@ the build compiler.
Default is to disable fortification.
-@item --disable-sframe
-By default, the GNU C Library is built with @option{-Wa,--gsframe} if
-the current GNU @code{binutils} supports it. You may want to use this
-option if you don't plan to use SFrame stack tracer.
+@item --enable-sframe
+Experimental option supported by some architectures, where @theglibc{}i
+is built with @option{-Wa,--gsframe} if the @code{binutils} supports it.
+Currently it is only support on x86_64 and aarch64 it is required te
+enable SFrame support on @code{backtrace} and @code{_dl_find_object}.
+
+Default is to disable SFrame support.
@end table
To build the library and related programs, type @code{make}. This will
diff --git a/sysdeps/aarch64/configure b/sysdeps/aarch64/configure
index 26a0989a33..f364e65fe7 100755
--- a/sysdeps/aarch64/configure
+++ b/sysdeps/aarch64/configure
@@ -194,3 +194,5 @@ if test $build_mathvec = no; then
printf "%s\n" "$as_me: WARNING: mathvec is disabled, this results in incomplete ABI." >&2;}
fi
+libc_cv_support_sframe=yes
+
diff --git a/sysdeps/aarch64/configure.ac b/sysdeps/aarch64/configure.ac
index 22fca8b565..a9a1b747f1 100644
--- a/sysdeps/aarch64/configure.ac
+++ b/sysdeps/aarch64/configure.ac
@@ -31,3 +31,5 @@ fi
if test $build_mathvec = no; then
AC_MSG_WARN([mathvec is disabled, this results in incomplete ABI.])
fi
+
+libc_cv_support_sframe=yes
diff --git a/sysdeps/generic/Makefile b/sysdeps/generic/Makefile
index c48e713eb3..1be63b74ce 100644
--- a/sysdeps/generic/Makefile
+++ b/sysdeps/generic/Makefile
@@ -21,7 +21,9 @@ CFLAGS-wordcopy.c += -Wno-uninitialized
endif
ifeq ($(subdir),elf)
+ifeq ($(enable-gsframe),yes)
sysdep_routines += sframe-read sframe
+endif
ifeq (yes:yes,$(build-shared):$(unwind-find-fde))
# This is needed to support g++ v2 and v3.
sysdep_routines += framestate unwind-pe
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index de146dddeb..7572f62cc0 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -62,7 +62,6 @@ tests += \
tst-abstime \
tst-atfork1 \
tst-attr1 \
- tst-backtrace1 \
tst-bad-schedattr \
tst-barrier1 \
tst-barrier2 \
diff --git a/sysdeps/x86_64/configure b/sysdeps/x86_64/configure
index bbf520bfc9..32324f62da 100644
--- a/sysdeps/x86_64/configure
+++ b/sysdeps/x86_64/configure
@@ -289,6 +289,8 @@ fi
config_vars="$config_vars
have-x86-apx = $libc_cv_x86_have_apx"
+libc_cv_support_sframe=yes
+
test -n "$critic_missing" && as_fn_error $? "
*** $critic_missing" "$LINENO" 5
diff --git a/sysdeps/x86_64/configure.ac b/sysdeps/x86_64/configure.ac
index 4a3f7f4541..a00958e219 100644
--- a/sysdeps/x86_64/configure.ac
+++ b/sysdeps/x86_64/configure.ac
@@ -104,5 +104,7 @@ if test $libc_cv_x86_have_apx = yes; then
fi
LIBC_CONFIG_VAR([have-x86-apx], [$libc_cv_x86_have_apx])
+libc_cv_support_sframe=yes
+
test -n "$critic_missing" && AC_MSG_ERROR([
*** $critic_missing])
--
2.43.0
More information about the Libc-alpha
mailing list