mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 14:34:27 -05:00 
			
		
		
		
	uClibc: 0.9.32 needs the ldso fix as well
SVN-Revision: 24074
This commit is contained in:
		
							parent
							
								
									05e837fb6d
								
							
						
					
					
						commit
						0fed0806df
					
				@ -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
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user