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 | |
parent | ce7c6341d38ecd3af4d1e01032e9ea8b4078aa97 (diff) | |
download | musl-2719cc86285d85df42f13ba0ae5b07b262c39686.tar.gz musl-2719cc86285d85df42f13ba0ae5b07b262c39686.tar.xz musl-2719cc86285d85df42f13ba0ae5b07b262c39686.zip |
LD_PRELOAD support
-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); |