diff options
Diffstat (limited to 'libre/linux-libre-hardened/0001-gcc-plugins-drop-support-for-GCC-4.7.patch')
-rw-r--r-- | libre/linux-libre-hardened/0001-gcc-plugins-drop-support-for-GCC-4.7.patch | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/libre/linux-libre-hardened/0001-gcc-plugins-drop-support-for-GCC-4.7.patch b/libre/linux-libre-hardened/0001-gcc-plugins-drop-support-for-GCC-4.7.patch new file mode 100644 index 000000000..d94b356ba --- /dev/null +++ b/libre/linux-libre-hardened/0001-gcc-plugins-drop-support-for-GCC-4.7.patch @@ -0,0 +1,306 @@ +From dba68a9d4df76d49d32245e4236713a43fb321da Mon Sep 17 00:00:00 2001 +From: Masahiro Yamada <masahiroy@kernel.org> +Date: Sun, 29 Mar 2020 20:08:32 +0900 +Subject: [PATCH 1/4] gcc-plugins: drop support for GCC <= 4.7 + +Nobody was opposed to raising minimum GCC version to 4.8 [1] +So, we will drop GCC <= 4.7 support sooner or later. + +We always use C++ compiler for building plugins for GCC >= 4.8. + +This commit drops the plugin support for GCC <= 4.7 a bit earlier, +which allows us to dump lots of code. + +[1] https://lkml.org/lkml/2020/1/23/545 + +Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> +Acked-by: Kees Cook <keescook@chromium.org> +--- + scripts/Kconfig.include | 3 -- + scripts/Makefile.build | 2 +- + scripts/Makefile.clean | 1 - + scripts/Makefile.host | 23 +-------------- + scripts/gcc-plugin.sh | 57 ++++-------------------------------- + scripts/gcc-plugins/Kconfig | 12 ++------ + scripts/gcc-plugins/Makefile | 21 ++++--------- + 7 files changed, 15 insertions(+), 104 deletions(-) + +diff --git a/scripts/Kconfig.include b/scripts/Kconfig.include +index 496d11c92c97..033f6efd92d3 100644 +--- a/scripts/Kconfig.include ++++ b/scripts/Kconfig.include +@@ -42,9 +42,6 @@ $(error-if,$(failure,command -v $(LD)),linker '$(LD)' not found) + # Fail if the linker is gold as it's not capable of linking the kernel proper + $(error-if,$(success, $(LD) -v | grep -q gold), gold linker '$(LD)' not supported) + +-# gcc version including patch level +-gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh $(CC)) +- + # machine bit flags + # $(m32-flag): -m32 if the compiler supports it, or an empty string otherwise. + # $(m64-flag): -m64 if the compiler supports it, or an empty string otherwise. +diff --git a/scripts/Makefile.build b/scripts/Makefile.build +index a1730d42e5f3..eec789d7a63a 100644 +--- a/scripts/Makefile.build ++++ b/scripts/Makefile.build +@@ -46,7 +46,7 @@ include $(kbuild-file) + include scripts/Makefile.lib + + # Do not include host rules unless needed +-ifneq ($(hostprogs)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),) ++ifneq ($(hostprogs)$(hostcxxlibs-y)$(hostcxxlibs-m),) + include scripts/Makefile.host + endif + +diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean +index 1e4206566a82..075f0cc2d8d7 100644 +--- a/scripts/Makefile.clean ++++ b/scripts/Makefile.clean +@@ -30,7 +30,6 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) + __clean-files := $(extra-y) $(extra-m) $(extra-) \ + $(always) $(always-y) $(always-m) $(always-) $(targets) $(clean-files) \ + $(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) \ +- $(hostlibs-y) $(hostlibs-m) $(hostlibs-) \ + $(hostcxxlibs-y) $(hostcxxlibs-m) + + __clean-files := $(filter-out $(no-clean-files), $(__clean-files)) +diff --git a/scripts/Makefile.host b/scripts/Makefile.host +index 3b7121d43324..2045855d0b75 100644 +--- a/scripts/Makefile.host ++++ b/scripts/Makefile.host +@@ -39,41 +39,37 @@ $(obj)/%.tab.c $(obj)/%.tab.h: $(src)/%.y FORCE + # They are linked as C++ code to the executable qconf + + __hostprogs := $(sort $(hostprogs)) +-host-cshlib := $(sort $(hostlibs-y) $(hostlibs-m)) + host-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m)) + + # C code + # Executables compiled from a single .c file + host-csingle := $(foreach m,$(__hostprogs), \ + $(if $($(m)-objs)$($(m)-cxxobjs),,$(m))) + + # C executables linked based on several .o files + host-cmulti := $(foreach m,$(__hostprogs),\ + $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m)))) + + # Object (.o) files compiled from .c files + host-cobjs := $(sort $(foreach m,$(__hostprogs),$($(m)-objs))) + + # C++ code + # C++ executables compiled from at least one .cc file + # and zero or more .c files + host-cxxmulti := $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m))) + + # C++ Object (.o) files compiled from .cc files + host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs))) + + # Object (.o) files used by the shared libaries +-host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs)))) + host-cxxshobjs := $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs)))) + + host-csingle := $(addprefix $(obj)/,$(host-csingle)) + host-cmulti := $(addprefix $(obj)/,$(host-cmulti)) + host-cobjs := $(addprefix $(obj)/,$(host-cobjs)) + host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti)) + host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs)) +-host-cshlib := $(addprefix $(obj)/,$(host-cshlib)) + host-cxxshlib := $(addprefix $(obj)/,$(host-cxxshlib)) +-host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs)) + host-cxxshobjs := $(addprefix $(obj)/,$(host-cxxshobjs)) + + ##### +@@ -140,42 +136,25 @@ quiet_cmd_host-cxxobjs = HOSTCXX $@ + $(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE + $(call if_changed_dep,host-cxxobjs) + +-# Compile .c file, create position independent .o file +-# host-cshobjs -> .o +-quiet_cmd_host-cshobjs = HOSTCC -fPIC $@ +- cmd_host-cshobjs = $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $< +-$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE +- $(call if_changed_dep,host-cshobjs) +- + # Compile .c file, create position independent .o file + # Note that plugin capable gcc versions can be either C or C++ based + # therefore plugin source files have to be compilable in both C and C++ mode. + # This is why a C++ compiler is invoked on a .c file. + # host-cxxshobjs -> .o + quiet_cmd_host-cxxshobjs = HOSTCXX -fPIC $@ + cmd_host-cxxshobjs = $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $< + $(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE + $(call if_changed_dep,host-cxxshobjs) + +-# Link a shared library, based on position independent .o files +-# *.o -> .so shared library (host-cshlib) +-quiet_cmd_host-cshlib = HOSTLLD -shared $@ +- cmd_host-cshlib = $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -shared -o $@ \ +- $(addprefix $(obj)/, $($(target-stem)-objs)) \ +- $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem).so) +-$(host-cshlib): FORCE +- $(call if_changed,host-cshlib) +-$(call multi_depend, $(host-cshlib), .so, -objs) +- + # Link a shared library, based on position independent .o files + # *.o -> .so shared library (host-cxxshlib) + quiet_cmd_host-cxxshlib = HOSTLLD -shared $@ + cmd_host-cxxshlib = $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -shared -o $@ \ + $(addprefix $(obj)/, $($(target-stem)-objs)) \ + $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem).so) + $(host-cxxshlib): FORCE + $(call if_changed,host-cxxshlib) + $(call multi_depend, $(host-cxxshlib), .so, -objs) + + targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\ +- $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs) ++ $(host-cxxmulti) $(host-cxxobjs) $(host-cxxshlib) $(host-cxxshobjs) +diff --git a/scripts/gcc-plugin.sh b/scripts/gcc-plugin.sh +index d3caefe53eab..b79fd0bea838 100755 +--- a/scripts/gcc-plugin.sh ++++ b/scripts/gcc-plugin.sh +@@ -1,66 +1,19 @@ + #!/bin/sh + # SPDX-License-Identifier: GPL-2.0 ++ ++set -e ++ + srctree=$(dirname "$0") + +-SHOW_ERROR= +-if [ "$1" = "--show-error" ] ; then +- SHOW_ERROR=1 +- shift || true +-fi +- +-gccplugins_dir=$($3 -print-file-name=plugin) +-plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF +-#include "gcc-common.h" +-#if BUILDING_GCC_VERSION >= 4008 || defined(ENABLE_BUILD_WITH_CXX) +-#warning $2 CXX +-#else +-#warning $1 CC +-#endif +-EOF +-) +- +-if [ $? -ne 0 ] +-then +- if [ -n "$SHOW_ERROR" ] ; then +- echo "${plugincc}" >&2 +- fi +- exit 1 +-fi +- +-case "$plugincc" in +- *"$1 CC"*) +- echo "$1" +- exit 0 +- ;; +- +- *"$2 CXX"*) +- # the c++ compiler needs another test, see below +- ;; +- +- *) +- exit 1 +- ;; +-esac ++gccplugins_dir=$($* -print-file-name=plugin) + + # we need a c++ compiler that supports the designated initializer GNU extension +-plugincc=$($2 -c -x c++ -std=gnu++98 - -fsyntax-only -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF ++$HOSTCC -c -x c++ -std=gnu++98 - -fsyntax-only -I $srctree/gcc-plugins -I $gccplugins_dir/include 2>/dev/null <<EOF + #include "gcc-common.h" + class test { + public: + int test; + } test = { + .test = 1 + }; + EOF +-) +- +-if [ $? -eq 0 ] +-then +- echo "$2" +- exit 0 +-fi +- +-if [ -n "$SHOW_ERROR" ] ; then +- echo "${plugincc}" >&2 +-fi +-exit 1 +diff --git a/scripts/gcc-plugins/Kconfig b/scripts/gcc-plugins/Kconfig +index e3569543bdac..fd31ed5b435f 100644 +--- a/scripts/gcc-plugins/Kconfig ++++ b/scripts/gcc-plugins/Kconfig +@@ -1,23 +1,15 @@ + # SPDX-License-Identifier: GPL-2.0-only +-preferred-plugin-hostcc := $(if-success,[ $(gcc-version) -ge 40800 ],$(HOSTCXX),$(HOSTCC)) +- +-config PLUGIN_HOSTCC +- string +- default "$(shell,$(srctree)/scripts/gcc-plugin.sh "$(preferred-plugin-hostcc)" "$(HOSTCXX)" "$(CC)")" if CC_IS_GCC +- help +- Host compiler used to build GCC plugins. This can be $(HOSTCXX), +- $(HOSTCC), or a null string if GCC plugin is unsupported. +- + config HAVE_GCC_PLUGINS + bool + help + An arch should select this symbol if it supports building with + GCC plugins. + + menuconfig GCC_PLUGINS + bool "GCC plugins" + depends on HAVE_GCC_PLUGINS +- depends on PLUGIN_HOSTCC != "" ++ depends on CC_IS_GCC && GCC_VERSION >= 40800 ++ depends on $(success,$(srctree)/scripts/gcc-plugin.sh $(CC)) + default y + help + GCC plugins are loadable modules that provide extra features to the +diff --git a/scripts/gcc-plugins/Makefile b/scripts/gcc-plugins/Makefile +index f2ee8bd7abc6..f22858b2c3d6 100644 +--- a/scripts/gcc-plugins/Makefile ++++ b/scripts/gcc-plugins/Makefile +@@ -1,30 +1,21 @@ + # SPDX-License-Identifier: GPL-2.0 +-PLUGINCC := $(CONFIG_PLUGIN_HOSTCC:"%"=%) + GCC_PLUGINS_DIR := $(shell $(CC) -print-file-name=plugin) + +-ifeq ($(PLUGINCC),$(HOSTCC)) +- HOSTLIBS := hostlibs +- HOST_EXTRACFLAGS += -I$(GCC_PLUGINS_DIR)/include -I$(src) -std=gnu99 -ggdb +- export HOST_EXTRACFLAGS +-else +- HOSTLIBS := hostcxxlibs +- HOST_EXTRACXXFLAGS += -I$(GCC_PLUGINS_DIR)/include -I$(src) -std=gnu++98 -fno-rtti +- HOST_EXTRACXXFLAGS += -fno-exceptions -fasynchronous-unwind-tables -ggdb +- HOST_EXTRACXXFLAGS += -Wno-narrowing -Wno-unused-variable +- export HOST_EXTRACXXFLAGS +-endif ++HOST_EXTRACXXFLAGS += -I$(GCC_PLUGINS_DIR)/include -I$(src) -std=gnu++98 -fno-rtti ++HOST_EXTRACXXFLAGS += -fno-exceptions -fasynchronous-unwind-tables -ggdb ++HOST_EXTRACXXFLAGS += -Wno-narrowing -Wno-unused-variable -Wno-c++11-compat + + $(obj)/randomize_layout_plugin.o: $(objtree)/$(obj)/randomize_layout_seed.h + quiet_cmd_create_randomize_layout_seed = GENSEED $@ + cmd_create_randomize_layout_seed = \ + $(CONFIG_SHELL) $(srctree)/$(src)/gen-random-seed.sh $@ $(objtree)/include/generated/randomize_layout_hash.h + $(objtree)/$(obj)/randomize_layout_seed.h: FORCE + $(call if_changed,create_randomize_layout_seed) + targets = randomize_layout_seed.h randomize_layout_hash.h + +-$(HOSTLIBS)-y := $(foreach p,$(GCC_PLUGIN),$(if $(findstring /,$(p)),,$(p))) +-always-y := $($(HOSTLIBS)-y) ++hostcxxlibs-y := $(foreach p,$(GCC_PLUGIN),$(if $(findstring /,$(p)),,$(p))) ++always-y := $(hostcxxlibs-y) + +-$(foreach p,$($(HOSTLIBS)-y:%.so=%),$(eval $(p)-objs := $(p).o)) ++$(foreach p,$(hostcxxlibs-y:%.so=%),$(eval $(p)-objs := $(p).o)) + + clean-files += *.so +-- +2.26.2 + |