* [PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y
@ 2025-06-25 12:55 Masahiro Yamada
2025-06-25 14:11 ` Ard Biesheuvel
2025-07-08 14:44 ` Will Deacon
0 siblings, 2 replies; 3+ messages in thread
From: Masahiro Yamada @ 2025-06-25 12:55 UTC (permalink / raw)
To: Catalin Marinas, Will Deacon, linux-arm-kernel, Ard Biesheuvel
Cc: linux-kbuild, Masahiro Yamada, linux-efi, linux-kernel
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@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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y
2025-06-25 12:55 [PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y Masahiro Yamada
@ 2025-06-25 14:11 ` Ard Biesheuvel
2025-07-08 14:44 ` Will Deacon
1 sibling, 0 replies; 3+ messages in thread
From: Ard Biesheuvel @ 2025-06-25 14:11 UTC (permalink / raw)
To: Masahiro Yamada
Cc: Catalin Marinas, Will Deacon, linux-arm-kernel, linux-kbuild,
linux-efi, linux-kernel
On Wed, 25 Jun 2025 at 14:56, Masahiro Yamada <masahiroy@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@kernel.org>
Acked-by: Ard Biesheuvel <ardb@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
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y
2025-06-25 12:55 [PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y Masahiro Yamada
2025-06-25 14:11 ` Ard Biesheuvel
@ 2025-07-08 14:44 ` Will Deacon
1 sibling, 0 replies; 3+ messages in thread
From: Will Deacon @ 2025-07-08 14:44 UTC (permalink / raw)
To: Catalin Marinas, linux-arm-kernel, Ard Biesheuvel,
Masahiro Yamada
Cc: kernel-team, Will Deacon, linux-kbuild, linux-efi, linux-kernel
On Wed, 25 Jun 2025 21:55:20 +0900, Masahiro Yamada 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.
>
> [...]
Applied to arm64 (for-next/misc), thanks!
[1/1] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y
https://git.kernel.org/arm64/c/344b65804724
Cheers,
--
Will
https://fixes.arm64.dev
https://next.arm64.dev
https://will.arm64.dev
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-07-08 14:52 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-25 12:55 [PATCH] arm64: fix unnecessary rebuilding when CONFIG_DEBUG_EFI=y Masahiro Yamada
2025-06-25 14:11 ` Ard Biesheuvel
2025-07-08 14:44 ` Will Deacon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox