+Cc: Fangrui Song <maskray@xxxxxxxxxx> On Thu, Feb 8, 2024 at 10:22 AM Yuxuan Shui <yshuiv7@xxxxxxxxx> wrote: > > NixOS is designed to have immutable packages, and explicit dependencies. > It allows multiple different versions of the same shared library to > co-exist in its file system. > > Each application built with Nix, the NixOS package manager, will have > paths to its dependency shared libraries hardcoded into its executable, > this includes the dynamic linker. To achieve this, Nix adds a > --dynamic-linker linker flag when building any application. > > This isn't a problem if the kernel is built with ld.bfd, because ld.bfd > ignores the --dynamic-linker flag when the resulting binary doesn't have > a DT_NEEDED entry. However, ld.lld respects --dynamic-linker > unconditionally, which breaks linking in several cases. > > This commit adds an explicit --no-dynamic-linker flag which overrides > the flag added by Nix. I expect some Acks from LLVM folks (especially, from Frangrui) if this is the right thing to do. > Signed-off-by: Yuxuan Shui <yshuiv7@xxxxxxxxx> > --- > Makefile | 3 +++ > arch/x86/boot/Makefile | 2 +- > arch/x86/realmode/rm/Makefile | 2 +- > 3 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/Makefile b/Makefile > index a171eafce2a3b..10ed19caecb1b 100644 > --- a/Makefile > +++ b/Makefile > @@ -531,6 +531,9 @@ RUSTFLAGS_KERNEL = > AFLAGS_KERNEL = > LDFLAGS_vmlinux = > > +LDFLAGS_MODULE += --no-dynamic-linker > +LDFLAGS_vmlinux += --no-dynamic-linker > + > # Use USERINCLUDE when you must reference the UAPI directories only. > USERINCLUDE := \ > -I$(srctree)/arch/$(SRCARCH)/include/uapi \ > diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile > index 3cece19b74732..390a4604166eb 100644 > --- a/arch/x86/boot/Makefile > +++ b/arch/x86/boot/Makefile > @@ -102,7 +102,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE > AFLAGS_header.o += -I$(objtree)/$(obj) > $(obj)/header.o: $(obj)/zoffset.h > > -LDFLAGS_setup.elf := -m elf_i386 -z noexecstack -T > +LDFLAGS_setup.elf := --no-dynamic-linker -m elf_i386 -z noexecstack -T > $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE > $(call if_changed,ld) > > diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile > index f614009d3e4e2..4b42006d9ce02 100644 > --- a/arch/x86/realmode/rm/Makefile > +++ b/arch/x86/realmode/rm/Makefile > @@ -50,7 +50,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE > targets += realmode.lds > $(obj)/realmode.lds: $(obj)/pasyms.h > > -LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T > +LDFLAGS_realmode.elf := --no-dynamic-linker -m elf_i386 --emit-relocs -T > CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj) > > targets += realmode.elf > -- > 2.43.0 > -- Best Regards Masahiro Yamada