mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	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> SVN-Revision: 23892
		
			
				
	
	
		
			44 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| [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 <mark at moxienet.com>
 | |
| ---
 | |
| ldso/ldso/ldso.c |   12 +++++++++---
 | |
| 1 files changed, 9 insertions(+), 3 deletions(-)
 | |
| 
 | |
| --- a/ldso/ldso/ldso.c
 | |
| +++ b/ldso/ldso/ldso.c
 | |
| @@ -923,9 +923,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
 |