Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 543c37cb authored by Emese Revfy's avatar Emese Revfy Committed by Michal Marek
Browse files

Add sancov plugin

The sancov gcc plugin inserts a __sanitizer_cov_trace_pc() call
at the start of basic blocks.

This plugin is a helper plugin for the kcov feature. It supports
all gcc versions with plugin support (from gcc-4.5 on).
It is based on the gcc commit "Add fuzzing coverage support" by Dmitry Vyukov
(https://gcc.gnu.org/viewcvs/gcc?limit_changes=0&view=revision&revision=231296

).

Signed-off-by: default avatarEmese Revfy <re.emese@gmail.com>
Acked-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarMichal Marek <mmarek@suse.com>
parent 0dae776c
Loading
Loading
Loading
Loading
+1 −9
Original line number Diff line number Diff line
@@ -369,7 +369,7 @@ LDFLAGS_MODULE =
CFLAGS_KERNEL	=
AFLAGS_KERNEL	=
CFLAGS_GCOV	= -fprofile-arcs -ftest-coverage -fno-tree-loop-im -Wno-maybe-uninitialized
CFLAGS_KCOV	= -fsanitize-coverage=trace-pc
CFLAGS_KCOV	:= $(call cc-option,-fsanitize-coverage=trace-pc,)


# Use USERINCLUDE when you must reference the UAPI directories only.
@@ -691,14 +691,6 @@ endif
endif
KBUILD_CFLAGS += $(stackp-flag)

ifdef CONFIG_KCOV
  ifeq ($(call cc-option, $(CFLAGS_KCOV)),)
    $(warning Cannot use CONFIG_KCOV: \
             -fsanitize-coverage=trace-pc is not supported by compiler)
    CFLAGS_KCOV =
  endif
endif

ifeq ($(cc-name),clang)
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
KBUILD_CPPFLAGS += $(call cc-option,-Wno-unknown-warning-option,)
+9 −0
Original line number Diff line number Diff line
@@ -384,6 +384,15 @@ config GCC_PLUGIN_CYC_COMPLEXITY
	  N = the number of nodes
	  P = the number of connected components (exit nodes).

config GCC_PLUGIN_SANCOV
	bool
	depends on GCC_PLUGINS
	help
	  This plugin inserts a __sanitizer_cov_trace_pc() call at the start of
	  basic blocks. It supports all gcc versions with plugin support (from
	  gcc-4.5 on). It is based on the commit "Add fuzzing coverage support"
	  by Dmitry Vyukov <dvyukov@google.com>.

config HAVE_CC_STACKPROTECTOR
	bool
	help
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y))
LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib
targets += purgatory.ro

KCOV_INSTRUMENT := n

# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
# in turn leaves some undefined symbols like __fentry__ in purgatory and not
# sure how to relocate those. Like kexec-tools, use custom flags.
+2 −0
Original line number Diff line number Diff line
@@ -708,6 +708,8 @@ config KCOV
	bool "Code coverage for fuzzing"
	depends on ARCH_HAS_KCOV
	select DEBUG_FS
	select GCC_PLUGINS
	select GCC_PLUGIN_SANCOV
	help
	  KCOV exposes kernel code coverage information in a form suitable
	  for coverage-guided fuzzing (randomized testing).
+20 −1
Original line number Diff line number Diff line
@@ -2,10 +2,26 @@ ifdef CONFIG_GCC_PLUGINS
  __PLUGINCC := $(call cc-ifversion, -ge, 0408, $(HOSTCXX), $(HOSTCC))
  PLUGINCC := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)")

  SANCOV_PLUGIN := -fplugin=$(objtree)/scripts/gcc-plugins/sancov_plugin.so

  gcc-plugin-$(CONFIG_GCC_PLUGIN_CYC_COMPLEXITY)	+= cyc_complexity_plugin.so

  ifdef CONFIG_GCC_PLUGIN_SANCOV
    ifeq ($(CFLAGS_KCOV),)
      # It is needed because of the gcc-plugin.sh and gcc version checks.
      gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV)           += sancov_plugin.so

      ifneq ($(PLUGINCC),)
        CFLAGS_KCOV := $(SANCOV_PLUGIN)
      else
        $(warning warning: cannot use CONFIG_KCOV: -fsanitize-coverage=trace-pc is not supported by compiler)
      endif
    endif
  endif

  GCC_PLUGINS_CFLAGS := $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y))

  export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN
  export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN

  ifeq ($(PLUGINCC),)
    ifneq ($(GCC_PLUGINS_CFLAGS),)
@@ -16,6 +32,9 @@ ifdef CONFIG_GCC_PLUGINS
        $(warning warning: your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least)
      endif
    endif
  else
    # SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
    GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
  endif

  KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
Loading