1dnl 2dnl GCC_CET_FLAGS 3dnl (SHELL-CODE_HANDLER) 4dnl 5AC_DEFUN([GCC_CET_FLAGS],[dnl 6GCC_ENABLE(cet, auto, ,[enable Intel CET in target libraries], 7 permit yes|no|auto) 8AC_MSG_CHECKING([for CET support]) 9 10# NB: Avoid nested save_CFLAGS and save_LDFLAGS. 11case "$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 26asm ("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 ;; 47esac 48if test x$enable_cet = xyes; then 49 $1="-fcf-protection -mshstk" 50 AC_MSG_RESULT([yes]) 51else 52 AC_MSG_RESULT([no]) 53fi 54]) 55 56dnl 57dnl GCC_CET_HOST_FLAGS 58dnl (SHELL-CODE_HANDLER) 59dnl 60AC_DEFUN([GCC_CET_HOST_FLAGS],[dnl 61GCC_ENABLE(cet, auto, ,[enable Intel CET in host libraries], 62 permit yes|no|auto) 63AC_MSG_CHECKING([for CET support]) 64 65case "$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 81asm ("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 ;; 116esac 117 118cet_save_CFLAGS="$CFLAGS" 119CFLAGS="$CFLAGS -fcf-protection=none" 120cet_save_LDFLAGS="$LDFLAGS" 121LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk" 122if 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]) 128fi 129 130if test x$may_have_cet = xyes; then 131 if test x$cross_compiling = xno; then 132 AC_TRY_RUN([ 133static void 134foo (void) 135{ 136} 137 138static void 139__attribute__ ((noinline, noclone)) 140xxx (void (*f) (void)) 141{ 142 f (); 143} 144 145static void 146__attribute__ ((noinline, noclone)) 147bar (void) 148{ 149 xxx (foo); 150} 151 152int 153main () 154{ 155 bar (); 156 return 0; 157} 158 ], 159 [have_cet=no], 160 [have_cet=yes]) 161 if test x$enable_cet = xno -a x$have_cet = xyes; then 162 AC_MSG_ERROR([Intel CET must be enabled on Intel CET enabled host]) 163 fi 164 fi 165else 166 # Enable CET in cross compiler if possible so that it will run on both 167 # CET and non-CET hosts. 168 have_cet=yes 169fi 170if test x$enable_cet = xyes; then 171 $1="-fcf-protection" 172 AC_MSG_RESULT([yes]) 173else 174 AC_MSG_RESULT([no]) 175fi 176CFLAGS="$cet_save_CFLAGS" 177LDFLAGS="$cet_save_LDFLAGS" 178]) 179