[PATCH] Makerules/Makeconfig: Add rtlddir-build for the libc.so loader reference

Tiago Dinis tiagodinis33@gmail.com
Sat Jul 11 22:20:53 GMT 2026


From: Tiago Dinis <tiagodinis33@proton.me>

The libc.so linker script generated by "make install" references the
dynamic linker via an AS_NEEDED entry so the linker can resolve it
while building against libc.  Previously this used \$(rtlddir), which
is also the path compiled into ld-linux as its self-identification
string (-DRTLD in elf/Makefile) and used for the PT_INTERP of glibc's
own binaries (installed-rtld-LDFLAGS in Makeconfig).

These two uses legitimately differ when glibc is built to run on a
different environment with a different filesystem structure than the
build system: the loader is installed under the build tree, but the
resulting binaries must reference it via the runtime path of the
target environment.  Setting \$(rtlddir) to that runtime path makes
libc.so point at a loader that is not present at build time, breaking
linking against libc and later consumers such as binutils.

Introduce \$(rtlddir-build), defaulting to \$(rtlddir), and use it for
the libc.so AS_NEEDED entry so it tracks where the loader is actually
installed.  \$(rtlddir) keeps driving the runtime path
(self-identification and PT_INTERP).  This is a no-op for the default
configuration, where rtlddir-build == rtlddir == slibdir.

Reviewed-by: (none yet)
---
 Makeconfig | 9 +++++++++
 Makerules  | 2 +-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/Makeconfig b/Makeconfig
index e7dbd9fb..135a98b6 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -165,6 +165,15 @@ rtlddir = $(slibdir)
 endif
 inst_rtlddir = $(install_root)$(rtlddir)
 
+# Directory referenced by the libc.so linker script (AS_NEEDED entry) for
+# the dynamic linker at build time.  This points at the location where the
+# loader is actually installed so the linker can resolve it while building
+# against libc.  It defaults to rtlddir (where it differs, the loader is
+# installed in rtlddir-build but identified/loaded at runtime via rtlddir).
+ifndef rtlddir-build
+rtlddir-build = $(rtlddir)
+endif
+
 # Prefix to put on files installed in $(libdir).  For libraries `libNAME.a',
 # the prefix is spliced between `lib' and the name, so the linker switch
 # `-l$(libprefix)NAME' finds the library; for other files the prefix is
diff --git a/Makerules b/Makerules
index 6bef57ec..61b24131 100644
--- a/Makerules
+++ b/Makerules
@@ -1024,7 +1024,7 @@ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
 	 cat $<; \
 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
 	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
-	      ' AS_NEEDED (' $(rtlddir)/$(rtld-installed-name) ') )' \
+	      ' AS_NEEDED (' $(rtlddir-build)/$(rtld-installed-name) ') )' \
 	) > $@.new
 	mv -f $@.new $@
 
-- 
2.54.0



More information about the Libc-alpha mailing list