forked from Minki/linux
d37aa2efc8
Commit61f60bac8c
("gcc-plugins: Change all version strings match kernel") broke parallel builds. Instead of adding the dependency between GCC plugins and utsrelease.h, let's use KERNELVERSION, which does not require any build artifact. Another reason why I want to avoid utsrelease.h is because it depends on CONFIG_LOCALVERSION(_AUTO) and localversion* files. (include/generated/utsrelease.h depends on include/config/kernel.release, which is generated by scripts/setlocalversion) I want to keep host tools independent of the kernel configuration. There is no good reason to rebuild GCC plugins just because of CONFIG_LOCALVERSION being changed. We just want to associate the plugin versions with the kernel source version. KERNELVERSION should be enough for our purpose. Fixes:61f60bac8c
("gcc-plugins: Change all version strings match kernel") Reported-by: kernel test robot <lkp@intel.com> Link: https://lore.kernel.org/linux-mm/202205230239.EZxeZ3Fv-lkp@intel.com Reported-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Signed-off-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20220524135541.1453693-1-masahiroy@kernel.org
69 lines
2.5 KiB
Makefile
69 lines
2.5 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
$(obj)/randomize_layout_plugin.so: $(obj)/randomize_layout_seed.h
|
|
quiet_cmd_create_randomize_layout_seed = SEEDHDR $@
|
|
cmd_create_randomize_layout_seed = \
|
|
SEED=$$(cat $(filter-out FORCE,$^) </dev/null); \
|
|
echo '/*' > $@; \
|
|
echo ' * This file is automatically generated. Keep it private.' >> $@; \
|
|
echo ' * Exposing this value will expose the layout of randomized structures.' >> $@; \
|
|
echo ' */' >> $@; \
|
|
echo "const char *randstruct_seed = \"$$SEED\";" >> $@
|
|
$(obj)/randomize_layout_seed.h: $(objtree)/scripts/basic/randstruct.seed FORCE
|
|
$(call if_changed,create_randomize_layout_seed)
|
|
targets += randomize_layout_seed.h
|
|
|
|
# Build rules for plugins
|
|
#
|
|
# No extra code is needed for single-file plugins.
|
|
# For multi-file plugins, use *-objs syntax to list the objects.
|
|
#
|
|
# If the plugin foo.so is compiled from foo.c and foo2.c, you can do:
|
|
#
|
|
# foo-objs := foo.o foo2.o
|
|
|
|
always-y += $(GCC_PLUGIN)
|
|
|
|
GCC_PLUGINS_DIR = $(shell $(CC) -print-file-name=plugin)
|
|
|
|
plugin_cxxflags = -Wp,-MMD,$(depfile) $(KBUILD_HOSTCXXFLAGS) -fPIC \
|
|
-include $(srctree)/include/linux/compiler-version.h \
|
|
-DPLUGIN_VERSION=$(call stringify,$(KERNELVERSION)) \
|
|
-I $(GCC_PLUGINS_DIR)/include -I $(obj) -std=gnu++11 \
|
|
-fno-rtti -fno-exceptions -fasynchronous-unwind-tables \
|
|
-ggdb -Wno-narrowing -Wno-unused-variable \
|
|
-Wno-format-diag
|
|
|
|
plugin_ldflags = -shared
|
|
|
|
plugin-single := $(foreach m, $(GCC_PLUGIN), $(if $($(m:%.so=%-objs)),,$(m)))
|
|
plugin-multi := $(filter-out $(plugin-single), $(GCC_PLUGIN))
|
|
plugin-objs := $(sort $(foreach m, $(plugin-multi), $($(m:%.so=%-objs))))
|
|
|
|
targets += $(plugin-single) $(plugin-multi) $(plugin-objs)
|
|
clean-files += *.so
|
|
|
|
plugin-single := $(addprefix $(obj)/, $(plugin-single))
|
|
plugin-multi := $(addprefix $(obj)/, $(plugin-multi))
|
|
plugin-objs := $(addprefix $(obj)/, $(plugin-objs))
|
|
|
|
quiet_cmd_plugin_cxx_so_c = HOSTCXX $@
|
|
cmd_plugin_cxx_so_c = $(HOSTCXX) $(plugin_cxxflags) $(plugin_ldflags) -o $@ $<
|
|
|
|
$(plugin-single): $(obj)/%.so: $(src)/%.c FORCE
|
|
$(call if_changed_dep,plugin_cxx_so_c)
|
|
|
|
quiet_cmd_plugin_ld_so_o = HOSTLD $@
|
|
cmd_plugin_ld_so_o = $(HOSTCXX) $(plugin_ldflags) -o $@ \
|
|
$(addprefix $(obj)/, $($(target-stem)-objs))
|
|
|
|
$(plugin-multi): FORCE
|
|
$(call if_changed,plugin_ld_so_o)
|
|
$(foreach m, $(notdir $(plugin-multi)), $(eval $(obj)/$m: $(addprefix $(obj)/, $($(m:%.so=%-objs)))))
|
|
|
|
quiet_cmd_plugin_cxx_o_c = HOSTCXX $@
|
|
cmd_plugin_cxx_o_c = $(HOSTCXX) $(plugin_cxxflags) -c -o $@ $<
|
|
|
|
$(plugin-objs): $(obj)/%.o: $(src)/%.c FORCE
|
|
$(call if_changed_dep,plugin_cxx_o_c)
|