2014-01-04 Magnus Granberg * gcc/esp.h New file to support --enable-esp Version 20140104.1 --- gcc/config/esp.h 2010-04-09 16:14:00.000000000 +0200 +++ gcc/config/esp.h 2012-06-23 01:00:31.248348491 +0200 @@ -0,0 +1,128 @@ +/* License terms see GNU GENERAL PUBLIC LICENSE Version 3. + * Version 20140104.1 + * Magnus Granberg (Zorry) */ +#ifndef GCC_ESP_H +#define GCC_ESP_H + +/* This file will add -fstack-protector-all, -fstack-check, -fPIE, -pie and -z now + as default if the defines and the spec allow it. + Added a hack for gcc-specs-* in toolchain-funcs.eclass and _filter-hardened in flag-o-matic.eclass + to support older hardened GCC patches and we don't need to change the code on gcc-specs-* and _filter-hardened. + This will add some unsupported upstream commands options as -nopie and -nonow. + -D__KERNEL__ is added so we don't have -fPIE, -pie and -fstack-protector-all and -fstack-check when building kernels. + ESP_CC1_SPEC is added to CC1_SPEC. + ESP_CC1_STRICT_OVERFLOW_SPEC is added so we don't disable the strict-overflow check. + ESP_LINK_PIE_CHECK_SPEC check for -pie, -p, -pg, -profile and -static. + ENABLE_CRTBEGINP add support for crtbeginP.o, build -static with -fPIE or -fpie. +*/ +#ifdef ENABLE_ESP + + /* Hack to support gcc-specs-* in toolchain-funcs.eclass and _filter-hardened in flag-o-matic.eclass */ + #define ESP_CC1_SPEC " %(esp_cc1_ssp) %(esp_cc1_pie) %(esp_cc1_strict_overflow)" + #if defined ( EFAULT_SSP ) || defined ( EFAULT_PIE_SSP ) + #define ESP_CC1_SSP_SPEC "%{!fno-stack-protector: %{!fno-stack-protector-all: %{!fno-stack-check: }}}" + #else + #define ESP_CC1_SSP_SPEC "" + #endif + #if defined ( EFAULT_PIE ) || defined ( EFAULT_PIE_SSP ) + #define ESP_CC1_PIE_SPEC "%{!nopie: }" + #else + #define ESP_CC1_PIE_SPEC "" + #endif + #define ESP_CC1_STRICT_OVERFLOW_SPEC "%{!fstrict-overflow:%{!fno-strict-overflow: -fno-strict-overflow}}" + + /* ESP_LINK_SPEC is added to LINK_PIE_SPEC if esp is enable + -z now will be added if we don't have -vanilla spec. We do a -pie incompatible check + Don't remove the specs in the end */ + #define ESP_LINK_SPEC "%(esp_link_now) %(esp_link_pie_check) " + #define ESP_LINK_NOW_SPEC "%{!nonow:-z now}" + + /* We use ESP_ESP_DRIVER_SELF_SPEC to add pie and ssp command-line options. */ + #define ESP_DRIVER_SELF_SPEC "%{D__KERNEL__:;:%{!nopie:%(esp_options_pie) \ + %(esp_link_pie)} %(esp_options_ssp) }" + + /* This will add -fstack-protector-all if we don't have -nostdlib -nodefaultlibs -fno-stack-protector -fstack-protector + -fstack-protector-all and we have EFAULT_SSP or EFAULT_PIE_SSP defined. */ + #if defined ( EFAULT_SSP ) || defined ( EFAULT_PIE_SSP ) + #define ESP_OPTIONS_SSP_SPEC \ + "%{nostdlib|nodefaultlibs|ffreestanding|fno-stack-protector| \ + fstack-protector|fstack-protector-all:;:-fstack-protector-all} \ + %{fstack-check|fstack-check=*:;: -fstack-check}" + #else + #define ESP_OPTIONS_SSP_SPEC "" + #endif + + /* If EFAULT_PIE or EFAULT_PIE_SSP is defined we will add -fPIE -pie */ + #if defined ( EFAULT_PIE ) || defined ( EFAULT_PIE_SSP ) + + /* This will add -fPIE if we don't have -pie -fpic -fPIC -fpie -fPIE -fno-pic -fno-PIC -fno-pie -fno-PIE -shared -static + -nostdlib -nostartfiles. */ + /* With ENABLE_CRTBEGINP we don't need to check for -static */ + #ifdef ENABLE_CRTBEGINP + #define ESP_OPTIONS_PIE_SPEC \ + "%{!pie: %{!fpic:%{!fPIC:%{!fpie:%{!fPIE: %{!fno-pic:%{!fno-PIC:%{!fno-pie:%{!fno-PIE: \ + %{!shared: %{!nostdlib: %{!nostartfiles:-fPIE}} } }}}} }}}} }" + #else + #define ESP_OPTIONS_PIE_SPEC \ + "%{!pie: %{!fpic:%{!fPIC:%{!fpie:%{!fPIE: %{!fno-pic:%{!fno-PIC:%{!fno-pie:%{!fno-PIE: \ + %{!shared: %{!static: %{!nostdlib: %{!nostartfiles:-fPIE}} } }}}} }}}} }}" + #endif + + /* This will add -pie if we don't have -pie -A -fno-pic -fno-PIC -fno-pie -fno-PIE -shared -static -r -nostdlib + -nostartfiles */ + /* With ENABLE_CRTBEGINP we don't need to check for -static + and we add -pie only to get the start and endfiles. -pie will not go to the linker. */ + #ifdef ENABLE_CRTBEGINP + #define ESP_LINK_PIE_SPEC \ + "%{!pie:%{!A:%{!fno-pie:%{!fno-PIE:%{!fno-pic:%{!fno-PIC:%{!shared:%{!r: \ + %{!nostdlib:%{!nostartfiles:-pie}}}}}}}}}}" + #else + #define ESP_LINK_PIE_SPEC \ + "%{!pie:%{!A:%{!fno-pie:%{!fno-PIE:%{!fno-pic:%{!fno-PIC:%{!shared:%{!static:%{!r: \ + %{!nostdlib:%{!nostartfiles:-pie}}}}}}}}}}}" + #endif + + /* This will check if -pie is set when (-static) -pg -p -profile. If set it will make gcc print out + "-pie and (static)|pg|p|profile are incompatible when linking" */ + /* With ENABLE_CRTBEGINP we don't need to check for -static */ + #ifdef ENABLE_CRTBEGINP + #define ESP_LINK_PIE_CHECK_SPEC \ + "%{pie:%{pg|p|profile:%e-pie and -pg|p|profile are incompatible when linking}}" + #else + #define ESP_LINK_PIE_CHECK_SPEC \ + "%{pie:%{static|pg|p|profile:%e-pie and -static|pg|p|profile are incompatible when linking}}" + #endif + + /* We don't pass -pie to the linker when -static. */ + #ifdef ENABLE_CRTBEGINP + #define LINK_PIE_SPEC "%{!static:%{pie:-pie}} %(esp_link)" + #else + #define LINK_PIE_SPEC "%{pie:-pie} %(esp_link)" + #endif + + #else + #define ESP_OPTIONS_PIE_SPEC "" + #define ESP_LINK_PIE_CHECK_SPEC "" + #define ESP_LINK_PIE_SPEC "" + #define LINK_PIE_SPEC "%{pie:-pie} %(esp_link)" + #endif + + /* We add extra spec name's to the EXTRA_SPECS list */ + #define ESP_EXTRA_SPECS \ + { "esp_cc1", ESP_CC1_SPEC }, \ + { "esp_cc1_pie", ESP_CC1_PIE_SPEC }, \ + { "esp_cc1_ssp", ESP_CC1_SSP_SPEC }, \ + { "esp_cc1_strict_overflow", ESP_CC1_STRICT_OVERFLOW_SPEC }, \ + { "esp_link", ESP_LINK_SPEC }, \ + { "esp_link_now", ESP_LINK_NOW_SPEC }, \ + { "esp_link_pie", ESP_LINK_PIE_SPEC }, \ + { "esp_link_pie_check", ESP_LINK_PIE_CHECK_SPEC }, \ + { "esp_driver_self", ESP_DRIVER_SELF_SPEC }, \ + { "esp_options_pie", ESP_OPTIONS_PIE_SPEC }, \ + { "esp_options_ssp", ESP_OPTIONS_SSP_SPEC } + + static const char *esp_driver_self_spec = ESP_DRIVER_SELF_SPEC; + static const char *cc1_spec = CC1_SPEC ESP_CC1_SPEC; + +#endif +#endif /* End GCC_ESP_H */