diff options
author | Rich Felker <dalias@aerifal.cx> | 2013-01-23 22:07:45 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2013-01-23 22:07:45 -0500 |
commit | 4d07e5521ea811278f00f434fe2b8345ea1d8832 (patch) | |
tree | 58f357a961a50b9ee2d19372bcaaca564ccb686b /src | |
parent | 637dd2d383cc1f63bf02a732f03786857b22c7bd (diff) | |
download | musl-4d07e5521ea811278f00f434fe2b8345ea1d8832.tar.gz musl-4d07e5521ea811278f00f434fe2b8345ea1d8832.tar.xz musl-4d07e5521ea811278f00f434fe2b8345ea1d8832.zip |
add support for RTLD_NOLOAD to dlopen
based on patch by Pierre Carrier <pierre@gcarrier.fr> that just added the flag constant, but with minimal additional code so that it actually works as documented. this is a nonstandard option but some major software (reportedly, Firefox) uses it and it was easy to add anyway.
Diffstat (limited to 'src')
-rw-r--r-- | src/ldso/dynlink.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index e73806cd..b1a4409d 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -99,6 +99,7 @@ static int ssp_used; static int runtime; static int ldd_mode; static int ldso_fail; +static int noload; static jmp_buf rtld_fail; static pthread_rwlock_t lock; static struct debug debug; @@ -508,7 +509,7 @@ static struct dso *load_library(const char *name) return p; } } - map = map_library(fd, &temp_dso); + map = noload ? 0 : map_library(fd, &temp_dso); close(fd); if (!map) return 0; @@ -1027,6 +1028,7 @@ void *dlopen(const char *file, int mode) orig_tls_offset = tls_offset; orig_tls_align = tls_align; orig_tail = tail; + noload = mode & RTLD_NOLOAD; if (setjmp(rtld_fail)) { /* Clean up anything new that was (partially) loaded */ @@ -1050,8 +1052,10 @@ void *dlopen(const char *file, int mode) } else p = load_library(file); if (!p) { - snprintf(errbuf, sizeof errbuf, - "Error loading shared library %s: %m", file); + snprintf(errbuf, sizeof errbuf, noload ? + "Library %s is not already loaded" : + "Error loading shared library %s: %m", + file); errflag = 1; goto end; } |