diff options
-rw-r--r-- | ldso/ldso/ldso.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index c5ec2fde1..a6e916ee9 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -138,11 +138,23 @@ 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 */ + /* + * Store the path where the shared lib loader was found for later use. + * Note that this logic isn't bullet proof when it comes to relative + * paths: if you use "./lib/ldso.so", and then the app does chdir() + * followed by dlopen(), the old ldso path won't get searched. But + * that is a fairly pathological use case, so if you don't like that, + * then set a full path to your interp and be done :P. + */ ldsopath = _dl_strdup(tpnt->libname); ptmp = _dl_strrchr(ldsopath, '/'); - if (ptmp != ldsopath) - *ptmp = '\0'; + /* + * If there is no "/", then set the path to "", and the code + * later on will take this to implicitly mean "search $PWD". + */ + if (!ptmp) + ptmp = ldsopath; + *ptmp = '\0'; _dl_ldsopath = ldsopath; _dl_debug_early("Lib Loader: (%x) %s: using path: %s\n", |