On Tue, Aug 31, 2021 at 04:39:57PM +0900, Masahiro Yamada wrote: > For CONFIG_LTO_CLANG=y, the objtool processing is not possible at the > compilation, hence postponed by the link time. > > Reuse $(cmd_objtool) for CONFIG_LTO_CLANG=y by defining objtool-enabled > properly. > > For CONFIG_LTO_CLANG=y: > > objtool-enabled is off for %.o compilation > objtool-enabled is on for %.lto link > > For CONFIG_LTO_CLANG=n: > > objtool-enabled is on for %.o compilation > (but, it depends on OBJECT_FILE_NON_STANDARD) > > Set part-of-module := y for %.lto.o to avoid repeating --module. > > Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > --- > > scripts/Makefile.build | 28 +++++++++++++++++----------- > 1 file changed, 17 insertions(+), 11 deletions(-) > > diff --git a/scripts/Makefile.build b/scripts/Makefile.build > index 21b55f37a23f..afc906cd7256 100644 > --- a/scripts/Makefile.build > +++ b/scripts/Makefile.build > @@ -236,20 +236,26 @@ objtool_args = \ > $(if $(CONFIG_X86_SMAP), --uaccess) \ > $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) > > -ifndef CONFIG_LTO_CLANG > +cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) > +cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) > + > +endif # CONFIG_STACK_VALIDATION > + > +ifdef CONFIG_LTO_CLANG > + > +# Skip objtool for LLVM bitcode > +$(obj)/%o: objtool-enabled := Is this intentionally "%o" instead of "%.o"? (And it later overridden by the "%.lto.o" rule? > + > +else > > # 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory > # 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file > # 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file > > -objtool-enabled = $(if $(filter-out y%, \ > +$(obj)/%o: objtool-enabled = $(if $(filter-out y%, \ > $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y) > > -cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@) > -cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd) > - > -endif # CONFIG_LTO_CLANG > -endif # CONFIG_STACK_VALIDATION > +endif > > ifdef CONFIG_TRIM_UNUSED_KSYMS > cmd_gen_ksymdeps = \ > @@ -289,13 +295,13 @@ cmd_cc_lto_link_modules = \ > $(LD) $(ld_flags) -r -o $@ \ > $(shell [ -s $(@:.lto.o=.o.symversions) ] && \ > echo -T $(@:.lto.o=.o.symversions)) \ > - --whole-archive $(filter-out FORCE,$^) > + --whole-archive $(filter-out FORCE,$^) \ > + $(cmd_objtool) > > -ifdef CONFIG_STACK_VALIDATION > # objtool was skipped for LLVM bitcode, run it now that we have compiled > # modules into native code > -cmd_cc_lto_link_modules += ; $(objtool) $(objtool_args) --module $@ > -endif > +$(obj)/%.lto.o: objtool-enabled = y > +$(obj)/%.lto.o: part-of-module := y > > $(obj)/%.lto.o: $(obj)/%.o FORCE > $(call if_changed,cc_lto_link_modules) > -- > 2.30.2 > -- Kees Cook