Message ID | 20220424190811.1678416-26-masahiroy@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kbuild: yet another series of cleanups (modpost and LTO) | expand |
On Mon 25 Apr 2022 04:08:09 GMT Masahiro Yamada wrote: > Do not update objects with version CRCs while the directory > descending. > > Do it at the final link stage. > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Reviewed-by: Nicolas Schier <nicolas@fjasle.eu> > --- > > scripts/Makefile.build | 19 +++---------------- > scripts/Makefile.modfinal | 3 ++- > scripts/link-vmlinux.sh | 4 +++- > 3 files changed, 8 insertions(+), 18 deletions(-) > > diff --git a/scripts/Makefile.build b/scripts/Makefile.build > index e03e85c90b26..aadc16e04632 100644 > --- a/scripts/Makefile.build > +++ b/scripts/Makefile.build > @@ -162,12 +162,9 @@ ifdef CONFIG_MODVERSIONS > # o if <file>.o doesn't contain a __ksymtab version, i.e. does > # not export symbols, it's done. > # o otherwise, we calculate symbol versions using the good old > -# genksyms on the preprocessed source and postprocess them in a way > -# that they are usable as a linker script > -# o generate .tmp_<file>.o from <file>.o using the linker to > -# replace the unresolved symbols __crc_exported_symbol with > -# the actual value of the checksum generated by genksyms > -# o remove .tmp_<file>.o to <file>.o > +# genksyms on the preprocessed source and dump them into .cmd file. > +# modpost will parse .cmd files to retrieve versions to create linker > +# scripts that are fed to the final linking of vmlinux or modules. > > # Generate .o.symversions files for each .o with exported symbols, and link these > # to the kernel and/or modules at the end. > @@ -183,12 +180,6 @@ gen_symversions = \ > > cmd_gen_symversions_c = $(call gen_symversions,c) > > -cmd_modversions = \ > - if [ -r $@.symversions ]; then \ > - $(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \ > - -T $@.symversions; \ > - mv -f $(@D)/.tmp_$(@F) $@; \ > - fi > endif > > ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT > @@ -268,7 +259,6 @@ define rule_cc_o_c > $(call cmd,checkdoc) > $(call cmd,gen_objtooldep) > $(call cmd,gen_symversions_c) > - $(if $(CONFIG_LTO_CLANG),,$(call cmd,modversions)) > $(call cmd,record_mcount) > endef > > @@ -277,7 +267,6 @@ define rule_as_o_S > $(call cmd,gen_ksymdeps) > $(call cmd,gen_objtooldep) > $(call cmd,gen_symversions_S) > - $(call cmd,modversions) > endef > > # Built-in and composite module parts > @@ -291,8 +280,6 @@ ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) > quiet_cmd_cc_prelink_modules = LD [M] $@ > cmd_cc_prelink_modules = \ > $(LD) $(ld_flags) -r -o $@ \ > - $(shell [ -s $(@:.prelink.o=.o.symversions) ] && \ > - echo -T $(@:.prelink.o=.o.symversions)) \ > --whole-archive $(filter-out FORCE,$^) \ > $(cmd_objtool) > > diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal > index 7f39599e9fae..d429e3f9ae1d 100644 > --- a/scripts/Makefile.modfinal > +++ b/scripts/Makefile.modfinal > @@ -34,6 +34,7 @@ quiet_cmd_ld_ko_o = LD [M] $@ > cmd_ld_ko_o += \ > $(LD) -r $(KBUILD_LDFLAGS) \ > $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ > + $(addprefix -T, $(filter %.symver.lds, $(real-prereqs)))\ > -T scripts/module.lds -o $@ $(filter %.o, $^); \ > $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) > > @@ -56,7 +57,7 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ > > > # Re-generate module BTFs if either module's .ko or vmlinux changed > -$(modules): %.ko: %$(mod-prelink-ext).o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE > +$(modules): %.ko: %$(mod-prelink-ext).o %.mod.o $(if $(CONFIG_MODVERSIONS), %.symver.lds) scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE > +$(call if_changed_except,ld_ko_o,vmlinux) > ifdef CONFIG_DEBUG_INFO_BTF_MODULES > +$(if $(newer-prereqs),$(call cmd,btf_ko)) > diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh > index d2c193f82004..66a115f204eb 100755 > --- a/scripts/link-vmlinux.sh > +++ b/scripts/link-vmlinux.sh > @@ -90,7 +90,6 @@ modpost_link() > > if is_enabled CONFIG_MODVERSIONS; then > gen_symversions > - lds="${lds} -T .tmp_symversions.lds" > fi > > # This might take a while, so indicate that we're doing > @@ -196,6 +195,9 @@ vmlinux_link() > fi > > ldflags="${ldflags} ${wl}--script=${objtree}/${KBUILD_LDS}" > + if is_enabled CONFIG_MODVERSIONS; then > + ldflags="${ldflags} ${wl}--script=vmlinux.symver.lds" > + fi > > # The kallsyms linking does not need debug symbols included. > if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then > -- > 2.32.0
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index e03e85c90b26..aadc16e04632 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -162,12 +162,9 @@ ifdef CONFIG_MODVERSIONS # o if <file>.o doesn't contain a __ksymtab version, i.e. does # not export symbols, it's done. # o otherwise, we calculate symbol versions using the good old -# genksyms on the preprocessed source and postprocess them in a way -# that they are usable as a linker script -# o generate .tmp_<file>.o from <file>.o using the linker to -# replace the unresolved symbols __crc_exported_symbol with -# the actual value of the checksum generated by genksyms -# o remove .tmp_<file>.o to <file>.o +# genksyms on the preprocessed source and dump them into .cmd file. +# modpost will parse .cmd files to retrieve versions to create linker +# scripts that are fed to the final linking of vmlinux or modules. # Generate .o.symversions files for each .o with exported symbols, and link these # to the kernel and/or modules at the end. @@ -183,12 +180,6 @@ gen_symversions = \ cmd_gen_symversions_c = $(call gen_symversions,c) -cmd_modversions = \ - if [ -r $@.symversions ]; then \ - $(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \ - -T $@.symversions; \ - mv -f $(@D)/.tmp_$(@F) $@; \ - fi endif ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT @@ -268,7 +259,6 @@ define rule_cc_o_c $(call cmd,checkdoc) $(call cmd,gen_objtooldep) $(call cmd,gen_symversions_c) - $(if $(CONFIG_LTO_CLANG),,$(call cmd,modversions)) $(call cmd,record_mcount) endef @@ -277,7 +267,6 @@ define rule_as_o_S $(call cmd,gen_ksymdeps) $(call cmd,gen_objtooldep) $(call cmd,gen_symversions_S) - $(call cmd,modversions) endef # Built-in and composite module parts @@ -291,8 +280,6 @@ ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) quiet_cmd_cc_prelink_modules = LD [M] $@ cmd_cc_prelink_modules = \ $(LD) $(ld_flags) -r -o $@ \ - $(shell [ -s $(@:.prelink.o=.o.symversions) ] && \ - echo -T $(@:.prelink.o=.o.symversions)) \ --whole-archive $(filter-out FORCE,$^) \ $(cmd_objtool) diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal index 7f39599e9fae..d429e3f9ae1d 100644 --- a/scripts/Makefile.modfinal +++ b/scripts/Makefile.modfinal @@ -34,6 +34,7 @@ quiet_cmd_ld_ko_o = LD [M] $@ cmd_ld_ko_o += \ $(LD) -r $(KBUILD_LDFLAGS) \ $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ + $(addprefix -T, $(filter %.symver.lds, $(real-prereqs)))\ -T scripts/module.lds -o $@ $(filter %.o, $^); \ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) @@ -56,7 +57,7 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ # Re-generate module BTFs if either module's .ko or vmlinux changed -$(modules): %.ko: %$(mod-prelink-ext).o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE +$(modules): %.ko: %$(mod-prelink-ext).o %.mod.o $(if $(CONFIG_MODVERSIONS), %.symver.lds) scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE +$(call if_changed_except,ld_ko_o,vmlinux) ifdef CONFIG_DEBUG_INFO_BTF_MODULES +$(if $(newer-prereqs),$(call cmd,btf_ko)) diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index d2c193f82004..66a115f204eb 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -90,7 +90,6 @@ modpost_link() if is_enabled CONFIG_MODVERSIONS; then gen_symversions - lds="${lds} -T .tmp_symversions.lds" fi # This might take a while, so indicate that we're doing @@ -196,6 +195,9 @@ vmlinux_link() fi ldflags="${ldflags} ${wl}--script=${objtree}/${KBUILD_LDS}" + if is_enabled CONFIG_MODVERSIONS; then + ldflags="${ldflags} ${wl}--script=vmlinux.symver.lds" + fi # The kallsyms linking does not need debug symbols included. if [ "$output" != "${output#.tmp_vmlinux.kallsyms}" ] ; then
Do not update objects with version CRCs while the directory descending. Do it at the final link stage. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> --- scripts/Makefile.build | 19 +++---------------- scripts/Makefile.modfinal | 3 ++- scripts/link-vmlinux.sh | 4 +++- 3 files changed, 8 insertions(+), 18 deletions(-)