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

Commit 91341d4b authored by Sam Ravnborg's avatar Sam Ravnborg
Browse files

kbuild: introduce new option to enhance section mismatch analysis



Setting the option DEBUG_SECTION_MISMATCH will
report additional section mismatch'es but this
should in the end makes it possible to get rid of
all of them.

See help text in lib/Kconfig.debug for details.

Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent eb8f6890
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -520,6 +520,11 @@ KBUILD_CFLAGS += -g
KBUILD_AFLAGS	+= -gdwarf-2
endif

# We trigger additional mismatches with less inlining
ifdef CONFIG_DEBUG_SECTION_MISMATCH
KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
endif

# Force gcc to behave correct even for buggy distributions
KBUILD_CFLAGS         += $(call cc-option, -fno-stack-protector)

+30 −0
Original line number Diff line number Diff line
@@ -79,6 +79,36 @@ config HEADERS_CHECK
	  exported to $(INSTALL_HDR_PATH) (usually 'usr/include' in
	  your build tree), to make sure they're suitable.

config DEBUG_SECTION_MISMATCH
	bool "Enable full Section mismatch analysis"
	default n
	help
	  The section mismatch analysis checks if there are illegal
	  references from one section to another section.
	  Linux will during link or during runtime drop some sections
	  and any use of code/data previously in these sections will
	  most likely result in an oops.
	  In the code functions and variables are annotated with
	  __init, __devinit etc. (see full list in include/linux/init.h)
	  which result in the code/data being placed in specific sections.
	  The section mismatch anaylsis are always done after a full
	  kernel build but enabling this options will in addition
	  do the following:
	  - Add the option -fno-inline-functions-called-once to gcc
	    When inlining a function annotated __init in a non-init
	    function we would loose the section information and thus
	    the analysis would not catch the illegal reference.
	    This options tell gcc to inline less but will also
	    result in a larger kernel.
	  - Run the section mismatch analysis for each module/built-in.o
	    When we run the section mismatch analysis on vmlinux.o we
	    looses valueable information about where the mismatch was
	    introduced.
	    Running the analysis for each module/built-in.o file
	    will tell where the mismatch happens much closer to the
	    source. The drawback is that we will report the same
	    mismatch at least twice.

config DEBUG_KERNEL
	bool "Kernel debugging"
	help
+7 −2
Original line number Diff line number Diff line
@@ -103,6 +103,10 @@ ifneq ($(KBUILD_CHECKSRC),0)
  endif
endif

# Do section mismatch analysis for each module/built-in.o
ifdef CONFIG_DEBUG_SECTION_MISMATCH
  cmd_secanalysis = ; scripts/mod/modpost $@
endif

# Compile C sources (.c)
# ---------------------------------------------------------------------------
@@ -268,7 +272,8 @@ ifdef builtin-target
quiet_cmd_link_o_target = LD      $@
# If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $(obj-y)),\
		      $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^),\
		      $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
		      $(cmd_secanalysis),\
		      rm -f $@; $(AR) rcs $@)

$(builtin-target): $(obj-y) FORCE
@@ -316,7 +321,7 @@ $($(subst $(obj)/,,$(@:.o=-objs))) \
$($(subst $(obj)/,,$(@:.o=-y)))), $^)
 
quiet_cmd_link_multi-y = LD      $@
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps)
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)

quiet_cmd_link_multi-m = LD [M]  $@
cmd_link_multi-m = $(cmd_link_multi-y)