Home | History | Annotate | Line # | Download | only in config
      1 dnl
      2 dnl GCC_CET_FLAGS
      3 dnl    (SHELL-CODE_HANDLER)
      4 dnl
      5 AC_DEFUN([GCC_CET_FLAGS],[dnl
      6 GCC_ENABLE(cet, auto, ,[enable Intel CET in target libraries],
      7 	   permit yes|no|auto)
      8 AC_MSG_CHECKING([for CET support])
      9 
     10 # NB: Avoid nested save_CFLAGS and save_LDFLAGS.
     11 case "$host" in
     12   i[[34567]]86-*-linux* | x86_64-*-linux*)
     13     case "$enable_cet" in
     14       auto)
     15 	# Check if target supports multi-byte NOPs
     16 	# and if compiler and assembler support CET insn.
     17 	cet_save_CFLAGS="$CFLAGS"
     18 	CFLAGS="$CFLAGS -fcf-protection"
     19 	AC_COMPILE_IFELSE(
     20 	 [AC_LANG_PROGRAM(
     21 	  [],
     22 	  [
     23 #if !defined(__SSE2__)
     24 #error target does not support multi-byte NOPs
     25 #else
     26 asm ("setssbsy");
     27 #endif
     28 	  ])],
     29 	 [enable_cet=yes],
     30 	 [enable_cet=no])
     31 	CFLAGS="$cet_save_CFLAGS"
     32 	;;
     33       yes)
     34 	# Check if assembler supports CET.
     35 	AC_COMPILE_IFELSE(
     36 	 [AC_LANG_PROGRAM(
     37 	  [],
     38 	  [asm ("setssbsy");])],
     39 	 [],
     40 	 [AC_MSG_ERROR([assembler with CET support is required for --enable-cet])])
     41 	;;
     42     esac
     43     ;;
     44   *)
     45     enable_cet=no
     46     ;;
     47 esac
     48 if test x$enable_cet = xyes; then
     49   $1="-fcf-protection -mshstk"
     50   AC_MSG_RESULT([yes])
     51 else
     52   AC_MSG_RESULT([no])
     53 fi
     54 ])
     55 
     56 dnl
     57 dnl GCC_CET_HOST_FLAGS
     58 dnl    (SHELL-CODE_HANDLER)
     59 dnl
     60 AC_DEFUN([GCC_CET_HOST_FLAGS],[dnl
     61 GCC_ENABLE(cet, auto, ,[enable Intel CET in host libraries],
     62 	   permit yes|no|auto)
     63 AC_MSG_CHECKING([for CET support])
     64 
     65 case "$host" in
     66   i[[34567]]86-*-linux* | x86_64-*-linux*)
     67     may_have_cet=yes
     68     cet_save_CFLAGS="$CFLAGS"
     69     CFLAGS="$CFLAGS -fcf-protection"
     70     case "$enable_cet" in
     71       auto)
     72 	# Check if target supports multi-byte NOPs
     73 	# and if compiler and assembler support CET.
     74 	AC_COMPILE_IFELSE(
     75 	 [AC_LANG_PROGRAM(
     76 	  [],
     77 	  [
     78 #if !defined(__SSE2__)
     79 #error target does not support multi-byte NOPs
     80 #else
     81 asm ("setssbsy");
     82 #endif
     83 	  ])],
     84 	 [enable_cet=yes],
     85 	 [enable_cet=no])
     86 	;;
     87       yes)
     88 	# Check if compiler and assembler support CET.
     89 	AC_COMPILE_IFELSE(
     90 	 [AC_LANG_PROGRAM(
     91 	  [],
     92 	  [asm ("setssbsy");])],
     93 	 [support_cet=yes],
     94 	 [support_cet=no])
     95 	if test $support_cet = "no"; then
     96 	  if test x$enable_bootstrap != xno \
     97 	     && test -z "${with_build_subdir}" \
     98 	     && (test ! -f ../stage_current \
     99 	         || test `cat ../stage_current` != "stage1"); then
    100 	    # Require CET support only for the final GCC build.
    101 	    AC_MSG_ERROR([compiler and assembler with CET support are required for --enable-cet])
    102 	  else
    103 	    # Don't enable CET without CET support for non-bootstrap
    104 	    # build, in stage1 nor for build support.
    105 	    enable_cet=no
    106 	  fi
    107 	fi
    108 	;;
    109     esac
    110     CFLAGS="$cet_save_CFLAGS"
    111     ;;
    112   *)
    113     may_have_cet=no
    114     enable_cet=no
    115     ;;
    116 esac
    117 
    118 cet_save_CFLAGS="$CFLAGS"
    119 CFLAGS="$CFLAGS -fcf-protection=none"
    120 cet_save_LDFLAGS="$LDFLAGS"
    121 LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk"
    122 if test x$may_have_cet = xyes; then
    123   # Check whether -fcf-protection=none -Wl,-z,ibt,-z,shstk work.
    124   AC_TRY_LINK(
    125     [],[return 0;],
    126     [may_have_cet=yes],
    127     [may_have_cet=no])
    128 fi
    129 
    130 if test x$may_have_cet = xyes; then
    131   if test x$cross_compiling = xno; then
    132     AC_TRY_RUN([
    133 int
    134 main ()
    135 {
    136   asm ("endbr32");
    137   return 0;
    138 }
    139     ],
    140     [have_multi_byte_nop=yes],
    141     [have_multi_byte_nop=no])
    142     have_cet=no
    143     if test x$have_multi_byte_nop = xyes; then
    144       AC_TRY_RUN([
    145 static void
    146 foo (void)
    147 {
    148 }
    149 
    150 static void
    151 __attribute__ ((noinline, noclone))
    152 xxx (void (*f) (void))
    153 {
    154   f ();
    155 }
    156 
    157 static void
    158 __attribute__ ((noinline, noclone))
    159 bar (void)
    160 {
    161   xxx (foo);
    162 }
    163 
    164 int
    165 main ()
    166 {
    167   bar ();
    168   return 0;
    169 }
    170       ],
    171       [have_cet=no],
    172       [have_cet=yes])
    173     fi
    174     if test x$enable_cet = xno -a x$have_cet = xyes; then
    175       AC_MSG_ERROR([Intel CET must be enabled on Intel CET enabled host])
    176     fi
    177   fi
    178 else
    179   # Enable CET in cross compiler if possible so that it will run on both
    180   # CET and non-CET hosts.
    181   have_cet=yes
    182 fi
    183 if test x$enable_cet = xyes; then
    184   $1="-fcf-protection"
    185   AC_MSG_RESULT([yes])
    186 else
    187   AC_MSG_RESULT([no])
    188 fi
    189 CFLAGS="$cet_save_CFLAGS"
    190 LDFLAGS="$cet_save_LDFLAGS"
    191 ])
    192