mirror of git://git.musl-libc.org/musl
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.
This commit is contained in:
parent
637dd2d383
commit
4d07e5521e
|
@ -9,6 +9,7 @@ extern "C" {
|
||||||
|
|
||||||
#define RTLD_LAZY 1
|
#define RTLD_LAZY 1
|
||||||
#define RTLD_NOW 2
|
#define RTLD_NOW 2
|
||||||
|
#define RTLD_NOLOAD 4
|
||||||
#define RTLD_GLOBAL 256
|
#define RTLD_GLOBAL 256
|
||||||
#define RTLD_LOCAL 0
|
#define RTLD_LOCAL 0
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,7 @@ static int ssp_used;
|
||||||
static int runtime;
|
static int runtime;
|
||||||
static int ldd_mode;
|
static int ldd_mode;
|
||||||
static int ldso_fail;
|
static int ldso_fail;
|
||||||
|
static int noload;
|
||||||
static jmp_buf rtld_fail;
|
static jmp_buf rtld_fail;
|
||||||
static pthread_rwlock_t lock;
|
static pthread_rwlock_t lock;
|
||||||
static struct debug debug;
|
static struct debug debug;
|
||||||
|
@ -508,7 +509,7 @@ static struct dso *load_library(const char *name)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
map = map_library(fd, &temp_dso);
|
map = noload ? 0 : map_library(fd, &temp_dso);
|
||||||
close(fd);
|
close(fd);
|
||||||
if (!map) return 0;
|
if (!map) return 0;
|
||||||
|
|
||||||
|
@ -1027,6 +1028,7 @@ void *dlopen(const char *file, int mode)
|
||||||
orig_tls_offset = tls_offset;
|
orig_tls_offset = tls_offset;
|
||||||
orig_tls_align = tls_align;
|
orig_tls_align = tls_align;
|
||||||
orig_tail = tail;
|
orig_tail = tail;
|
||||||
|
noload = mode & RTLD_NOLOAD;
|
||||||
|
|
||||||
if (setjmp(rtld_fail)) {
|
if (setjmp(rtld_fail)) {
|
||||||
/* Clean up anything new that was (partially) loaded */
|
/* Clean up anything new that was (partially) loaded */
|
||||||
|
@ -1050,8 +1052,10 @@ void *dlopen(const char *file, int mode)
|
||||||
} else p = load_library(file);
|
} else p = load_library(file);
|
||||||
|
|
||||||
if (!p) {
|
if (!p) {
|
||||||
snprintf(errbuf, sizeof errbuf,
|
snprintf(errbuf, sizeof errbuf, noload ?
|
||||||
"Error loading shared library %s: %m", file);
|
"Library %s is not already loaded" :
|
||||||
|
"Error loading shared library %s: %m",
|
||||||
|
file);
|
||||||
errflag = 1;
|
errflag = 1;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue