When PLATFORM_LIBGCC was added to linker command it was not
added to the dependency of the .so and other rules. Thus a build can
try to link *_efi.so files before lib.a from PLATFORM_LIBGCC is available.
This was seen in yocto autobuilder builds with u-boot 2025.07
update, see https://lists.openembedded.org/g/openembedded-core/message/220004

https://autobuilder.yoctoproject.org/valkyrie/api/v2/logs/2914600/raw_inline

|    rm -f lib/efi_loader/built-in.o; arm-poky-linux-gnueabi-ar cDPrsT 
lib/efi_loader/built-in.o lib/efi_loader/efi_bootmgr.o 
lib/efi_loader/efi_bootbin.o lib/efi_loader/efi_boottime.o 
lib/efi_loader/efi_helper.o lib/efi_loader/efi_console.o 
lib/efi_loader/efi_device_path.o lib/efi_loader/efi_device_path_to_text.o 
lib/efi_loader/efi_device_path_utilities.o lib/efi_loader/efi_dt_fixup.o 
lib/efi_loader/efi_fdt.o lib/efi_loader/efi_file.o lib/efi_loader/efi_hii.o 
lib/efi_loader/efi_hii_config.o lib/efi_loader/efi_image_loader.o 
lib/efi_loader/efi_load_options.o lib/efi_loader/efi_memory.o 
lib/efi_loader/efi_root_node.o lib/efi_loader/efi_runtime.o 
lib/efi_loader/efi_setup.o lib/efi_loader/efi_string.o 
lib/efi_loader/efi_unicode_collation.o lib/efi_loader/efi_var_common.o 
lib/efi_loader/efi_var_mem.o lib/efi_loader/efi_variable.o 
lib/efi_loader/efi_var_file.o lib/efi_loader/efi_watchdog.o 
lib/efi_loader/efi_disk.o lib/efi_loader/efi_net.o lib/efi_loader/efi_smbios.o 
lib/efi_loader/efi_load_initrd.o lib/efi_loader/efi_conformance.o
|   arm-poky-linux-gnueabi-ld.bfd -nostdlib -zexecstack -znocombreloc -znorelro 
--no-warn-rwx-segments -L 
/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3119200/tmp/work/beaglebone_yocto-poky-linux-gnueabi/u-boot/2025.07/sources/u-boot-2025.07
 -T arch/arm/lib/elf_arm_efi.lds -shared -Bsymbolic -s 
lib/efi_loader/helloworld.o lib/efi_loader/efi_crt0.o 
lib/efi_loader/efi_reloc.o lib/efi_loader/efi_freestanding.o arch/arm/lib/lib.a 
-o lib/efi_loader/helloworld_efi.so
| arm-poky-linux-gnueabi-ld.bfd: cannot find arch/arm/lib/lib.a: No such file 
or directory
| make[3]: *** [scripts/Makefile.lib:512: lib/efi_loader/helloworld_efi.so] 
Error 1

The issue is hard to reproduce but this change can artificially trigger it:

  --- a/scripts/Makefile.build
  +++ b/scripts/Makefile.build
@@ -353,7 +353,7 @@ $(modorder-target): $(subdir-ym) FORCE
 #
 ifdef lib-target
 quiet_cmd_link_l_target = AR      $@
-cmd_link_l_target = rm -f $@; $(AR) cDPrsT$(KBUILD_ARFLAGS) $@ $(lib-y)
+cmd_link_l_target = rm -f $@ && echo "HACK, delaying build!" && sleep 60 && 
$(AR) cDPrsT$(KBUILD_ARFLAGS) $@ $(lib-y)

 $(lib-target): $(lib-y) FORCE
        $(call if_changed,link_l_target)

Then run a rebuild with:

$  rm -f $( find build/ -name lib.a -or -name helloworld_efi.so ) && \
   make
...
  arm-poky-linux-gnueabi-ld.bfd -nostdlib -zexecstack -znocombreloc -znorelro 
--no-warn-rwx-segments -L /home/mcfrisk/src/base/repo/poky/build_bea
glebone/tmp/work/beaglebone_yocto-poky-linux-gnueabi/u-boot/2025.07/sources/u-boot-2025.07
 -T arch/arm/lib/elf_arm_efi.lds -shared -Bsymbolic -s 
lib/efi_loader/helloworld.o lib/efi_loader/efi_crt0.o 
lib/efi_loader/efi_reloc.o lib/efi_loader/efi_freestanding.o arch/arm/lib/lib.a 
-o lib/efi_loader/helloworld_efi.so
arm-poky-linux-gnueabi-ld.bfd: cannot find arch/arm/lib/lib.a: No such file or 
directory
make[3]: *** [scripts/Makefile.lib:512: lib/efi_loader/helloworld_efi.so] Error 
1

Fix by introducing PLATFORM_LIBGCC_LIBA variable with only lib.a
filename which is then used to add the dependency in rules which use
PLATFORM_LIBGCC. This should not impact builds which don't set
PLATFORM_LIBGCC_LIBA and PLATFORM_LIBGCC usage stays as is.

