[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAMj1kXGUcQ2QpFMB8dfm=0q6yzUSBrxs_Xuo4q7HWPrp-f-+DQ@mail.gmail.com>
Date: Wed, 25 Jun 2025 16:11:44 +0200
From: Ard Biesheuvel <ardb@...nel.org>
To: Masahiro Yamada <masahiroy@...nel.org>
Cc: Catalin Marinas <catalin.marinas@....com>, Will Deacon <will@...nel.org>,
linux-arm-kernel@...ts.infradead.org, linux-kbuild@...r.kernel.org,
linux-efi@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y
On Wed, 25 Jun 2025 at 14:56, Masahiro Yamada <masahiroy@...nel.org> wrote:
>
> When CONFIG_DEBUG_EFI is enabled, some objects are needlessly rebuilt.
>
> [Steps to reproduce]
>
> Enable CONFIG_DEBUG_EFI and run 'make' twice in a clean source tree.
> On the second run, arch/arm64/kernel/head.o is rebuilt even though
> no files have changed.
>
> $ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- clean
> $ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
> [ snip ]
> $ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
> CALL scripts/checksyscalls.sh
> AS arch/arm64/kernel/head.o
> AR arch/arm64/kernel/built-in.a
> AR arch/arm64/built-in.a
> AR built-in.a
> [ snip ]
>
> The issue is caused by the use of the $(realpath ...) function.
>
> At the time arch/arm64/kernel/Makefile is parsed on the first run,
> $(objtree)/vmlinux does not exist. As a result,
> $(realpath $(objtree)/vmlinux) expands to an empty string.
>
> On the second run of Make, $(objtree)/vmlinux already exists, so
> $(realpath $(objtree)/vmlinux) expands to the absolute path of vmlinux.
> However, this change in the command line causes arch/arm64/kernel/head.o
> to be rebuilt.
>
> To address this issue, use $(abspath ...) instead, which does not require
> the file to exist. While $(abspath ...) does not resolve symlinks, this
> should be fine from a debugging perspective.
>
> The GNU Make manual [1] clearly explains the difference between the two:
>
> $(realpath names...)
> For each file name in names return the canonical absolute name.
> A canonical name does not contain any . or .. components, nor any
> repeated path separators (/) or symlinks. In case of a failure the
> empty string is returned. Consult the realpath(3) documentation for
> a list of possible failure causes.
>
> $(abspath namees...)
> For each file name in names return an absolute name that does not
> contain any . or .. components, nor any repeated path separators (/).
> Note that, in contrast to realpath function, abspath does not resolve
> symlinks and does not require the file names to refer to an existing
> file or directory. Use the wildcard function to test for existence.
>
> The same problem exists in drivers/firmware/efi/libstub/Makefile.zboot.
> On the first run of Make, $(obj)/vmlinuz.efi.elf does not exist when the
> Makefile is parsed, so -DZBOOT_EFI_PATH is set to an empty string.
> Replace $(realpath ...) with $(abspath ...) there as well.
>
> [1]: https://www.gnu.org/software/make/manual/make.html#File-Name-Functions
>
> Fixes: 757b435aaabe ("efi: arm64: Add vmlinux debug link to the Image binary")
> Fixes: a050910972bb ("efi/libstub: implement generic EFI zboot")
> Signed-off-by: Masahiro Yamada <masahiroy@...nel.org>
Acked-by: Ard Biesheuvel <ardb@...nel.org>
> ---
>
> arch/arm64/kernel/Makefile | 2 +-
> drivers/firmware/efi/libstub/Makefile.zboot | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
> index 2920b0a51403..a2604c33f35c 100644
> --- a/arch/arm64/kernel/Makefile
> +++ b/arch/arm64/kernel/Makefile
> @@ -81,7 +81,7 @@ obj-y += head.o
> always-$(KBUILD_BUILTIN) += vmlinux.lds
>
> ifeq ($(CONFIG_DEBUG_EFI),y)
> -AFLAGS_head.o += -DVMLINUX_PATH="\"$(realpath $(objtree)/vmlinux)\""
> +AFLAGS_head.o += -DVMLINUX_PATH="\"$(abspath vmlinux)\""
> endif
>
> # for cleaning
> diff --git a/drivers/firmware/efi/libstub/Makefile.zboot b/drivers/firmware/efi/libstub/Makefile.zboot
> index 92e3c73502ba..832deee36e48 100644
> --- a/drivers/firmware/efi/libstub/Makefile.zboot
> +++ b/drivers/firmware/efi/libstub/Makefile.zboot
> @@ -36,7 +36,7 @@ aflags-zboot-header-$(EFI_ZBOOT_FORWARD_CFI) := \
> -DPE_DLL_CHAR_EX=IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT
>
> AFLAGS_zboot-header.o += -DMACHINE_TYPE=IMAGE_FILE_MACHINE_$(EFI_ZBOOT_MACH_TYPE) \
> - -DZBOOT_EFI_PATH="\"$(realpath $(obj)/vmlinuz.efi.elf)\"" \
> + -DZBOOT_EFI_PATH="\"$(abspath $(obj)/vmlinuz.efi.elf)\"" \
> -DZBOOT_SIZE_LEN=$(zboot-size-len-y) \
> -DCOMP_TYPE="\"$(comp-type-y)\"" \
> $(aflags-zboot-header-y)
> --
> 2.43.0
>
Powered by blists - more mailing lists