[PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y

Ard Biesheuvel ardb at kernel.org
Wed Jun 25 07:11:44 PDT 2025


On Wed, 25 Jun 2025 at 14:56, Masahiro Yamada <masahiroy at kernel.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 at kernel.org>

Acked-by: Ard Biesheuvel <ardb at kernel.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
>



More information about the linux-arm-kernel mailing list