Fixes: 43d43241d1c9 ("scripts/Makefile.lib: add PLATFORM_LIBGCC to efi linking")

Cc: Adriano Cordova <adria...@gmail.com>
Cc: Fabio Estevam <feste...@gmail.com>
Signed-off-by: Mikko Rapeli <mikko.rap...@linaro.org>
---
 Makefile                     | 4 +++-
 examples/standalone/Makefile | 2 +-
 scripts/Makefile.lib         | 2 +-
 scripts/Makefile.xpl         | 3 ++-
 4 files changed, 7 insertions(+), 4 deletions(-)

v3: added "export PLATFORM_LIBGCC_LIBA" like PLATFORM_LIBGCC, not sure
    how testing worked without this before

v2: introduced PLATFORM_LIBGCC_LIBA variable with just lib.a filename,
    PLATFORM_LIBGCC can have other flags too
    https://lists.denx.de/pipermail/u-boot/2025-July/594034.html

v1: https://lists.denx.de/pipermail/u-boot/2025-July/593982.html

diff --git a/Makefile b/Makefile
index 1a5c77d7caf0..a0797f36f7f6 100644
--- a/Makefile
+++ b/Makefile
@@ -911,7 +911,8 @@ u-boot-main := $(libs-y)
 
 # Add GCC lib
 ifeq ($(CONFIG_USE_PRIVATE_LIBGCC),y)
-PLATFORM_LIBGCC = arch/$(ARCH)/lib/lib.a
+PLATFORM_LIBGCC_LIBA = arch/$(ARCH)/lib/lib.a
+PLATFORM_LIBGCC = $(PLATFORM_LIBGCC_LIBA)
 else
 ifndef CONFIG_CC_IS_CLANG
 PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(c_flags) 
-print-libgcc-file-name`) -lgcc
@@ -926,6 +927,7 @@ endif
 
 export PLATFORM_LIBS
 export PLATFORM_LIBGCC
+export PLATFORM_LIBGCC_LIBA
 
 # Special flags for CPP when processing the linker script.
 # Pass the version down so we can handle backwards compatibility
diff --git a/examples/standalone/Makefile b/examples/standalone/Makefile
index 9b57f1c0c66c..aa9e3121cf9a 100644
--- a/examples/standalone/Makefile
+++ b/examples/standalone/Makefile
@@ -64,7 +64,7 @@ quiet_cmd_link_elf = LD      $@
       cmd_link_elf = $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_STANDALONE) -g  \
                     -o $@ -e $(SYM_PREFIX)$(@F) $< $(LIB) $(PLATFORM_LIBGCC)
 
-$(ELF): $(obj)/%: $(obj)/%.o $(LIB) FORCE
+$(ELF): $(obj)/%: $(obj)/%.o $(LIB) $(PLATFORM_LIBGCC_LIBA) FORCE
        $(call if_changed,link_elf)
 
 $(obj)/%.srec: OBJCOPYFLAGS += -O srec
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index e89a4a51b74d..cef3863dfdc4 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -508,7 +508,7 @@ $(obj)/efi_reloc.o: 
$(srctree)/arch/$(ARCH)/lib/$(EFI_RELOC:.o=.c) $(recordmcoun
        $(call cmd,force_checksrc)
        $(call if_changed_rule,cc_o_c)
 
-$(obj)/%_efi.so: $(obj)/%.o $(obj)/efi_crt0.o $(obj)/efi_reloc.o 
$(obj)/efi_freestanding.o
+$(obj)/%_efi.so: $(PLATFORM_LIBGCC_LIBA) $(obj)/%.o $(obj)/efi_crt0.o 
$(obj)/efi_reloc.o $(obj)/efi_freestanding.o
        $(call cmd,efi_ld)
 
 targets += $(obj)/efi_crt0.o $(obj)/efi_reloc.o $(obj)/efi_freestanding.o
diff --git a/scripts/Makefile.xpl b/scripts/Makefile.xpl
index 43f27874f9fe..68c88293f0d9 100644
--- a/scripts/Makefile.xpl
+++ b/scripts/Makefile.xpl
@@ -139,7 +139,8 @@ libs-y := $(patsubst %/, %/built-in.o, $(libs-y))
 
 # Add GCC lib
 ifeq ($(CONFIG_USE_PRIVATE_LIBGCC),y)
-PLATFORM_LIBGCC = arch/$(ARCH)/lib/lib.a
+PLATFORM_LIBGCC_LIBA = arch/$(ARCH)/lib/lib.a
+PLATFORM_LIBGCC = $(PLATFORM_LIBGCC_LIBA)
 PLATFORM_LIBS := $(filter-out %/lib.a, $(filter-out -lgcc, $(PLATFORM_LIBS))) 
$(PLATFORM_LIBGCC)
 endif
 
-- 
2.43.0

Reply via email to