lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