[PATCH] ld.so: ldd crashes when __LDSO_SEARCH_INTERP_PATH__ is not #defined

Mark Mentovai mark at moxienet.com
Mon Nov 15 19:14:00 UTC 2010


Poke?

This is a simple fix to a reproducible crash. I’m surprised it hasn’t been committed, or if there’s a problem with the patch, that it hasn’t been raised.

I wrote:
> Since b65c7b2c79debcb9017e31913e01eeaa280106fb, the implicit search path
> can be disabled by not #defining __LDSO_SEARCH_INTERP_PATH__. This
> causes _dl_ldsopath to never be set, so it remains NULL. _dl_ldsopath is
> still used when __LDSO_LDD_SUPPORT__ is #defined, to strip the path off
> of the beginning of the absolute path to the ld.so interpreter in use
> for printing. The _dl_strlen will crash with a NULL argument.
> 
> Rather than relying on _dl_ldsopath, this change causes ldd to compute
> the interpreter's basename directly.
> 
> glibc ld.so seems to print the full path to the interpreter without
> any computed basename or =>. I personally prefer glibc's behavior, but
> to preserve backwards compatibility with uClibc ld.so, the existing
> format with the computed basename, =>, and full path is used here. This
> enables simpler (and unchanged) text processing in a pipeline.
> 
> Signed-off-by: Mark Mentovai <mark at moxienet.com>
> ---
> ldso/ldso/ldso.c |   12 +++++++++---
> 1 files changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
> index ea4ad0f..a2bfabd 100644
> --- a/ldso/ldso/ldso.c
> +++ b/ldso/ldso/ldso.c
> @@ -918,9 +918,15 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
> #ifdef __LDSO_LDD_SUPPORT__
> 	/* End of the line for ldd.... */
> 	if (trace_loaded_objects) {
> -		_dl_dprintf(1, "\t%s => %s (%x)\n",
> -			    rpnt->dyn->libname + _dl_strlen(_dl_ldsopath) + 1,
> -			    rpnt->dyn->libname, DL_LOADADDR_BASE(rpnt->dyn->loadaddr));
> +		/* glibc ld.so/ldd would just do
> +		 * _dl_dprintf(1, "\t%s (%x)\n", rpnt->dyn->libname,
> +		 *	       DL_LOADADDR_BASE(rpnt->dyn->loadaddr));
> +		 * but uClibc has always used the => format. */
> +		char *ptmp = _dl_strrchr(rpnt->dyn->libname, '/');
> +		if (ptmp != rpnt->dyn->libname)
> +			++ptmp;
> +		_dl_dprintf(1, "\t%s => %s (%x)\n", ptmp, rpnt->dyn->libname,
> +			    DL_LOADADDR_BASE(rpnt->dyn->loadaddr));
> 		_dl_exit(0);
> 	}
> #endif


More information about the uClibc mailing list