summaryrefslogtreecommitdiffstats
path: root/Makefile
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2018-03-16 03:37:15 -0400
committerMasahiro Yamada <yamada.masahiro@socionext.com>2018-03-25 13:01:24 -0400
commit3fdc7d3fe4c04bab0305838cf662ae30051cc192 (patch)
tree358ae9df059dd8ca0321dfb6c9d7088be3e8d81b /Makefile
parentfbfa9be9904e2c0d0c97d860fd071089d21dd9be (diff)
kbuild: link vmlinux only once for CONFIG_TRIM_UNUSED_KSYMS
If CONFIG_TRIM_UNUSED_KSYMS is enabled and the kernel is built from a pristine state, the vmlinux is linked twice. [1] A user runs 'make' [2] First build with empty autoksyms.h [3] adjust_autoksyms.sh updates autoksyms.h and recurses 'make vmlinux' --------(begin sub-make)-------- [4] Second build with new autoksyms.h [5] link-vmlinux.sh is invoked because vmlinux is missing ---------(end sub-make)--------- [6] link-vmlinux.sh is invoked again despite vmlinux is up-to-date. The reason of [6] is probably because Make already decided to update vmlinux at the time of [2] because vmlinux was missing when Make built up the dependency graph. Because if_changed is implemented based on $?, this issue can be narrowed down to how Make handles $?. You can test it with the following simple code: [Test Makefile] A: B @echo newer prerequisite: $? cp B A B: C cp C B touch A [Result] $ rm -f A B $ touch C $ make cp C B touch A newer prerequisite: B cp B A Here, 'A' has been touched in the recipe of 'B'. So, the dependency 'A: B' has already been met before the recipe of 'A' is executed. However, Make does not notice the fact that the recipe of 'B' also updates 'A' as a side-effect. The situation is similar in this case; the vmlinux has actually been updated in the vmlinux_prereq target. Make cannot predict this, so judges the vmlinux is old. link-vmlinux.sh is costly, so it is better to not run it when unneeded. Split CONFIG_TRIM_UNUSED_KSYMS recursion to a dedicated target. The reason of commit 2441e78b1919 ("kbuild: better abstract vmlinux sequential prerequisites") was to cater to CONFIG_BUILD_DOCSRC, but it was later removed by commit 184892925118 ("samples: move blackfin gptimers-example from Documentation"). Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Acked-by: Nicolas Pitre <nico@linaro.org>
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile22
1 files changed, 10 insertions, 12 deletions
diff --git a/Makefile b/Makefile
index 416e6b1eb4b8..646c5d99d7df 100644
--- a/Makefile
+++ b/Makefile
@@ -996,17 +996,9 @@ export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Doc
996 996
997vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) $(KBUILD_VMLINUX_LIBS) 997vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) $(KBUILD_VMLINUX_LIBS)
998 998
999# Include targets which we want to execute sequentially if the rest of the 999# Recurse until adjust_autoksyms.sh is satisfied
1000# kernel build went well. If CONFIG_TRIM_UNUSED_KSYMS is set, this might be 1000PHONY += autoksyms_recursive
1001# evaluated more than once. 1001autoksyms_recursive: $(vmlinux-deps)
1002PHONY += vmlinux_prereq
1003vmlinux_prereq: $(vmlinux-deps) FORCE
1004ifdef CONFIG_HEADERS_CHECK
1005 $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
1006endif
1007ifdef CONFIG_GDB_SCRIPTS
1008 $(Q)ln -fsn $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py)
1009endif
1010ifdef CONFIG_TRIM_UNUSED_KSYMS 1002ifdef CONFIG_TRIM_UNUSED_KSYMS
1011 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \ 1003 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
1012 "$(MAKE) -f $(srctree)/Makefile vmlinux" 1004 "$(MAKE) -f $(srctree)/Makefile vmlinux"
@@ -1032,7 +1024,13 @@ cmd_link-vmlinux = \
1032 $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) ; \ 1024 $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) ; \
1033 $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) 1025 $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
1034 1026
1035vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE 1027vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
1028ifdef CONFIG_HEADERS_CHECK
1029 $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
1030endif
1031ifdef CONFIG_GDB_SCRIPTS
1032 $(Q)ln -fsn $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py)
1033endif
1036 +$(call if_changed,link-vmlinux) 1034 +$(call if_changed,link-vmlinux)
1037 1035
1038# Build samples along the rest of the kernel 1036# Build samples along the rest of the kernel