X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=config%2Fcet.m4;h=2bb2c8a95ac1b59f83ef6376f7de7b90b077e342;hb=56770bdab2585be4d3171b3512d2167106dca53e;hp=b53c1bbd5cdef2d3241c192fe01b0ce02af9edcf;hpb=37f980dc03cc85795ea2e4de4ca69d3d7d1153c7;p=deliverable%2Fbinutils-gdb.git diff --git a/config/cet.m4 b/config/cet.m4 index b53c1bbd5c..2bb2c8a95a 100644 --- a/config/cet.m4 +++ b/config/cet.m4 @@ -3,7 +3,7 @@ dnl GCC_CET_FLAGS dnl (SHELL-CODE_HANDLER) dnl AC_DEFUN([GCC_CET_FLAGS],[dnl -GCC_ENABLE(cet, no, ,[enable Intel CET in target libraries], +GCC_ENABLE(cet, auto, ,[enable Intel CET in target libraries], permit yes|no|auto) AC_MSG_CHECKING([for CET support]) @@ -13,6 +13,8 @@ case "$host" in auto) # Check if target supports multi-byte NOPs # and if assembler supports CET insn. + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fcf-protection" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [], @@ -25,6 +27,7 @@ asm ("setssbsy"); ])], [enable_cet=yes], [enable_cet=no]) + CFLAGS="$save_CFLAGS" ;; yes) # Check if assembler supports CET. @@ -48,3 +51,114 @@ else AC_MSG_RESULT([no]) fi ]) + +dnl +dnl GCC_CET_HOST_FLAGS +dnl (SHELL-CODE_HANDLER) +dnl +AC_DEFUN([GCC_CET_HOST_FLAGS],[dnl +GCC_ENABLE(cet, auto, ,[enable Intel CET in host libraries], + permit yes|no|auto) +AC_MSG_CHECKING([for CET support]) + +case "$host" in + i[[34567]]86-*-linux* | x86_64-*-linux*) + may_have_cet=yes + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fcf-protection" + case "$enable_cet" in + auto) + # Check if target supports multi-byte NOPs + # and if assembler supports CET insn. + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [], + [ +#if !defined(__SSE2__) +#error target does not support multi-byte NOPs +#else +asm ("setssbsy"); +#endif + ])], + [enable_cet=yes], + [enable_cet=no]) + ;; + yes) + # Check if assembler supports CET. + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [], + [asm ("setssbsy");])], + [], + [AC_MSG_ERROR([assembler with CET support is required for --enable-cet])]) + ;; + esac + CFLAGS="$save_CFLAGS" + ;; + *) + may_have_cet=no + enable_cet=no + ;; +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 + if test x$cross_compiling = xno; then + AC_TRY_RUN([ +static void +foo (void) +{ +} + +static void +__attribute__ ((noinline, noclone)) +xxx (void (*f) (void)) +{ + f (); +} + +static void +__attribute__ ((noinline, noclone)) +bar (void) +{ + xxx (foo); +} + +int +main () +{ + bar (); + return 0; +} + ], + [have_cet=no], + [have_cet=yes]) + 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 + fi +else + # Enable CET in cross compiler if possible so that it will run on both + # CET and non-CET hosts. + have_cet=yes +fi +if test x$enable_cet = xyes; then + $1="-fcf-protection" + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi +CFLAGS="$save_CFLAGS" +LDFLAGS="$save_LDFLAGS" +])