[PATCH] ld.so: ldd crashes when __LDSO_SEARCH_INTERP_PATH__ is not #defined 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 --- ldso/ldso/ldso.c | 12 +++++++++--- --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -925,9 +925,15 @@ void _dl_get_ready_to_run(struct elf_res #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