Skip to content
Snippets Groups Projects
Select Git revision
  • ad05e6ca7b5fcf15ff178da662035ec7718f938c
  • vme-testing default
  • ci-test
  • master
  • remoteproc
  • am625-sk-ov5640
  • pcal6534-upstreaming
  • lps22df-upstreaming
  • msc-upstreaming
  • imx8mp
  • iio/noa1305
  • vme-next
  • vme-next-4.14-rc4
  • v4.14-rc4
  • v4.14-rc3
  • v4.14-rc2
  • v4.14-rc1
  • v4.13
  • vme-next-4.13-rc7
  • v4.13-rc7
  • v4.13-rc6
  • v4.13-rc5
  • v4.13-rc4
  • v4.13-rc3
  • v4.13-rc2
  • v4.13-rc1
  • v4.12
  • v4.12-rc7
  • v4.12-rc6
  • v4.12-rc5
  • v4.12-rc4
  • v4.12-rc3
32 results

Makefile.gcc-plugins

Blame
    • Ard Biesheuvel's avatar
      f7dd2507
      gcc-plugins: structleak: add option to init all vars used as byref args · f7dd2507
      Ard Biesheuvel authored
      
      In the Linux kernel, struct type variables are rarely passed by-value,
      and so functions that initialize such variables typically take an input
      reference to the variable rather than returning a value that can
      subsequently be used in an assignment.
      
      If the initalization function is not part of the same compilation unit,
      the lack of an assignment operation defeats any analysis the compiler
      can perform as to whether the variable may be used before having been
      initialized. This means we may end up passing on such variables
      uninitialized, resulting in potential information leaks.
      
      So extend the existing structleak GCC plugin so it will [optionally]
      apply to all struct type variables that have their address taken at any
      point, rather than only to variables of struct types that have a __user
      annotation.
      
      Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      f7dd2507
      History
      gcc-plugins: structleak: add option to init all vars used as byref args
      Ard Biesheuvel authored
      
      In the Linux kernel, struct type variables are rarely passed by-value,
      and so functions that initialize such variables typically take an input
      reference to the variable rather than returning a value that can
      subsequently be used in an assignment.
      
      If the initalization function is not part of the same compilation unit,
      the lack of an assignment operation defeats any analysis the compiler
      can perform as to whether the variable may be used before having been
      initialized. This means we may end up passing on such variables
      uninitialized, resulting in potential information leaks.
      
      So extend the existing structleak GCC plugin so it will [optionally]
      apply to all struct type variables that have their address taken at any
      point, rather than only to variables of struct types that have a __user
      annotation.
      
      Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Makefile.gcc-plugins 3.55 KiB
    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
    
      gcc-plugin-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY)	+= latent_entropy_plugin.so
      gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY)	+= -DLATENT_ENTROPY_PLUGIN
      ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY
        DISABLE_LATENT_ENTROPY_PLUGIN			+= -fplugin-arg-latent_entropy_plugin-disable
      endif
    
      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-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK)	+= structleak_plugin.so
      gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE)	+= -fplugin-arg-structleak_plugin-verbose
      gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL)	+= -fplugin-arg-structleak_plugin-byref-all
      gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK)	+= -DSTRUCTLEAK_PLUGIN
    
      gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT)	+= randomize_layout_plugin.so
      gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT)	+= -DRANDSTRUCT_PLUGIN
      gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE)	+= -fplugin-arg-randomize_layout_plugin-performance-mode
    
      GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
    
      export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR
      export SANCOV_PLUGIN DISABLE_LATENT_ENTROPY_PLUGIN
    
      ifneq ($(PLUGINCC),)
        # 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)
      GCC_PLUGIN := $(gcc-plugin-y)
      GCC_PLUGIN_SUBDIR := $(gcc-plugin-subdir-y)
    endif
    
    # If plugins aren't supported, abort the build before hard-to-read compiler
    # errors start getting spewed by the main build.
    PHONY += gcc-plugins-check
    gcc-plugins-check: FORCE
    ifdef CONFIG_GCC_PLUGINS
      ifeq ($(PLUGINCC),)
        ifneq ($(GCC_PLUGINS_CFLAGS),)
          # Various gccs between 4.5 and 5.1 have bugs on powerpc due to missing
          # header files. gcc <= 4.6 doesn't work at all, gccs from 4.8 to 5.1 have
          # issues with 64-bit targets.
          ifeq ($(ARCH),powerpc)
            ifeq ($(call cc-ifversion, -le, 0501, y), y)
    	  @echo "Cannot use CONFIG_GCC_PLUGINS: plugin support on gcc <= 5.1 is buggy on powerpc, please upgrade to gcc 5.2 or newer" >&2 && exit 1
            endif
          endif
          ifeq ($(call cc-ifversion, -ge, 0405, y), y)
    	$(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
    	@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
          else
    	@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc version does not support plugins, you should upgrade it to at least gcc 4.5" >&2 && exit 1
          endif
        endif
      endif
    endif
    	@:
    
    # Actually do the build, if requested.
    PHONY += gcc-plugins
    gcc-plugins: scripts_basic gcc-plugins-check
    ifdef CONFIG_GCC_PLUGINS
    	$(Q)$(MAKE) $(build)=scripts/gcc-plugins
    endif
    	@: