On Mon, Nov 15, 2010 at 02:14:00PM -0500, Mark Mentovai wrote:
>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 didn't look in detail yet but it sounds like it penalized
LDSO_SEARCH_INTERP_PATH more than it ought to (i.e. there must be a
better way).
>
>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 <[email protected]>
>> ---
>> 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
>_______________________________________________
>uClibc mailing list
>[email protected]
>http://lists.busybox.net/mailman/listinfo/uclibc
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to