diff options
| author | Rich Felker <dalias@aerifal.cx> | 2011-08-16 00:24:36 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2011-08-16 00:24:36 -0400 | 
| commit | 2719cc86285d85df42f13ba0ae5b07b262c39686 (patch) | |
| tree | 6295a259551ca4841518210a7a9056c3058b8a1d /src | |
| parent | ce7c6341d38ecd3af4d1e01032e9ea8b4078aa97 (diff) | |
| download | musl-2719cc86285d85df42f13ba0ae5b07b262c39686.tar.gz | |
LD_PRELOAD support
Diffstat (limited to 'src')
| -rw-r--r-- | src/ldso/dynlink.c | 20 | 
1 files changed, 20 insertions, 0 deletions
| diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 7a26e9ed..ced1637c 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -14,6 +14,7 @@  #include <elf.h>  #include <setjmp.h>  #include <pthread.h> +#include <ctype.h>  #include <dlfcn.h>  #include "reloc.h" @@ -410,6 +411,20 @@ static void load_deps(struct dso *p)  	}  } +static void load_preload(char *s) +{ +	int tmp; +	char *z; +	for (z=s; *z; s=z) { +		for (   ; *s && isspace(*s); s++); +		for (z=s; *z && !isspace(*z); z++); +		tmp = *z; +		*z = 0; +		load_library(s); +		*z = tmp; +	} +} +  static void make_global(struct dso *p)  {  	for (; p; p=p->next) p->global = 1; @@ -455,11 +470,14 @@ void *__dynlink(int argc, char **argv, size_t *got)  	struct dso *const lib = builtin_dsos+1;  	struct dso *const vdso = builtin_dsos+2;  	size_t vdso_base=0; +	char *env_preload=0;  	/* Find aux vector just past environ[] */  	for (i=argc+1; argv[i]; i++)  		if (!memcmp(argv[i], "LD_LIBRARY_PATH=", 16))  			env_path = argv[i]+16; +		else if (!memcmp(argv[i], "LD_PRELOAD=", 11)) +			env_preload = argv[i]+11;  	auxv = (void *)(argv+i+1);  	decode_vec(auxv, aux, AUX_CNT); @@ -475,6 +493,7 @@ void *__dynlink(int argc, char **argv, size_t *got)  	if ((aux[0]&0x7800)!=0x7800 || aux[AT_UID]!=aux[AT_EUID]  	  || aux[AT_GID]!=aux[AT_EGID]) {  		env_path = 0; +		env_preload = 0;  	}  	/* Relocate ldso's DYNAMIC pointer and load vector */ @@ -547,6 +566,7 @@ void *__dynlink(int argc, char **argv, size_t *got)  	head = tail = app;  	libc = lib;  	app->next = 0; +	if (env_preload) load_preload(env_preload);  	load_deps(head);  	make_global(head); | 
