libbacktrace: Enable Intel CET on Intel CET enabled host for jit

Since on Intel CET enabled host, dlopen in Intel CET enabled applications
fails on shared libraries which aren't Intel CET enabled, compile with
-fcf-protection on Intel CET enabled host when jit is enabled to enable
Intel CET on libgccjit.

	* Makefile.am (AM_CFLAGS): Add $(CET_HOST_FLAGS).
	* configure.ac: Add GCC_CET_HOST_FLAGS(CET_HOST_FLAGS) and
	AC_SUBST(CET_HOST_FLAGS).  Clear CET_HOST_FLAGS if jit isn't
	enabled.
	* Makefile.in: Regenerated.
	* configure: Likewise.
This commit is contained in:
H.J. Lu 2020-05-12 09:23:56 -07:00
parent b3d16040fe
commit d214864835
5 changed files with 201 additions and 4 deletions

View File

@ -1,3 +1,11 @@
* Makefile.am (AM_CFLAGS): Add $(CET_HOST_FLAGS).
* configure.ac: Add GCC_CET_HOST_FLAGS(CET_HOST_FLAGS) and
AC_SUBST(CET_HOST_FLAGS). Clear CET_HOST_FLAGS if jit isn't
enabled.
* Makefile.in: Regenerated.
* configure: Likewise.
2020-05-11 Ian Lance Taylor <iant@golang.org>
PR libbacktrace/95012

View File

@ -34,7 +34,7 @@ ACLOCAL_AMFLAGS = -I .. -I ../config
AM_CPPFLAGS = -I $(top_srcdir)/../include -I $(top_srcdir)/../libgcc \
-I ../libgcc
AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG) $(CET_HOST_FLAGS)
noinst_LTLIBRARIES = libbacktrace.la

View File

@ -783,6 +783,7 @@ BACKTRACE_SUPPORTS_DATA = @BACKTRACE_SUPPORTS_DATA@
BACKTRACE_SUPPORTS_THREADS = @BACKTRACE_SUPPORTS_THREADS@
BACKTRACE_USES_MALLOC = @BACKTRACE_USES_MALLOC@
CC = @CC@
CET_HOST_FLAGS = @CET_HOST_FLAGS@
CFLAGS = @CFLAGS@
CLOCK_GETTIME_LINK = @CLOCK_GETTIME_LINK@
CPP = @CPP@
@ -902,7 +903,7 @@ ACLOCAL_AMFLAGS = -I .. -I ../config
AM_CPPFLAGS = -I $(top_srcdir)/../include -I $(top_srcdir)/../libgcc \
-I ../libgcc
AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG) $(CET_HOST_FLAGS)
noinst_LTLIBRARIES = libbacktrace.la
libbacktrace_la_SOURCES = \
backtrace.h \

181
libbacktrace/configure vendored
View File

@ -660,6 +660,7 @@ HAVE_ELF_FALSE
HAVE_ELF_TRUE
FORMAT_FILE
BACKTRACE_SUPPORTS_THREADS
CET_HOST_FLAGS
PIC_FLAG
WARN_FLAGS
EXTRA_FLAGS
@ -1437,6 +1438,7 @@ Optional Features:
--disable-largefile omit support for large files
--enable-cet enable Intel CET in target libraries [default=no]
--enable-host-shared build host code as shared libraries
--enable-cet enable Intel CET in host libraries [default=auto]
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@ -11503,7 +11505,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 11506 "configure"
#line 11508 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -11609,7 +11611,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 11612 "configure"
#line 11614 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -12378,6 +12380,181 @@ fi
# Enable Intel CET on Intel CET enabled host if jit is enabled.
# Check whether --enable-cet was given.
if test "${enable_cet+set}" = set; then :
enableval=$enable_cet;
case "$enableval" in
yes|no|auto) ;;
*) as_fn_error $? "Unknown argument to enable/disable cet" "$LINENO" 5 ;;
esac
else
enable_cet=auto
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CET support" >&5
$as_echo_n "checking for CET support... " >&6; }
case "$host" in
i[34567]86-*-linux* | x86_64-*-linux*)
may_have_cet=yes
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fcf-protection"
case "$enable_cet" in
auto)
# Check if target supports multi-byte NOPs
# and if assembler supports CET insn.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
#if !defined(__SSE2__)
#error target does not support multi-byte NOPs
#else
asm ("setssbsy");
#endif
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
enable_cet=yes
else
enable_cet=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;;
yes)
# Check if assembler supports CET.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
asm ("setssbsy");
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
else
as_fn_error $? "assembler with CET support is required for --enable-cet" "$LINENO" 5
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;;
esac
CFLAGS="$save_CFLAGS"
;;
*)
may_have_cet=no
enable_cet=no
;;
esac
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fcf-protection=none"
save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk"
if test x$may_have_cet = xyes; then
# Check whether -fcf-protection=none -Wl,-z,ibt,-z,shstk work.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
may_have_cet=yes
else
may_have_cet=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi
if test x$may_have_cet = xyes; then
if test "$cross_compiling" = yes; then :
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
static void
foo (void)
{
}
static void
__attribute__ ((noinline, noclone))
xxx (void (*f) (void))
{
f ();
}
static void
__attribute__ ((noinline, noclone))
bar (void)
{
xxx (foo);
}
int
main ()
{
bar ();
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
have_cet=no
else
have_cet=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
if test x$enable_cet = xno -a x$have_cet = xyes; then
as_fn_error $? "Intel CET must be enabled on Intel CET enabled host" "$LINENO" 5
fi
fi
if test x$enable_cet = xyes; then
CET_HOST_FLAGS="-fcf-protection"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
CFLAGS="$save_CFLAGS"
LDFLAGS="$save_LDFLAGS"
case x$enable_languages in
*jit*)
;;
*)
CET_HOST_FLAGS=
;;
esac
# Test for __sync support.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking __sync extensions" >&5
$as_echo_n "checking __sync extensions... " >&6; }

View File

@ -178,6 +178,17 @@ AC_ARG_ENABLE(host-shared,
[PIC_FLAG=-fPIC], [PIC_FLAG=])
AC_SUBST(PIC_FLAG)
# Enable Intel CET on Intel CET enabled host if jit is enabled.
GCC_CET_HOST_FLAGS(CET_HOST_FLAGS)
case x$enable_languages in
*jit*)
;;
*)
CET_HOST_FLAGS=
;;
esac
AC_SUBST(CET_HOST_FLAGS)
# Test for __sync support.
AC_CACHE_CHECK([__sync extensions],
[libbacktrace_cv_sys_sync],