On Mon, Apr 27, 2020 at 8:13 PM H.J. Lu via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> GCC_CET_HOST_FLAGS uses -Wl,-z,ibt,-z,shstk to check if Linux/x86 host
> has Intel CET enabled by introducing an Intel CET violation on purpose.
> To avoid false positive, check whether -Wl,-z,ibt,-z,shstk works first.
> -fcf-protection=none is added to avoid false negative when -fcf-protection
> is enabled by default.
>
> OK for master?

OK.

> H.J.
> ---
> config/
>
>         PR bootstrap/94739
>         * cet.m4 (GCC_CET_HOST_FLAGS): Add -fcf-protection=none to
>         -Wl,-z,ibt,-z,shstk.  Check whether -fcf-protection=none
>         -Wl,-z,ibt,-z,shstk works first.
>
> libiberty/
>
>         PR bootstrap/94739
>         * configure: Regenerated.
>
> lto-plugin/
>
>         PR bootstrap/94739
>         * configure: Regenerated.
> ---
>  config/cet.m4        |  17 ++++--
>  libiberty/configure  | 126 ++++++++++++++++++++++++++-----------------
>  lto-plugin/configure |  35 ++++++++++--
>  3 files changed, 121 insertions(+), 57 deletions(-)
>
> diff --git a/config/cet.m4 b/config/cet.m4
> index 8b9e01fd492..ea616b728a9 100644
> --- a/config/cet.m4
> +++ b/config/cet.m4
> @@ -98,9 +98,19 @@ asm ("setssbsy");
>      ;;
>  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.
> +  AC_TRY_LINK(
> +    [],[return 0;],
> +    [may_have_cet=yes],
> +    [may_have_cet=no])
> +fi
> +
>  if test x$may_have_cet = xyes; then
> -  save_LDFLAGS="$LDFLAGS"
> -  LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk"
>    AC_TRY_RUN([
>  static void
>  foo (void)
> @@ -130,7 +140,6 @@ main ()
>    ],
>    [have_cet=no],
>    [have_cet=yes])
> -  LDFLAGS="$save_LDFLAGS"
>    if test x$enable_cet = xno -a x$have_cet = xyes; then
>      AC_MSG_ERROR([Intel CET must be enabled on Intel CET enabled host])
>    fi
> @@ -141,4 +150,6 @@ if test x$enable_cet = xyes; then
>  else
>    AC_MSG_RESULT([no])
>  fi
> +CFLAGS="$save_CFLAGS"
> +LDFLAGS="$save_LDFLAGS"
>  ])
> diff --git a/libiberty/configure b/libiberty/configure
> index 2b52ce86c89..bb76cf1b823 100755
> --- a/libiberty/configure
> +++ b/libiberty/configure
> @@ -1674,6 +1674,52 @@ $as_echo "$ac_res" >&6; }
>
>  } # ac_fn_c_check_header_compile
>
> +# ac_fn_c_try_link LINENO
> +# -----------------------
> +# Try to link conftest.$ac_ext, and return whether this succeeded.
> +ac_fn_c_try_link ()
> +{
> +  as_lineno=${as_lineno-"$1"} 
> as_lineno_stack=as_lineno_stack=$as_lineno_stack
> +  rm -f conftest.$ac_objext conftest$ac_exeext
> +  if { { ac_try="$ac_link"
> +case "(($ac_try" in
> +  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
> +  *) ac_try_echo=$ac_try;;
> +esac
> +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
> +$as_echo "$ac_try_echo"; } >&5
> +  (eval "$ac_link") 2>conftest.err
> +  ac_status=$?
> +  if test -s conftest.err; then
> +    grep -v '^ *+' conftest.err >conftest.er1
> +    cat conftest.er1 >&5
> +    mv -f conftest.er1 conftest.err
> +  fi
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; } && {
> +        test -z "$ac_c_werror_flag" ||
> +        test ! -s conftest.err
> +       } && test -s conftest$ac_exeext && {
> +        test "$cross_compiling" = yes ||
> +        test -x conftest$ac_exeext
> +       }; then :
> +  ac_retval=0
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +       ac_retval=1
> +fi
> +  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
> +  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
> +  # interfere with the next link command; also delete a directory that is
> +  # left behind by Apple's compiler.  We do this before executing the 
> actions.
> +  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> +  as_fn_set_status $ac_retval
> +
> +} # ac_fn_c_try_link
> +
>  # ac_fn_c_check_header_preproc LINENO HEADER VAR
>  # ----------------------------------------------
>  # Tests whether HEADER is present, setting the cache variable VAR 
> accordingly.
> @@ -1940,52 +1986,6 @@ $as_echo "$ac_res" >&6; }
>
>  } # ac_fn_c_check_type
>
> -# ac_fn_c_try_link LINENO
> -# -----------------------
> -# Try to link conftest.$ac_ext, and return whether this succeeded.
> -ac_fn_c_try_link ()
> -{
> -  as_lineno=${as_lineno-"$1"} 
> as_lineno_stack=as_lineno_stack=$as_lineno_stack
> -  rm -f conftest.$ac_objext conftest$ac_exeext
> -  if { { ac_try="$ac_link"
> -case "(($ac_try" in
> -  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
> -  *) ac_try_echo=$ac_try;;
> -esac
> -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
> -$as_echo "$ac_try_echo"; } >&5
> -  (eval "$ac_link") 2>conftest.err
> -  ac_status=$?
> -  if test -s conftest.err; then
> -    grep -v '^ *+' conftest.err >conftest.er1
> -    cat conftest.er1 >&5
> -    mv -f conftest.er1 conftest.err
> -  fi
> -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> -  test $ac_status = 0; } && {
> -        test -z "$ac_c_werror_flag" ||
> -        test ! -s conftest.err
> -       } && test -s conftest$ac_exeext && {
> -        test "$cross_compiling" = yes ||
> -        test -x conftest$ac_exeext
> -       }; then :
> -  ac_retval=0
> -else
> -  $as_echo "$as_me: failed program was:" >&5
> -sed 's/^/| /' conftest.$ac_ext >&5
> -
> -       ac_retval=1
> -fi
> -  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
> -  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
> -  # interfere with the next link command; also delete a directory that is
> -  # left behind by Apple's compiler.  We do this before executing the 
> actions.
> -  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
> -  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> -  as_fn_set_status $ac_retval
> -
> -} # ac_fn_c_try_link
> -
>  # ac_fn_c_check_func LINENO FUNC VAR
>  # ----------------------------------
>  # Tests whether FUNC exists, setting the cache variable VAR accordingly
> @@ -5345,9 +5345,36 @@ rm -f core conftest.err conftest.$ac_objext 
> conftest.$ac_ext
>      ;;
>  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.
> +  if test x$gcc_no_link = xyes; then
> +  as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." 
> "$LINENO" 5
> +fi
> +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
> -  save_LDFLAGS="$LDFLAGS"
> -  LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk"
>    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;}
> @@ -5393,7 +5420,6 @@ rm -f core *.core core.conftest.* gmon.out bb.out 
> conftest$ac_exeext \
>    conftest.$ac_objext conftest.beam conftest.$ac_ext
>  fi
>
> -  LDFLAGS="$save_LDFLAGS"
>    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
> @@ -5406,6 +5432,8 @@ else
>    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
>  $as_echo "no" >&6; }
>  fi
> +CFLAGS="$save_CFLAGS"
> +LDFLAGS="$save_LDFLAGS"
>
>
>
> diff --git a/lto-plugin/configure b/lto-plugin/configure
> index e55b35ecf38..1baf6cc70b8 100755
> --- a/lto-plugin/configure
> +++ b/lto-plugin/configure
> @@ -5741,9 +5741,33 @@ rm -f core conftest.err conftest.$ac_objext 
> conftest.$ac_ext
>      ;;
>  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
> -  save_LDFLAGS="$LDFLAGS"
> -  LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk"
>    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;}
> @@ -5789,7 +5813,6 @@ rm -f core *.core core.conftest.* gmon.out bb.out 
> conftest$ac_exeext \
>    conftest.$ac_objext conftest.beam conftest.$ac_ext
>  fi
>
> -  LDFLAGS="$save_LDFLAGS"
>    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
> @@ -5802,6 +5825,8 @@ else
>    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
>  $as_echo "no" >&6; }
>  fi
> +CFLAGS="$save_CFLAGS"
> +LDFLAGS="$save_LDFLAGS"
>
>
>
> @@ -11916,7 +11941,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 11919 "configure"
> +#line 11944 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -12022,7 +12047,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 12025 "configure"
> +#line 12050 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> --
> 2.25.4
>

Reply via email to