
The GCC plugins are built using HOSTCC, but the path to the GCC plugins headers is obtained using CC. This can lead to interesting failures if the host compiler and cross compiler are different versions, and the host compiler uses the cross headers. Signed-off-by: Ross Burton <ross.burton@arm.com> Signed-off-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20210923152811.406516-1-ross.burton@arm.com Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
2.3 KiB
SPDX-License-Identifier: GPL-2.0
$(obj)/randomize_layout_plugin.so: $(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
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 $(HOSTCXX) -print-file-name=plugin)
plugin_cxxflags = -Wp,-MMD,$(depfile) $(KBUILD_HOSTCXXFLAGS) -fPIC
-include $(srctree)/include/linux/compiler-version.h
-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)