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. This option also enables SFrame support for
+ backtrace.
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'
glibc.malloc.tcache_max to a larger value (max 4194304).
Tcache is also significantly faster for small sizes.
-* New stack tracer using SFrame. Introducing --disable-sframe a new
- configuration flag. Building glibc using sframe is automatically
- enabled when the build system supports it.
+* A new configure option, "--eanble-sframe", can be used to enable
+ the SFrame support on the GNU C Libraries. The SFrame is a new
+ stack trace information which can be used by backtrace. It requires
+ binutils with minimum version of 2.45.
Deprecated and removed features, and other changes affecting compatibility:
NM=`$CC -print-prog-name=nm`
fi
AC_SUBST(NM)
+if test -z "$STRIP"; then
+ STRIP=`$CC -print-prog-name=strip`
+fi
+AC_SUBST(STRIP)
])
dnl Run a static link test with -nostdlib -nostartfiles.
/* 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
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@
OBJCOPY = @OBJCOPY@
GPROF = @GPROF@
READELF = @READELF@
+STRIP = @STRIP@
# Installation tools.
INSTALL = @INSTALL@
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
MSGFMT
MAKE
LD
+STRIP
NM
OBJDUMP
READELF
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 support [default=no]
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
then :
enableval=$enable_sframe; use_sframe=$enableval
else case e in #(
- e) use_sframe=notset ;;
+ e) use_sframe=no ;;
esac
fi
NM=`$CC -print-prog-name=nm`
fi
+if test -z "$STRIP"; then
+ STRIP=`$CC -print-prog-name=strip`
+fi
+
# Accept binutils 2.39 or newer.
-# Glibc stacktracer supports SFrame v2 or newer
-libc_cv_readelf_version_ok=yes
-# SFrame is supported from 2.41 or higher
-for ac_prog in $READELF
+enable_gsframe=no
+if test $use_sframe = yes; then
+ # SFrame requires to be explicit enabled by the architecture
+ if 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; }
+ fi
+
+ # SFrame requires binutils 2.45 or higher.
+ libc_cv_sframe_readelf_version=yes
+ for ac_prog in $READELF
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
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
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
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]*|2.[1-9][0-9][0-9]*|[3-9]*|[1-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;;
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
+ if test $libc_cv_sframe_readelf_version == no; 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 $? "binutils too old to enable SFrame
+See 'config.log' for more details" "$LINENO" 5; }
+ fi
-# Check the current toolchain for SFrame support
-if test $libc_cv_readelf_version_ok = yes; then
+ # Check if the current toolchain supports SFrame
{ 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}
return 42;
}
EOF
- libc_cv_default_sframe=no
- if ${CC} -c conftest.c -o conftest.o -Wa,--gsframe >/dev/null 2>&1 && \
- # Check if .sframe section is present and if version > 1
- $READELF --sframe conftest.o | grep "SFRAME_VER" | grep -qv "VERSION_1"; then
- libc_cv_default_sframe=yes
- fi
- rm -f conftest.c conftest.o
+ libc_cv_default_sframe=no
+ if ${CC} -c conftest.c -o conftest.o -Wa,--gsframe >/dev/null 2>&1 && \
+ # Check if .sframe section is present and if version > 1
+ $READELF --sframe conftest.o | grep "SFRAME_VER" | grep -qv "VERSION_1"; then
+ libc_cv_default_sframe=yes
+ fi
+ rm -f conftest.c conftest.o
;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_default_sframe" >&5
printf "%s\n" "$libc_cv_default_sframe" >&6; }
-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
-elif test $use_sframe = yes; then
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+ if test $libc_cv_default_sframe == no; 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
+ fi
+
+ enable_gsframe=yes
+ printf "%s\n" "#define ENABLE_SFRAME 1" >>confdefs.h
+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.
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 support @<:@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
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
-# SFrame is supported from 2.41 or higher
-AC_CHECK_PROG_VER(READELF_SFRAME, $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)
+enable_gsframe=no
+if test $use_sframe = yes; then
+ # SFrame requires to be explicit enabled by the architecture
+ if test -z $libc_cv_support_sframe; then
+ AC_MSG_FAILURE([the architecture doesn't support SFrame])
+ fi
-# Check the current toolchain for SFrame support
-if test $libc_cv_readelf_version_ok = yes; then
+ # SFrame requires binutils 2.45 or higher.
+ libc_cv_sframe_readelf_version=yes
+ AC_CHECK_PROG_VER(READELF, $READELF, --version,
+ [GNU readelf.* \([0-9][0-9]*\.[0-9.]*\)],
+ [2.4[5-9]*|2.[5-9][0-9]*|2.[1-9][0-9][0-9]*|[3-9]*|[1-9][0-9]*],
+ libc_cv_sframe_readelf_version=no)
+ if test $libc_cv_sframe_readelf_version == no; then
+ AC_MSG_FAILURE([binutils too old to enable SFrame])
+ fi
+
+ # Check if the current toolchain supports SFrame
AC_CACHE_CHECK([for SFrame support], libc_cv_default_sframe,
[dnl
cat > conftest.c <<EOF
return 42;
}
EOF
- libc_cv_default_sframe=no
- if ${CC} -c conftest.c -o conftest.o -Wa,--gsframe >/dev/null 2>&1 && \
- # Check if .sframe section is present and if version > 1
- $READELF --sframe conftest.o | grep "SFRAME_VER" | grep -qv "VERSION_1"; then
- libc_cv_default_sframe=yes
- fi
- rm -f conftest.c conftest.o
+ libc_cv_default_sframe=no
+ if ${CC} -c conftest.c -o conftest.o -Wa,--gsframe >/dev/null 2>&1 && \
+ # Check if .sframe section is present and if version > 1
+ $READELF --sframe conftest.o | grep "SFRAME_VER" | grep -qv "VERSION_1"; then
+ libc_cv_default_sframe=yes
+ fi
+ rm -f conftest.c conftest.o
])
-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
+ if test $libc_cv_default_sframe == no; then
+ AC_MSG_FAILURE([toolchain doesn't support SFrame v2 or higher])
+ fi
+
enable_gsframe=yes
-elif test $use_sframe = yes; then
- AC_MSG_FAILURE([toolchain doesn't support SFrame v2 or higher])
+ AC_DEFINE(ENABLE_SFRAME)
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.
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))
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))))
backtrace-tst \
test-stpcpy_chk \
test-strcpy_chk \
+ tst-backtrace1 \
tst-backtrace2 \
tst-backtrace3 \
tst-backtrace4 \
#include <stdlib.h>
#include <unwind.h>
#include <unwind-link.h>
+#if ENABLE_SFRAME
#include <sframe.h>
+#endif
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
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)
if (size <= 0)
return 0;
+#if ENABLE_SFRAME
/* Try first the SFrame backtracer. */
int cnt = do_sframe_backtrace (array, size);
if (cnt > 1)
return cnt;
+#endif
/* Try the dwarf unwinder. */
if (arg.unwind_link == NULL)
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{}
+is built with @option{-Wa,--gsframe} if @code{binutils} supports it.
+Currently this is only supported on x86_64 and aarch64. The option
+enables SFrame support on @code{backtrace}.
+
+Default is to disable SFrame support.
@end table
To build the library and related programs, type @code{make}. This will
printf "%s\n" "$as_me: WARNING: mathvec is disabled, this results in incomplete ABI." >&2;}
fi
+libc_cv_support_sframe=yes
+
if test $build_mathvec = no; then
AC_MSG_WARN([mathvec is disabled, this results in incomplete ABI.])
fi
+
+libc_cv_support_sframe=yes
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
tst-abstime \
tst-atfork1 \
tst-attr1 \
- tst-backtrace1 \
tst-bad-schedattr \
tst-barrier1 \
tst-barrier2 \
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
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])