[PATCH 1/1] elf: Report when found libraries are rejected [BZ #33479]

Ben Boeckel ben.boeckel@kitware.com
Tue Sep 23 18:27:12 GMT 2025


When debugging library loading issues with `LD_DEBUG`, it can be
frustrating to see logs for files in a directory are searched, but the
target library is skipped over without any indication of why. Add
reporting to all paths which reject a library as `ENOENT`.

Originally created for minimum-OS version detection, but that has since
been removed in b46d250656 (Remove kernel version check, 2022-02-21).
The remaining codepaths are still useful.

Signed-off-by: Ben Boeckel <ben.boeckel@kitware.com>
---
 elf/dl-load.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/elf/dl-load.c b/elf/dl-load.c
index 891b44966c..1d0bcff650 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -1633,6 +1633,8 @@ open_verify (const char *name, int fd,
 		 32-bit and 64-bit binaries can be run this might
 		 happen.  */
 	      *found_other_class = true;
+	      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+		_dl_debug_printf ("    (incompatible ELF class)\n");
 	      __close_nocancel (fd);
 	      __set_errno (ENOENT);
 	      return -1;
@@ -1671,6 +1673,8 @@ open_verify (const char *name, int fd,
 	}
       if (! __glibc_likely (elf_machine_matches_host (ehdr)))
 	{
+	  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+	    _dl_debug_printf ("    (incompatible ELF machine)\n");
 	  __close_nocancel (fd);
 	  __set_errno (ENOENT);
 	  return -1;
@@ -1706,12 +1710,19 @@ open_verify (const char *name, int fd,
 			    (phdr, ehdr->e_phnum, fbp->buf, fbp->len,
 			     loader, fd)))
 	{
+	  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+	    _dl_debug_printf ("    (incompatible ELF headers with the host)\n");
 	  __close_nocancel (fd);
 	  __set_errno (ENOENT);
 	  return -1;
 	}
 
     }
+  else
+    {
+      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+	_dl_debug_printf ("    (no such file)\n");
+    }
 
   return fd;
 }
@@ -1822,6 +1833,9 @@ open_path (const char *name, size_t namelen, int mode,
 		  /* The shared object cannot be tested for being SUID
 		     or this bit is not set.  In this case we must not
 		     use this object.  */
+		  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
+		    _dl_debug_printf ("  refusing to reload shared objects from trusted directories\n",
+				      buf);
 		  __close_nocancel (fd);
 		  fd = -1;
 		  /* We simply ignore the file, signal this by setting
-- 
2.51.0



More information about the Libc-alpha mailing list