From: Ben Boeckel Date: Wed, 1 Oct 2025 13:39:08 +0000 (-0400) Subject: elf: Report when found libraries are rejected [BZ #25669] X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=eda354cfd8b998b55e4d62f1ad8aecf128be8d3c;p=thirdparty%2Fglibc.git elf: Report when found libraries are rejected [BZ #25669] 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 Reviewed-by: Adhemerval Zanella --- diff --git a/elf/dl-load.c b/elf/dl-load.c index 891b44966c..674bae2cbb 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,11 @@ 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 load file=%s, the shared " + "object cannot be tested for being " + "SUID or the bit is not set\n", + buf); __close_nocancel (fd); fd = -1; /* We simply ignore the file, signal this by setting