-next build error due to "kbuild: Leave objtool binary around with 'make clean'"

From: Thorsten Leemhuis

Date: Mon Mar 02 2026 - 14:22:14 EST


On 2/28/26 06:40, Nathan Chancellor wrote:
> The difference between 'make clean' and 'make mrproper' is documented in
> 'make help' as:
>
> clean - Remove most generated files but keep the config and
> enough build support to build external modules
> mrproper - Remove all generated files + config + various backup files
>
> After commit 68b4fe32d737 ("kbuild: Add objtool to top-level clean
> target"), running 'make clean' then attempting to build an external
> module with the resulting build directory fails with
>
> $ make ARCH=x86_64 O=build clean
>
> $ make -C build M=... MO=...
> ...
> /bin/sh: line 1: .../build/tools/objtool/objtool: No such file or directory
>
> as 'make clean' removes the objtool binary.
>
> Split the objtool clean target into mrproper and clean like Kbuild does
> and remove all generated artifacts with 'make clean' except for the
> objtool binary, which is removed with 'make mrproper'.

Thx for fixing this regression, sadly this caused my daily -next rpm
builds for Fedora to fail on x86_64 during a "make mrproper":

""
kernel.spec:2485: InitBuildVars: Copy files
+ /usr/bin/make -s 'HOSTCFLAGS=-O2 -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 ' 'HOSTLDFLAGS=-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' -j32 mrproper
find: cannot delete ‘/builddir/build/BUILD/kernel-7.0.0-build/kernel-next-20260302/linux-7.0.0-0.0.next.20260302.121.vanilla.fc42.x86_64/tools/objtool/.check.o.cmd’: No such file or directory
find: cannot delete ‘/builddir/build/BUILD/kernel-7.0.0-build/kernel-next-20260302/linux-7.0.0-0.0.next.20260302.121.vanilla.fc42.x86_64/tools/objtool/.elf.o.cmd’: No such file or directory
[and many more like these]
""
For the full build log, see:
https://download.copr.fedorainfracloud.org/results/@kernel-vanilla/next/fedora-42-x86_64/10183736-next-next-all/builder-live.log.gz

This is almost exactly the rpm spec file that is used in Fedora rawhide.
The sections that causes this looks like this:

"""
%{log_msg "InitBuildVars: Copy files"}
%{make} %{?_smp_mflags} mrproper
cp configs/$Config .config
"""

So it could be something strange in there that causes this, but from a
quick look I did not see what. And reverting this patch makes things
work again:
https://download.copr.fedorainfracloud.org/results/@kernel-vanilla/next/fedora-42-x86_64/10184184-kernel/builder-live.log.gz

Ciao, Thorsten


> Cc: stable@xxxxxxxxxxxxxxx
> Fixes: 68b4fe32d737 ("kbuild: Add objtool to top-level clean target")
> Reported-by: Michal Suchanek <msuchanek@xxxxxxx>
> Closes: https://lore.kernel.org/20260225112633.6123-1-msuchanek@xxxxxxx/
> Reported-by: Rainer Fiebig <jrf@xxxxxxxxxxx>
> Closes: https://lore.kernel.org/62d12399-76e5-3d40-126a-7490b4795b17@xxxxxxxxxxx/
> Signed-off-by: Nathan Chancellor <nathan@xxxxxxxxxx>
> ---
> I realize that this will technically decend into tools/objtool twice
> during cleaning when running mrproper but I don't think it is the end of
> the world for a much simpler implementation.
>
> I can take this via kbuild-fixes with a proper Ack or it can go through
> -tip, does not matter to me.
> ---
> Makefile | 8 ++++----
> tools/objtool/Makefile | 6 ++++--
> 2 files changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index e944c6e71e81..d76d706a5580 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1497,13 +1497,13 @@ ifneq ($(wildcard $(resolve_btfids_O)),)
> $(Q)$(MAKE) -sC $(srctree)/tools/bpf/resolve_btfids O=$(resolve_btfids_O) clean
> endif
>
> -PHONY += objtool_clean
> +PHONY += objtool_clean objtool_mrproper
>
> objtool_O = $(abspath $(objtree))/tools/objtool
>
> -objtool_clean:
> +objtool_clean objtool_mrproper:
> ifneq ($(wildcard $(objtool_O)),)
> - $(Q)$(MAKE) -sC $(abs_srctree)/tools/objtool O=$(objtool_O) srctree=$(abs_srctree) clean
> + $(Q)$(MAKE) -sC $(abs_srctree)/tools/objtool O=$(objtool_O) srctree=$(abs_srctree) $(patsubst objtool_%,%,$@)
> endif
>
> tools/: FORCE
> @@ -1686,7 +1686,7 @@ PHONY += $(mrproper-dirs) mrproper
> $(mrproper-dirs):
> $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
>
> -mrproper: clean $(mrproper-dirs)
> +mrproper: clean objtool_mrproper $(mrproper-dirs)
> $(call cmd,rmfiles)
> @find . $(RCS_FIND_IGNORE) \
> \( -name '*.rmeta' \) \
> diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
> index 6964175abdfd..50d3e38e6137 100644
> --- a/tools/objtool/Makefile
> +++ b/tools/objtool/Makefile
> @@ -142,13 +142,15 @@ $(LIBSUBCMD)-clean:
> $(Q)$(RM) -r -- $(LIBSUBCMD_OUTPUT)
>
> clean: $(LIBSUBCMD)-clean
> - $(call QUIET_CLEAN, objtool) $(RM) $(OBJTOOL)
> $(Q)find $(OUTPUT) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
> $(Q)$(RM) $(OUTPUT)arch/x86/lib/cpu-feature-names.c $(OUTPUT)fixdep
> $(Q)$(RM) $(OUTPUT)arch/x86/lib/inat-tables.c $(OUTPUT)fixdep
> $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.objtool
> $(Q)$(RM) -r -- $(OUTPUT)feature
>
> +mrproper: clean
> + $(call QUIET_CLEAN, objtool) $(RM) $(OBJTOOL)
> +
> FORCE:
>
> -.PHONY: clean FORCE
> +.PHONY: clean mrproper FORCE
>
> ---
> base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f
> change-id: 20260227-avoid-objtool-binary-removal-clean-83ce7fbcc8a1
>
> Best regards,
> --
> Nathan Chancellor <nathan@xxxxxxxxxx>
>
>