diff options
author | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2005-06-01 14:08:13 +0000 |
---|---|---|
committer | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2005-06-01 14:08:13 +0000 |
commit | 61c12b27780e5aec8d4535d5d35bf58765ef4c26 (patch) | |
tree | 373e68bf37c406c4afaae36c359aaee0c6de869d /ldso/ldso/dl-elf.c | |
parent | b18efa341f7a5645666ff7839edfd86fc821fee7 (diff) |
Initial support for both RUNPATH support.
RPATH sematics changed to match RUNPATH. Only difference is
that RPATH is searched before LD_LIBRARY_PATH and RUNPATH
after. This is not complete but better than the current mess(I think).
Diffstat (limited to 'ldso/ldso/dl-elf.c')
-rw-r--r-- | ldso/ldso/dl-elf.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c index 67d42110c..c8d2b9340 100644 --- a/ldso/ldso/dl-elf.c +++ b/ldso/ldso/dl-elf.c @@ -304,23 +304,17 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, } /* - * The ABI specifies that RPATH is searched before LD_*_PATH or + * The ABI specifies that RPATH is searched before LD_LIBRARY_PATH or * the default path of /usr/lib. Check in rpath directories. */ - for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) { - if (tpnt->libtype == elf_executable) { - pnt = (char *) tpnt->dynamic_info[DT_RPATH]; - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; + pnt = (tpnt ? (char *) tpnt->dynamic_info[DT_RPATH] : NULL); + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; #if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching RPATH='%s'\n", pnt); + if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching RPATH='%s'\n", pnt); #endif - if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) - { - return tpnt1; - } - } - } + if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) + return tpnt1; } /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ @@ -333,6 +327,18 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, return tpnt1; } } + /* + * The ABI specifies that RUNPATH is searched after LD_LIBRARY_PATH. + */ + pnt = (tpnt ? (char *)tpnt->dynamic_info[DT_RUNPATH] : NULL); + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; +#if defined (__SUPPORT_LD_DEBUG__) + if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching RUNPATH='%s'\n", pnt); +#endif + if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) + return tpnt1; + } /* * Where should the cache be searched? There is no such concept in the |