On 15/05/2026 11:58 pm, Ihor Solodrai wrote:
On 5/14/26 2:32 AM, James Clark wrote:
Building with LLVM=... could result in a different version of lld being
used than the main toolchain for liburandom_read.so because it's
hardcoded to "lld" in this makefile.

Make it consistent with the rest of the LLVM toolchain by adding an LLD
variable to Makefile.include. Keep the fallback for other architectures
in tools/testing/selftests/bpf/Makefile as it seems like it's something
specific to this make rule and shouldn't be global.

Clang accepts either a full path or "ld.lld-15" style inputs to
-fuse-ld= so this will work with LLD defined the same way as the other
LLVM tools. However, for full paths, we need to use ".../ld.lld" instead
of the generic driver "lld", but I don't think the original use of "lld"
was significant as this is always a linux build.

Signed-off-by: James Clark <[email protected]>
---
  tools/scripts/Makefile.include       | 2 ++
  tools/testing/selftests/bpf/Makefile | 8 ++++----
  2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
index 380ad84ac51e..5c2d505cba62 100644
--- a/tools/scripts/Makefile.include
+++ b/tools/scripts/Makefile.include
@@ -67,6 +67,7 @@ ifneq ($(LLVM),)
    $(call allow-override,HOSTAR,$(LLVM_PREFIX)llvm-ar$(LLVM_SUFFIX))
    $(call allow-override,LD,$(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX))
    $(call allow-override,HOSTLD,$(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX))
+  $(call allow-override,LLD,$(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX))
    $(call allow-override,CXX,$(LLVM_PREFIX)clang++$(LLVM_SUFFIX))
    $(call allow-override,STRIP,$(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX))
    $(call allow-override,LLVM_STRIP,$(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX))
@@ -91,6 +92,7 @@ else
    # Some tools still require Clang, LLC and/or LLVM utils
    $(call allow-override,CLANG,clang)
    $(call allow-override,LLC,llc)
+  $(call allow-override,LLD,ld.lld)
    $(call allow-override,LLVM_CONFIG,llvm-config)
    $(call allow-override,LLVM_OBJCOPY,llvm-objcopy)
    $(call allow-override,LLVM_STRIP,llvm-strip)
diff --git a/tools/testing/selftests/bpf/Makefile 
b/tools/testing/selftests/bpf/Makefile
index 6ef6872adbc3..44ba829e5d4d 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -245,9 +245,9 @@ $(OUTPUT)/%:%.c
# LLVM's ld.lld doesn't support all the architectures, so use it only on x86
  ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 riscv))
-LLD := lld
+USE_LD := $(LLD)
  else
-LLD := $(shell command -v $(LD))
+USE_LD := $(shell command -v $(LD))
  endif
# Filter out -static for liburandom_read.so and its dependent targets so that static builds
@@ -258,7 +258,7 @@ $(OUTPUT)/liburandom_read.so: urandom_read_lib1.c 
urandom_read_lib2.c liburandom
                     $(filter-out -static,$(CFLAGS) $(LDFLAGS)) \
                     $(filter %.c,$^) $(filter-out -static,$(LDLIBS)) \
                     -Wno-unused-command-line-argument \
-                    -fuse-ld=$(LLD) -Wl,-znoseparate-code -Wl,--build-id=sha1 \
+                    -fuse-ld=$(USE_LD) -Wl,-znoseparate-code 
-Wl,--build-id=sha1 \

Hi James,

This patch breaks the selftests/bpf build:

$ clang --version
clang version 22.1.3 (CentOS 22.1.3-1.el9)
Target: x86_64-redhat-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Configuration file: /etc/clang/x86_64-redhat-linux-gnu-clang.cfg

$ make LLVM=1 -j$(nproc)
   [...] # ok

$ make LLVM=1 -C tools/testing/selftests/bpf -j$(nproc)

[...] # somewhere in the middle

   LIB      liburandom_read.so
clang: error: invalid linker name in argument '-fuse-ld=ld.lld'
make: *** [Makefile:256: 
/home/isolodrai/workspace/review/linux/tools/testing/selftests/bpf/liburandom_read.so]
 Error 1
make: Leaving directory 
'/home/isolodrai/workspace/review/linux/tools/testing/selftests/bpf'

[...]

Or a simpler reproducer:

$ make LLVM=1 OUTPUT=/tmp/out /tmp/out/liburandom_read.so
   LIB      liburandom_read.so
clang: error: invalid linker name in argument '-fuse-ld=ld.lld'
make: *** [Makefile:256: /tmp/out/liburandom_read.so] Error 1

$ make LLVM=-22 OUTPUT=/tmp/out /tmp/out/liburandom_read.so
   LIB      liburandom_read.so
clang-22: error: invalid linker name in argument '-fuse-ld=ld.lld-22'
make: *** [Makefile:256: /tmp/out/liburandom_read.so] Error 1

I tried your patches, and only then noticed BPF CI caught this too:
https://github.com/kernel-patches/bpf/actions/runs/25943477658/job/76267174885?pr=12082


Thanks for testing. Yeah looks like I made a mistake here testing the various different formats of LLD. Converting it to a full path works with both prefixed and postfixed versions, and that's what's already done for non x86/riscv so I'll do that.

                     -Wl,--version-script=liburandom_read.map \
                     -fPIC -shared -o $@
@@ -268,7 +268,7 @@ $(OUTPUT)/urandom_read: urandom_read.c urandom_read_aux.c $(OUTPUT)/liburandom_r
                     $(filter-out -static,$(CFLAGS) $(LDFLAGS)) $(filter 
%.c,$^) \
                     -Wno-unused-command-line-argument \
                     -lurandom_read $(filter-out -static,$(LDLIBS)) -L$(OUTPUT) 
\
-                    -fuse-ld=$(LLD) -Wl,-znoseparate-code -Wl,--build-id=sha1 \
+                    -fuse-ld=$(USE_LD) -Wl,-znoseparate-code 
-Wl,--build-id=sha1 \
                     -Wl,-rpath=. -o $@
$(OUTPUT)/sign-file: ../../../../scripts/sign-file.c




Reply via email to