mirror of https://gitee.com/openkylin/linux.git
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: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
parent
eb8f689046
commit
91341d4b2c
5
Makefile
5
Makefile
|
@ -520,6 +520,11 @@ KBUILD_CFLAGS += -g
|
||||||
KBUILD_AFLAGS += -gdwarf-2
|
KBUILD_AFLAGS += -gdwarf-2
|
||||||
endif
|
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
|
# Force gcc to behave correct even for buggy distributions
|
||||||
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
|
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,36 @@ config HEADERS_CHECK
|
||||||
exported to $(INSTALL_HDR_PATH) (usually 'usr/include' in
|
exported to $(INSTALL_HDR_PATH) (usually 'usr/include' in
|
||||||
your build tree), to make sure they're suitable.
|
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
|
config DEBUG_KERNEL
|
||||||
bool "Kernel debugging"
|
bool "Kernel debugging"
|
||||||
help
|
help
|
||||||
|
|
|
@ -103,6 +103,10 @@ ifneq ($(KBUILD_CHECKSRC),0)
|
||||||
endif
|
endif
|
||||||
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)
|
# Compile C sources (.c)
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
@ -268,7 +272,8 @@ ifdef builtin-target
|
||||||
quiet_cmd_link_o_target = LD $@
|
quiet_cmd_link_o_target = LD $@
|
||||||
# If the list of objects to link is empty, just create an empty built-in.o
|
# If the list of objects to link is empty, just create an empty built-in.o
|
||||||
cmd_link_o_target = $(if $(strip $(obj-y)),\
|
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 $@)
|
rm -f $@; $(AR) rcs $@)
|
||||||
|
|
||||||
$(builtin-target): $(obj-y) FORCE
|
$(builtin-target): $(obj-y) FORCE
|
||||||
|
@ -316,7 +321,7 @@ $($(subst $(obj)/,,$(@:.o=-objs))) \
|
||||||
$($(subst $(obj)/,,$(@:.o=-y)))), $^)
|
$($(subst $(obj)/,,$(@:.o=-y)))), $^)
|
||||||
|
|
||||||
quiet_cmd_link_multi-y = LD $@
|
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] $@
|
quiet_cmd_link_multi-m = LD [M] $@
|
||||||
cmd_link_multi-m = $(cmd_link_multi-y)
|
cmd_link_multi-m = $(cmd_link_multi-y)
|
||||||
|
|
Loading…
Reference in New Issue