diff options
Diffstat (limited to 'libexec')
-rw-r--r-- | libexec/rtld-elf/rtld.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 56634c5..721fe89 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -105,7 +105,7 @@ static void linkmap_add(Obj_Entry *); static void linkmap_delete(Obj_Entry *); static int load_needed_objects(Obj_Entry *); static int load_preload_objects(void); -static Obj_Entry *load_object(const char *, const Obj_Entry *); +static Obj_Entry *load_object(const char *, const Obj_Entry *, int); static Obj_Entry *obj_from_addr(const void *); static void objlist_call_fini(Objlist *, bool, int *); static void objlist_call_init(Objlist *, int *); @@ -1432,7 +1432,8 @@ load_needed_objects(Obj_Entry *first) Needed_Entry *needed; for (needed = obj->needed; needed != NULL; needed = needed->next) { - obj1 = needed->obj = load_object(obj->strtab + needed->name, obj); + obj1 = needed->obj = load_object(obj->strtab + needed->name, obj, + false); if (obj1 == NULL && !ld_tracing) return -1; if (obj1 != NULL && obj1->z_nodelete && !obj1->ref_nodel) { @@ -1463,7 +1464,7 @@ load_preload_objects(void) savech = p[len]; p[len] = '\0'; - if (load_object(p, NULL) == NULL) + if (load_object(p, NULL, false) == NULL) return -1; /* XXX - cleanup */ p[len] = savech; p += len; @@ -1480,7 +1481,7 @@ load_preload_objects(void) * on failure. */ static Obj_Entry * -load_object(const char *name, const Obj_Entry *refobj) +load_object(const char *name, const Obj_Entry *refobj, int noload) { Obj_Entry *obj; int fd = -1; @@ -1526,6 +1527,8 @@ load_object(const char *name, const Obj_Entry *refobj) close(fd); return obj; } + if (noload) + return (NULL); /* First use of this object, so we must map it in */ obj = do_load_object(fd, name, path, &sb); @@ -1982,13 +1985,14 @@ dlopen(const char *name, int mode) Obj_Entry **old_obj_tail; Obj_Entry *obj; Objlist initlist; - int result, lockstate, nodelete; + int result, lockstate, nodelete, noload; LD_UTRACE(UTRACE_DLOPEN_START, NULL, NULL, 0, mode, name); ld_tracing = (mode & RTLD_TRACE) == 0 ? NULL : "1"; if (ld_tracing != NULL) environ = (char **)*get_program_var_addr("environ"); nodelete = mode & RTLD_NODELETE; + noload = mode & RTLD_NOLOAD; objlist_init(&initlist); @@ -2001,7 +2005,7 @@ dlopen(const char *name, int mode) obj = obj_main; obj->refcount++; } else { - obj = load_object(name, obj_main); + obj = load_object(name, obj_main, noload); } if (obj) { |