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

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed Oct 1 12:18:18 GMT 2025



On 23/09/25 15:27, Ben Boeckel wrote:
> 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>

It fails to build [1]:

dl-load.c: In function 'open_path':
dl-load.c:1837:39: error: too many arguments for format [-Werror=format-extra-args]
 1837 |                     _dl_debug_printf ("  refusing to reload shared objects from trusted directories\n",
      |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors

I think you meant something like:

                  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
                    _dl_debug_printf ("  refuse to load file=%s, the shared "
                                      "object cannot be tested for being "
                                      "SUID or the bit is not set.\n",
                                      buf);

Also the bug report points to an unrelated issue [1].

[1] https://www.delorie.com/trybots/32bit/52357/make.tail.txt
[2] https://sourceware.org/bugzilla/show_bug.cgi?id=33479

> ---
>  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;

Ok.

> @@ -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;

Ok.

> @@ -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;
>  }

Ok.

> @@ -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


More information about the Libc-alpha mailing list