On Thu, Feb 13, 2025 at 10:54:37AM -0700, Nathan Chancellor wrote: > 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"). That is much better, thanks! I looked for something like this but could't find it. > 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? Ack. > 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. Ack. FYI, in case you want to have a look: The kunit config for powerpc is currently broken on LLVM=1. $ ./tools/testing/kunit/kunit.py run --arch powerpc --make_options LLVM=1 arch/powerpc/boot/wrapper manually inspects with CROSS_COMPILE, which does not exist when LLVM=1. Instead it falls back to the system objcopy, etc. > > else > > CC = $(CROSS_COMPILE)gcc > > LD = $(CROSS_COMPILE)ld