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.
#define RTLD_LAZY 1
#define RTLD_NOW 2
#define RTLD_LAZY 1
#define RTLD_NOW 2
#define RTLD_GLOBAL 256
#define RTLD_LOCAL 0
#define RTLD_GLOBAL 256
#define RTLD_LOCAL 0
static int runtime;
static int ldd_mode;
static int ldso_fail;
static int runtime;
static int ldd_mode;
static int ldso_fail;
static jmp_buf rtld_fail;
static pthread_rwlock_t lock;
static struct debug debug;
static jmp_buf rtld_fail;
static pthread_rwlock_t lock;
static struct debug debug;
- map = map_library(fd, &temp_dso);
+ map = noload ? 0 : map_library(fd, &temp_dso);
close(fd);
if (!map) return 0;
close(fd);
if (!map) return 0;
orig_tls_offset = tls_offset;
orig_tls_align = tls_align;
orig_tail = tail;
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 */
if (setjmp(rtld_fail)) {
/* Clean up anything new that was (partially) loaded */
} else p = load_library(file);
if (!p) {
} 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);