Hi Thomas, On Thu, Feb 13, 2025 at 03:55:18PM +0100, Thomas Weißschuh wrote: > The userprog infrastructure links objects files through $(CC). > Either explicitly by manually calling $(CC) on multiple object files or > implicitly by directly compiling a source file to an executable. > The documentation at Documentation/kbuild/llvm.rst indicates that ld.lld would > be used for linking if LLVM=1 is specified. > However clang instead will use either a globally installed cross linker from > $PATH called ${target}-ld or fall back to the system linker, which probably > does not support crosslinking. > For the normal kernel build this is not an issue because the linker is always > executed directly, without the compiler being involved. > > Fix this by passing -fuse-lld and let clang find its matching lld. > > Fixes: 7f3a59db274c ("kbuild: add infrastructure to build userspace programs") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Thomas Weißschuh <thomas.weissschuh@xxxxxxxxxxxxx> First of all, thank you for catching and noticing this! > --- > Makefile | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/Makefile b/Makefile > index bb5737ce7f9e79f4023c9c1f578a49a951d1e239..b4c208ae4041c1f4e32c2a158322422ce7353d06 100644 > --- a/Makefile > +++ b/Makefile > @@ -510,6 +510,7 @@ OBJCOPY = $(LLVM_PREFIX)llvm-objcopy$(LLVM_SUFFIX) > OBJDUMP = $(LLVM_PREFIX)llvm-objdump$(LLVM_SUFFIX) > READELF = $(LLVM_PREFIX)llvm-readelf$(LLVM_SUFFIX) > STRIP = $(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX) > +KBUILD_USERLDFLAGS += -fuse-ld=lld Now that our minimum supported version upstream is 13.0.1, I think we can make this KBUILD_USERLDFLAGS += --ld-path=$(LD) as it should respect the user's choice of linker a little bit more, such as if they specific LLVM=<prefix>/bin/ or LLVM=-20. That reminds me that I can clean up what I did in commit 4406b12214f6 ("powerpc/vdso: Link with ld.lld when requested"). Additionally, this would not fix someone using CC=clang and LD=ld.lld (it is uncommon but still techincally supported) so could we use a check like ifeq ($(CONFIG_CC_IS_CLANG)$(CONFIG_LD_IS_LLD),yy) KBUILD_USERLDFLAGS += --ld-path=$(LD) endif further down in Makefile to make it more robust? The stable backport may want to use cc-option like I did for the powerpc vdso since there is a lower minimum supported version of LLVM there. > else > CC = $(CROSS_COMPILE)gcc > LD = $(CROSS_COMPILE)ld > > -- > 2.48.1 > Cheers, Nathan