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