On Mon, Mar 14, 2022 at 11:59 PM Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote: > > On Sun, Mar 13, 2022 at 09:52:14AM +0100, Peter Zijlstra wrote: > > On Sat, Mar 12, 2022 at 05:33:39PM -0800, Alexei Starovoitov wrote: > > > During the build with gcc 8.5 I see: > > > > > > arch/x86/crypto/crc32c-intel.o: warning: objtool: file already has > > > .ibt_endbr_seal, skipping > > > arch/x86/crypto/crc32c-intel.o: warning: objtool: file already has > > > .orc_unwind section, skipping > > > LD [M] crypto/async_tx/async_xor.ko > > > LD [M] crypto/authenc.ko > > > make[3]: *** [../scripts/Makefile.modfinal:61: > > > arch/x86/crypto/crc32c-intel.ko] Error 255 > > > make[3]: *** Waiting for unfinished jobs.... > > > > > > but make clean cures it. > > > I suspect it's some missing makefile dependency. > > > > Yes, I recently ran into it; I've been trying to kick Makefile into > > submission but have not had success yet. Will try again on Monday. > > > > Problem appears to be that it will re-link .ko even though .o hasn't > > changed, resulting in duplicate objtool runs. I've been trying to have > > makefile generate .o.objtool empty file to serve as dependency marker to > > avoid doing second objtool run, but like said, no luck yet. > > Masahiro-san, I'm trying the below, but afaict it's not working because > the rule for the .o file itself: > > $(multi-obj-m): FORCE > $(call if_changed,link_multi-m) > > will in fact update the timestamp of the .o file, even if if_changed > nops out the cmd. Concequently all rules that try to use if_changed with > this .o file as a dependency will find it newer and run anyway. > > > remake -x output of a fs/f2fs/ module (re)build: > > Prerequisite 'FORCE' of target 'fs/f2fs/f2fs.o' does not exist. > Must remake target 'fs/f2fs/f2fs.o'. > ../scripts/Makefile.build:454: target 'fs/f2fs/f2fs.o' does not exist > ##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > : > ##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< > Successfully remade target file 'fs/f2fs/f2fs.o'. > Prerequisite 'fs/f2fs/f2fs.o' is newer than target 'fs/f2fs/f2fs.mod'. > Prerequisite 'FORCE' of target 'fs/f2fs/f2fs.mod' does not exist. > Must remake target 'fs/f2fs/f2fs.mod'. > ../scripts/Makefile.build:281: update target 'fs/f2fs/f2fs.mod' due to: fs/f2fs/f2fs.o > ##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > set -e; { echo fs/f2fs/dir.o fs/f2fs/file.o fs/f2fs/inode.o fs/f2fs/namei.o fs/f2fs/hash.o fs/f2fs/super.o fs/f2fs/inline.o fs/f2fs/checkpoint.o fs/f2fs/gc.o fs/f2fs/data.o fs/f2fs/node.o fs/f2fs/segment.o fs/f2fs/recovery.o fs/f2fs/shrinker.o fs/f2fs/extent_cache.o fs/f2fs/sysfs.o fs/f2fs/debug.o fs/f2fs/xattr.o fs/f2fs/acl.o fs/f2fs/iostat.o; echo; } > fs/f2fs/f2fs.mod; printf '%s\n' 'cmd_fs/f2fs/f2fs.mod := { echo fs/f2fs/dir.o fs/f2fs/file.o fs/f2fs/inode.o fs/f2fs/namei.o fs/f2fs/hash.o fs/f2fs/super.o fs/f2fs/inline.o fs/f2fs/checkpoint.o fs/f2fs/gc.o fs/f2fs/data.o fs/f2fs/node.o fs/f2fs/segment.o fs/f2fs/recovery.o fs/f2fs/shrinker.o fs/f2fs/extent_cache.o fs/f2fs/sysfs.o fs/f2fs/debug.o fs/f2fs/xattr.o fs/f2fs/acl.o fs/f2fs/iostat.o; echo; } > fs/f2fs/f2fs.mod' > fs/f2fs/.f2fs.mod.cmd > ##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< > Successfully remade target file 'fs/f2fs/f2fs.mod'. > Prerequisite 'fs/f2fs/f2fs.o' is newer than target 'fs/f2fs/f2fs.objtool'. > Prerequisite 'FORCE' of target 'fs/f2fs/f2fs.objtool' does not exist. > Must remake target 'fs/f2fs/f2fs.objtool'. > ../scripts/Makefile.build:287: update target 'fs/f2fs/f2fs.objtool' due to: fs/f2fs/f2fs.o > ##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > set -e; { echo fs/f2fs/f2fs.o ; ./tools/objtool/objtool orc generate --module --lto --ibt --no-fp --uaccess fs/f2fs/f2fs.o ; } > fs/f2fs/f2fs.objtool; printf '%s\n' 'cmd_fs/f2fs/f2fs.objtool := { echo fs/f2fs/f2fs.o ; ./tools/objtool/objtool orc generate --module --lto --ibt --no-fp --uaccess fs/f2fs/f2fs.o ; } > fs/f2fs/f2fs.objtool' > fs/f2fs/.f2fs.objtool.cmd > ##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< > fs/f2fs/f2fs.o: warning: objtool: file already has .static_call_sites section, skipping > fs/f2fs/f2fs.o: warning: objtool: file already has .ibt_endbr_seal, skipping > fs/f2fs/f2fs.o: warning: objtool: file already has .orc_unwind section, skipping > ../scripts/Makefile.build:286: *** [fs/f2fs/f2fs.objtool] error 255 > > > Where we can see that we don't re-generate f2fs.o (empty command), but > then we do re-generate f2fs.mod because f2fs.o is newer and the same > happens for the new f2fs.objtool. > > Help? Help? I had never noticed this thread before because you did not CC me or kbuild ML. Looking at the build system changes: https://lore.kernel.org/all/20220308154319.528181453@xxxxxxxxxxxxx/ https://lore.kernel.org/all/20220308154319.822545231@xxxxxxxxxxxxx/ Both patches are wrong. So is the fix-up you appended lator in this thread. Apparently, you were screwing up Kbuild in a brown paper bag. So scared. > > --- > Index: linux-2.6/scripts/Makefile.build > =================================================================== > --- linux-2.6.orig/scripts/Makefile.build > +++ linux-2.6/scripts/Makefile.build > @@ -92,6 +92,10 @@ ifdef CONFIG_LTO_CLANG > targets-for-modules += $(patsubst %.o, %.lto.o, $(filter %.o, $(obj-m))) > endif > > +ifdef CONFIG_X86_KERNEL_IBT > +targets-for-modules += $(patsubst %.o, %.objtool, $(filter %.o, $(obj-m))) > +endif > + > ifdef need-modorder > targets-for-modules += $(obj)/modules.order > endif > @@ -276,6 +280,12 @@ cmd_mod = { \ > $(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o FORCE > $(call if_changed,mod) > > +cmd_objtool_mod = \ > + { echo $< $(cmd_objtool) ; } > $@ > + > +$(obj)/%.objtool: $(obj)/%$(mod-prelink-ext).o FORCE > + $(call if_changed,objtool_mod) > + > quiet_cmd_cc_lst_c = MKLST $@ > cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ > $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ > Index: linux-2.6/scripts/Makefile.lib > =================================================================== > --- linux-2.6.orig/scripts/Makefile.lib > +++ linux-2.6/scripts/Makefile.lib > @@ -552,9 +552,8 @@ objtool_args = \ > $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \ > $(if $(CONFIG_SLS), --sls) > > -cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) > -cmd_objtool_mod = $(if $(objtool-enabled), $(objtool) $(objtool_args) $(@:.ko=.o) ; ) > -cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) > +cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $(@:.objtool=.o)) > +cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$(@:.objtool=.o): $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) > > endif # CONFIG_STACK_VALIDATION > > @@ -575,8 +574,8 @@ $(obj)/%.o: objtool-enabled := > > # instead run objtool on the module as a whole, right before > # the final link pass with the linker script. > -%.ko: objtool-enabled = y > -%.ko: part-of-module := y > +$(obj)/%.objtool: objtool-enabled = y > +$(obj)/%.objtool: part-of-module := y > > else > > Index: linux-2.6/scripts/Makefile.modfinal > =================================================================== > --- linux-2.6.orig/scripts/Makefile.modfinal > +++ linux-2.6/scripts/Makefile.modfinal > @@ -32,7 +32,6 @@ ARCH_POSTLINK := $(wildcard $(srctree)/a > > quiet_cmd_ld_ko_o = LD [M] $@ > cmd_ld_ko_o += \ > - $(cmd_objtool_mod) \ > $(LD) -r $(KBUILD_LDFLAGS) \ > $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ > -T scripts/module.lds -o $@ $(filter %.o, $^); \ -- Best Regards Masahiro Yamada