uClibc: 0.9.32 needs the ldso fix as well
SVN-Revision: 24074
This commit is contained in:
		| @@ -0,0 +1,41 @@ | |||||||
|  | [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 +++++++++--- | ||||||
|  | --- a/ldso/ldso/ldso.c | ||||||
|  | +++ b/ldso/ldso/ldso.c | ||||||
|  | @@ -920,9 +920,15 @@ | ||||||
|  |  #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 | ||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau