diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2012-01-02 02:24:49 -0500 | 
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2012-01-02 03:01:41 -0500 | 
| commit | b3436addb5ccf14d7fffcf5503644e9a62aaec4e (patch) | |
| tree | 3c0d17eda4f2f492a7ddfbd3f68b74383c6004c3 | |
| parent | d5fd9afa76176c889196bb0631bfed77431b295d (diff) | |
ldso: simplify interp path search logic
The setup logic is duplicated, so unify it in a local func.
Mark the variable const while we're doing this, and add missing
ifdef protection to the header that declares it availability.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
| -rw-r--r-- | ldso/include/ldso.h | 4 | ||||
| -rw-r--r-- | ldso/ldso/ldso.c | 55 | 
2 files changed, 28 insertions, 31 deletions
diff --git a/ldso/include/ldso.h b/ldso/include/ldso.h index 4c091779d..6f3b728c3 100644 --- a/ldso/include/ldso.h +++ b/ldso/include/ldso.h @@ -73,7 +73,9 @@ struct init_fini_list {  /* Global variables used within the shared library loader */  extern char *_dl_library_path;         /* Where we look for libraries */  extern char *_dl_preload;              /* Things to be loaded before the libs */ -extern char *_dl_ldsopath;             /* Where the shared lib loader was found */ +#ifdef __LDSO_SEARCH_INTERP_PATH__ +extern const char *_dl_ldsopath;       /* Where the shared lib loader was found */ +#endif  extern const char *_dl_progname;       /* The name of the executable being run */  extern size_t _dl_pagesize;            /* Store the page size for use later */  #ifdef __LDSO_PRELINK_SUPPORT__ diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 0dff9781f..c5ec2fde1 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -52,9 +52,6 @@ char *_dl_library_path         = NULL;	/* Where we look for libraries */  #ifdef __LDSO_PRELOAD_ENV_SUPPORT__  char *_dl_preload              = NULL;	/* Things to be loaded before the libs */  #endif -#ifdef __LDSO_SEARCH_INTERP_PATH__ -char *_dl_ldsopath             = NULL;	/* Location of the shared lib loader */ -#endif  int _dl_errno                  = 0;	/* We can't use the real errno in ldso */  size_t _dl_pagesize            = 0;	/* Store the page size for use later */  struct r_debug *_dl_debug_addr = NULL;	/* Used to communicate with the gdb debugger */ @@ -134,6 +131,28 @@ uintptr_t __guard attribute_relro;  # endif  #endif +#ifdef __LDSO_SEARCH_INTERP_PATH__ +const char *_dl_ldsopath = NULL;	/* Location of the shared lib loader */ + +static void _dl_ldsopath_init(struct elf_resolve *tpnt) +{ +	char *ldsopath, *ptmp; + +	/* Store the path where the shared lib loader was found for later use */ +	ldsopath = _dl_strdup(tpnt->libname); +	ptmp = _dl_strrchr(ldsopath, '/'); +	if (ptmp != ldsopath) +		*ptmp = '\0'; + +	_dl_ldsopath = ldsopath; +	_dl_debug_early("Lib Loader: (%x) %s: using path: %s\n", +		(unsigned) DL_LOADADDR_BASE(tpnt->loadaddr), tpnt->libname, +		_dl_ldsopath); +} +#else +#define _dl_ldsopath_init(tpnt) +#endif +  char *_dl_getenv(const char *symbol, char **envp)  {  	char *pnt; @@ -574,20 +593,7 @@ of this helper program; chances are you did not intend to run this program.\n\  			}  		} -#ifdef __LDSO_SEARCH_INTERP_PATH__ -		{ -			char *ptmp; -			/* Store the path where the shared lib loader was found -			 * for later use -			 */ -			_dl_ldsopath = _dl_strdup(tpnt->libname); -			ptmp = _dl_strrchr(_dl_ldsopath, '/'); -			if (ptmp != _dl_ldsopath) -				*ptmp = '\0'; - -			_dl_debug_early("Lib Loader: (%x) %s\n", (unsigned) DL_LOADADDR_BASE(tpnt->loadaddr), tpnt->libname); -		} -#endif +		_dl_ldsopath_init(tpnt);  	} else {  #endif @@ -688,19 +694,8 @@ of this helper program; chances are you did not intend to run this program.\n\  		/* OK, fill this in - we did not have this before */  		if (ppnt->p_type == PT_INTERP) {  			tpnt->libname = (char *) DL_RELOC_ADDR(app_tpnt->loadaddr, ppnt->p_vaddr); -#ifdef __LDSO_SEARCH_INTERP_PATH__ -			{ -				char *ptmp; -				/* Store the path where the shared lib loader was found -				 * for later use -				 */ -				_dl_ldsopath = _dl_strdup(tpnt->libname); -				ptmp = _dl_strrchr(_dl_ldsopath, '/'); -				if (ptmp != _dl_ldsopath) -					*ptmp = '\0'; -			} -			_dl_debug_early("Lib Loader: (%x) %s\n", (unsigned) DL_LOADADDR_BASE(tpnt->loadaddr), tpnt->libname); -#endif + +			_dl_ldsopath_init(tpnt);  		}  		/* Discover any TLS sections if the target supports them. */  | 
