cet.m4 revision 1.1.1.3
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([ 133int 134main () 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([ 145static void 146foo (void) 147{ 148} 149 150static void 151__attribute__ ((noinline, noclone)) 152xxx (void (*f) (void)) 153{ 154 f (); 155} 156 157static void 158__attribute__ ((noinline, noclone)) 159bar (void) 160{ 161 xxx (foo); 162} 163 164int 165main () 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 178else 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 182fi 183if test x$enable_cet = xyes; then 184 $1="-fcf-protection" 185 AC_MSG_RESULT([yes]) 186else 187 AC_MSG_RESULT([no]) 188fi 189CFLAGS="$cet_save_CFLAGS" 190LDFLAGS="$cet_save_LDFLAGS" 191]) 192