From: Kees Cook <keescook@chromium.org>
To: Masahiro Yamada <masahiroy@kernel.org>
Cc: linux-kbuild@vger.kernel.org,
Sami Tolvanen <samitolvanen@google.com>,
linux-kernel@vger.kernel.org,
Michal Marek <michal.lkml@markovi.net>,
Nick Desaulniers <ndesaulniers@google.com>
Subject: Re: [PATCH 03/13] kbuild: detect objtool changes correctly and remove .SECONDEXPANSION
Date: Wed, 18 Aug 2021 19:55:37 -0700 [thread overview]
Message-ID: <202108181952.14AEEED@keescook> (raw)
In-Reply-To: <20210819005744.644908-4-masahiroy@kernel.org>
On Thu, Aug 19, 2021 at 09:57:34AM +0900, Masahiro Yamada wrote:
> This reverts commit 8852c5524029 ("kbuild: Fix objtool dependency for
> 'OBJECT_FILES_NON_STANDARD_<obj> := n'"), and fix the dependency in a
> cleaner way.
>
> Using .SECONDEXPANSION is expensive since Makefile.build is parsed
> twice every time, and the escaping dollars makes the code unreadable.
>
> Adding include/config/* as dependency is not maintainable either because
> objtool_args is dependent on more CONFIG options.
>
> A better fix is to include the objtool command in *.cmd files so any
> command change is naturally detected by if_change.
>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
>
> scripts/Makefile.build | 28 ++++++++++------------------
> 1 file changed, 10 insertions(+), 18 deletions(-)
>
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index 31154e44c251..3e4cd1439cd4 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -155,7 +155,7 @@ $(obj)/%.ll: $(src)/%.c FORCE
> # (See cmd_cc_o_c + relevant part of rule_cc_o_c)
>
> quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
> - cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
> + cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< $(cmd_objtool)
>
> ifdef CONFIG_MODVERSIONS
> # When module versioning is enabled the following steps are executed:
> @@ -223,6 +223,8 @@ endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
>
> ifdef CONFIG_STACK_VALIDATION
>
> +objtool := $(objtree)/tools/objtool/objtool
> +
> # Objtool arguments are also needed for modfinal with LTO, so we define
> # then here to avoid duplication.
> objtool_args = \
> @@ -237,26 +239,19 @@ objtool_args = \
>
> ifndef CONFIG_LTO_CLANG
>
> -__objtool_obj := $(objtree)/tools/objtool/objtool
> -
> # '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
> cmd_objtool = $(if $(patsubst y%,, \
> $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
> - $(__objtool_obj) $(objtool_args) $@)
> -objtool_obj = $(if $(patsubst y%,, \
> - $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
> - $(__objtool_obj))
> + ; $(objtool) $(objtool_args) $@)
This is extremely clever -- pasting commands together. :)
Does this correctly propagate failures in the first half of the command?
For example, now we'd have:
gcc flags..... -c -o out in ; objtool...
But I think objtool will run even on gcc failure, and "make" won't see
the failure from gcc? I need to go test this.
-Kees
> +
> +# Rebuild all objects when objtool is updated
> +objtool_dep = $(objtool)
>
> endif # CONFIG_LTO_CLANG
> endif # CONFIG_STACK_VALIDATION
>
> -# Rebuild all objects when objtool changes, or is enabled/disabled.
> -objtool_dep = $(objtool_obj) \
> - $(wildcard include/config/ORC_UNWINDER \
> - include/config/STACK_VALIDATION)
> -
> ifdef CONFIG_TRIM_UNUSED_KSYMS
> cmd_gen_ksymdeps = \
> $(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
> @@ -270,7 +265,6 @@ define rule_cc_o_c
> $(call cmd,gen_ksymdeps)
> $(call cmd,checksrc)
> $(call cmd,checkdoc)
> - $(call cmd,objtool)
> $(call cmd,modversions_c)
> $(call cmd,record_mcount)
> endef
> @@ -278,13 +272,11 @@ endef
> define rule_as_o_S
> $(call cmd_and_fixdep,as_o_S)
> $(call cmd,gen_ksymdeps)
> - $(call cmd,objtool)
> $(call cmd,modversions_S)
> endef
>
> # Built-in and composite module parts
> -.SECONDEXPANSION:
> -$(obj)/%.o: $(src)/%.c $(recordmcount_source) $$(objtool_dep) FORCE
> +$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
> $(call if_changed_rule,cc_o_c)
> $(call cmd,force_checksrc)
>
> @@ -367,7 +359,7 @@ $(obj)/%.s: $(src)/%.S FORCE
> $(call if_changed_dep,cpp_s_S)
>
> quiet_cmd_as_o_S = AS $(quiet_modtag) $@
> - cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
> + cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< $(cmd_objtool)
>
> ifdef CONFIG_ASM_MODVERSIONS
>
> @@ -386,7 +378,7 @@ cmd_modversions_S = \
> fi
> endif
>
> -$(obj)/%.o: $(src)/%.S $$(objtool_dep) FORCE
> +$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE
> $(call if_changed_rule,as_o_S)
>
> targets += $(filter-out $(subdir-builtin), $(real-obj-y))
> --
> 2.30.2
>
--
Kees Cook
next prev parent reply other threads:[~2021-08-19 2:55 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-19 0:57 [PATCH 00/13] kbuild: refactoring after Clang LTO Masahiro Yamada
2021-08-19 0:57 ` [PATCH 01/13] kbuild: move objtool_args back to scripts/Makefile.build Masahiro Yamada
2021-08-19 2:45 ` Kees Cook
2021-08-19 0:57 ` [PATCH 02/13] gen_compile_commands: extract compiler command from a series of commands Masahiro Yamada
2021-08-19 6:48 ` Kees Cook
2021-08-19 0:57 ` [PATCH 03/13] kbuild: detect objtool changes correctly and remove .SECONDEXPANSION Masahiro Yamada
2021-08-19 2:55 ` Kees Cook [this message]
2021-08-19 3:18 ` Masahiro Yamada
2021-08-19 0:57 ` [PATCH 04/13] kbuild: remove unused quiet_cmd_update_lto_symversions Masahiro Yamada
2021-08-19 6:19 ` Kees Cook
2021-08-19 0:57 ` [PATCH 05/13] kbuild: remove stale *.symversions Masahiro Yamada
2021-08-19 6:29 ` Kees Cook
2021-08-19 0:57 ` [PATCH 06/13] kbuild: merge vmlinux_link() between the ordinary link and Clang LTO Masahiro Yamada
2021-08-19 2:42 ` Kees Cook
2021-08-19 0:57 ` [PATCH 07/13] kbuild: do not remove 'linux' link in scripts/link-vmlinux.sh Masahiro Yamada
2021-08-19 6:32 ` Kees Cook
2021-08-19 0:57 ` [PATCH 08/13] kbuild: merge vmlinux_link() between ARCH=um and other architectures Masahiro Yamada
2021-08-19 2:43 ` Kees Cook
2021-08-19 0:57 ` [PATCH 09/13] kbuild: do not create built-in.a.symversions or lib.a.symversions Masahiro Yamada
2021-08-19 6:41 ` Kees Cook
2021-08-28 11:57 ` Masahiro Yamada
2021-08-19 0:57 ` [PATCH 10/13] kbuild: build modules in the same way with/without Clang LTO Masahiro Yamada
2021-08-19 6:59 ` Kees Cook
2021-08-19 8:11 ` Masahiro Yamada
2021-08-19 0:57 ` [PATCH 11/13] kbuild: always postpone CRC links for module versioning Masahiro Yamada
2021-08-19 6:43 ` Kees Cook
2021-08-19 0:57 ` [PATCH 12/13] kbuild: merge cmd_modversions_c and cmd_modversions_S Masahiro Yamada
2021-08-19 3:06 ` Kees Cook
2021-08-19 0:57 ` [PATCH 13/13] kbuild: merge cmd_ar_builtin and cmd_ar_module Masahiro Yamada
2021-08-19 3:01 ` Kees Cook
2021-08-25 4:57 ` [PATCH 00/13] kbuild: refactoring after Clang LTO Masahiro Yamada
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202108181952.14AEEED@keescook \
--to=keescook@chromium.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=masahiroy@kernel.org \
--cc=michal.lkml@markovi.net \
--cc=ndesaulniers@google.com \
--cc=samitolvanen@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.