diff options
author | Igor Tsimbalist <igor.v.tsimbalist@intel.com> | 2017-11-17 14:34:39 +0100 |
---|---|---|
committer | Igor Tsimbalist <itsimbal@gcc.gnu.org> | 2017-11-17 14:34:39 +0100 |
commit | 1ecae1fc238a6b02b3cc2de6a24d73966bc45a03 (patch) | |
tree | daa0015bf7667568564bbd9abcd7fbe77ef2942f /libgcc | |
parent | a851ce04f7050dd82aa8344e7b68ee8319fb7b6f (diff) | |
download | gcc-1ecae1fc238a6b02b3cc2de6a24d73966bc45a03.zip gcc-1ecae1fc238a6b02b3cc2de6a24d73966bc45a03.tar.gz gcc-1ecae1fc238a6b02b3cc2de6a24d73966bc45a03.tar.bz2 |
Enable building libgcc with CET options.
Enable building libgcc with CET options by default on Linux/x86 if
binutils supports CET v2.0. It can be disabled with --disable-cet.
It is an error to configure GCC with --enable-cet if bintuiils
doesn't support CET v2.0.
ENDBR instruction is added to __morestack_large_model since it is
called indirectly.
2017-11-17 Igor Tsimbalist <igor.v.tsimbalist@intel.com>
config/
* cet.m4: New file.
gcc/
* config.gcc (extra_headers): Add cet.h for x86 targets.
* config/i386/cet.h: New file.
* doc/install.texi: Add --enable-cet/--disable-cet.
libgcc/
* Makefile.in (configure_deps): Add $(srcdir)/../config/cet.m4.
(CET_FLAGS): New.
* config/i386/morestack.S: Include <cet.h>.
(__morestack_large_model): Add _CET_ENDBR at function entrance.
* config/i386/resms64.h: Include <cet.h>.
* config/i386/resms64f.h: Likewise.
* config/i386/resms64fx.h: Likewise.
* config/i386/resms64x.h: Likewise.
* config/i386/savms64.h: Likewise.
* config/i386/savms64f.h: Likewise.
* config/i386/t-linux (HOST_LIBGCC2_CFLAGS): Add $(CET_FLAGS).
(CRTSTUFF_T_CFLAGS): Likewise.
* configure.ac: Include ../config/cet.m4.
Set and substitute CET_FLAGS.
* configure: Regenerated.
From-SVN: r254868
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 18 | ||||
-rw-r--r-- | libgcc/Makefile.in | 5 | ||||
-rw-r--r-- | libgcc/config/i386/morestack.S | 3 | ||||
-rw-r--r-- | libgcc/config/i386/resms64.h | 2 | ||||
-rw-r--r-- | libgcc/config/i386/resms64f.h | 2 | ||||
-rw-r--r-- | libgcc/config/i386/resms64fx.h | 2 | ||||
-rw-r--r-- | libgcc/config/i386/resms64x.h | 2 | ||||
-rw-r--r-- | libgcc/config/i386/savms64.h | 2 | ||||
-rw-r--r-- | libgcc/config/i386/savms64f.h | 2 | ||||
-rw-r--r-- | libgcc/config/i386/t-linux | 3 | ||||
-rw-r--r-- | libgcc/configure | 72 | ||||
-rw-r--r-- | libgcc/configure.ac | 4 |
12 files changed, 115 insertions, 2 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index a069cd7..da4d1ad 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,21 @@ +2017-11-17 Igor Tsimbalist <igor.v.tsimbalist@intel.com> + + * Makefile.in (configure_deps): Add $(srcdir)/../config/cet.m4. + (CET_FLAGS): New. + * config/i386/morestack.S: Include <cet.h>. + (__morestack_large_model): Add _CET_ENDBR at function entrance. + * config/i386/resms64.h: Include <cet.h>. + * config/i386/resms64f.h: Likewise. + * config/i386/resms64fx.h: Likewise. + * config/i386/resms64x.h: Likewise. + * config/i386/savms64.h: Likewise. + * config/i386/savms64f.h: Likewise. + * config/i386/t-linux (HOST_LIBGCC2_CFLAGS): Add $(CET_FLAGS). + (CRTSTUFF_T_CFLAGS): Likewise. + * configure.ac: Include ../config/cet.m4. + Set and substitute CET_FLAGS. + * configure: Regenerated. + 2017-11-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * config.host (*-*-solaris2*): Adapt comment for Solaris 12 diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in index a1a392d..eaa68b5 100644 --- a/libgcc/Makefile.in +++ b/libgcc/Makefile.in @@ -171,7 +171,8 @@ configure_deps = \ $(srcdir)/../config/dfp.m4 \ $(srcdir)/../config/unwind_ipinfo.m4 \ $(srcdir)/../config/gthr.m4 \ - $(srcdir)/../config/sjlj.m4 + $(srcdir)/../config/sjlj.m4 \ + $(srcdir)/../config/cet.m4 $(srcdir)/configure: @MAINT@ $(srcdir)/configure.ac $(configure_deps) cd $(srcdir) && $(AUTOCONF) @@ -254,6 +255,8 @@ HOST_LIBGCC2_CFLAGS = PICFLAG = @PICFLAG@ +CET_FLAGS = @CET_FLAGS@ + # Defined in libgcc2.c, included only in the static library. LIB2FUNCS_ST = _eprintf __gcc_bcmp diff --git a/libgcc/config/i386/morestack.S b/libgcc/config/i386/morestack.S index 9d185c1..79d5db9 100644 --- a/libgcc/config/i386/morestack.S +++ b/libgcc/config/i386/morestack.S @@ -91,6 +91,8 @@ # __morestack to call __morestack_non_split instead. We just bump the # requested stack space by 16K. +#include <cet.h> + .global __morestack_non_split .hidden __morestack_non_split @@ -701,6 +703,7 @@ DW.ref.__gcc_personality_v0: __morestack_large_model: .cfi_startproc + _CET_ENDBR movq %r10, %r11 andl $0xffffffff, %r10d diff --git a/libgcc/config/i386/resms64.h b/libgcc/config/i386/resms64.h index f01b418..45a42da 100644 --- a/libgcc/config/i386/resms64.h +++ b/libgcc/config/i386/resms64.h @@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ +#include <cet.h> + #ifdef __x86_64__ #include "i386-asm.h" diff --git a/libgcc/config/i386/resms64f.h b/libgcc/config/i386/resms64f.h index 743ec51..00805b3 100644 --- a/libgcc/config/i386/resms64f.h +++ b/libgcc/config/i386/resms64f.h @@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ +#include <cet.h> + #ifdef __x86_64__ #include "i386-asm.h" diff --git a/libgcc/config/i386/resms64fx.h b/libgcc/config/i386/resms64fx.h index 965807a..85083cd 100644 --- a/libgcc/config/i386/resms64fx.h +++ b/libgcc/config/i386/resms64fx.h @@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ +#include <cet.h> + #ifdef __x86_64__ #include "i386-asm.h" diff --git a/libgcc/config/i386/resms64x.h b/libgcc/config/i386/resms64x.h index 689a1de..fcf885e 100644 --- a/libgcc/config/i386/resms64x.h +++ b/libgcc/config/i386/resms64x.h @@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ +#include <cet.h> + #ifdef __x86_64__ #include "i386-asm.h" diff --git a/libgcc/config/i386/savms64.h b/libgcc/config/i386/savms64.h index 28d5e35..570902d 100644 --- a/libgcc/config/i386/savms64.h +++ b/libgcc/config/i386/savms64.h @@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ +#include <cet.h> + #ifdef __x86_64__ #include "i386-asm.h" diff --git a/libgcc/config/i386/savms64f.h b/libgcc/config/i386/savms64f.h index 723e108..51c9d97 100644 --- a/libgcc/config/i386/savms64f.h +++ b/libgcc/config/i386/savms64f.h @@ -23,6 +23,8 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ +#include <cet.h> + #ifdef __x86_64__ #include "i386-asm.h" diff --git a/libgcc/config/i386/t-linux b/libgcc/config/i386/t-linux index 11bb46e..8506a63 100644 --- a/libgcc/config/i386/t-linux +++ b/libgcc/config/i386/t-linux @@ -3,4 +3,5 @@ # t-slibgcc-elf-ver and t-linux SHLIB_MAPFILES = libgcc-std.ver $(srcdir)/config/i386/libgcc-glibc.ver -HOST_LIBGCC2_CFLAGS += -mlong-double-80 -DUSE_ELF_SYMVER +HOST_LIBGCC2_CFLAGS += -mlong-double-80 -DUSE_ELF_SYMVER $(CET_FLAGS) +CRTSTUFF_T_CFLAGS += $(CET_FLAGS) diff --git a/libgcc/configure b/libgcc/configure index 20169b1..38a28c2 100644 --- a/libgcc/configure +++ b/libgcc/configure @@ -573,6 +573,7 @@ vis_hide real_host_noncanonical accel_dir_suffix force_explicit_eh_registry +CET_FLAGS fixed_point enable_decimal_float decimal_float @@ -675,6 +676,7 @@ with_build_libsubdir enable_largefile enable_decimal_float with_system_libunwind +enable_cet enable_explicit_exception_frame_registration with_glibc_version enable_tls @@ -1314,6 +1316,8 @@ Optional Features: enable decimal float extension to C. Selecting 'bid' or 'dpd' choses which decimal floating point format to use + --enable-cet enable Intel CET in target libraries + [default=default] --enable-explicit-exception-frame-registration register exception tables explicitly at module start, for use e.g. for compatibility with @@ -4773,6 +4777,74 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sjlj_exceptions" >&5 $as_echo "$ac_cv_sjlj_exceptions" >&6; } + # Check whether --enable-cet was given. +if test "${enable_cet+set}" = set; then : + enableval=$enable_cet; + case "$enableval" in + yes|no|default) ;; + *) as_fn_error "Unknown argument to enable/disable cet" "$LINENO" 5 ;; + esac + +else + enable_cet=default +fi + + +case "$host" in + i[34567]86-*-linux* | x86_64-*-linux*) + case "$enable_cet" in + default) + # Check if assembler supports CET. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +asm ("setssbsy"); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + enable_cet=yes +else + enable_cet=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + yes) + # Check if assembler supports CET. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +asm ("setssbsy"); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + as_fn_error "assembler with CET support is required for --enable-cet" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + esac + ;; + *) + enable_cet=no + ;; +esac +if test x$enable_cet = xyes; then + CET_FLAGS="-fcf-protection -mcet" +fi + + + # Check whether --enable-explicit-exception-frame-registration was given. if test "${enable_explicit_exception_frame_registration+set}" = set; then : enableval=$enable_explicit_exception_frame_registration; diff --git a/libgcc/configure.ac b/libgcc/configure.ac index 53e7775..6e76a68 100644 --- a/libgcc/configure.ac +++ b/libgcc/configure.ac @@ -11,6 +11,7 @@ sinclude(../config/dfp.m4) sinclude(../config/unwind_ipinfo.m4) sinclude(../config/gthr.m4) sinclude(../config/sjlj.m4) +sinclude(../config/cet.m4) AC_PREREQ(2.64) AC_INIT([GNU C Runtime Library], 1.0,,[libgcc]) @@ -236,6 +237,9 @@ GCC_CHECK_UNWIND_GETIPINFO # Check if the compiler is configured for setjmp/longjmp exceptions. GCC_CHECK_SJLJ_EXCEPTIONS +GCC_CET_FLAGS(CET_FLAGS) +AC_SUBST(CET_FLAGS) + AC_ARG_ENABLE([explicit-exception-frame-registration], [AC_HELP_STRING([--enable-explicit-exception-frame-registration], [register exception tables explicitly at module start, for use |