summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorkleink <kleink@NetBSD.org>2000-02-07 19:02:49 +0000
committerkleink <kleink@NetBSD.org>2000-02-07 19:02:49 +0000
commit65b8f3b2eb2c9a7a37151dec23f22be342f0bdec (patch)
treed754222b3310f8aa532fae75d75a61969ceffa74 /libexec
parentcf02e1f1ceafefe5d48ea3743e445cdb7f8341bf (diff)
Change _rtld_dlclose() to unload the object via _rtld_unload_object() rather
than by itself. Besides being duplicated code the open-coded version also did not take care of cleaning up after the object's DAG(!). Fixes PR bin/8905.
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ld.elf_so/rtld.c32
1 files changed, 2 insertions, 30 deletions
diff --git a/libexec/ld.elf_so/rtld.c b/libexec/ld.elf_so/rtld.c
index 333b1aa88e2..08869d369b6 100644
--- a/libexec/ld.elf_so/rtld.c
+++ b/libexec/ld.elf_so/rtld.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.c,v 1.28 1999/12/13 09:09:34 christos Exp $ */
+/* $NetBSD: rtld.c,v 1.29 2000/02/07 19:02:49 kleink Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -600,36 +600,8 @@ _rtld_dlclose(handle)
_rtld_debug_state();
--root->dl_refcount;
- _rtld_unref_dag(root);
- if (root->refcount == 0) { /* We are finished with some objects. */
- Obj_Entry *obj;
- Obj_Entry **linkp;
-
- /* Finalize objects that are about to be unmapped. */
- for (obj = _rtld_objlist->next; obj != NULL; obj = obj->next)
- if (obj->refcount == 0 && obj->fini != NULL)
- (*obj->fini) ();
+ _rtld_unload_object(root, true);
- /* Unmap all objects that are no longer referenced. */
- linkp = &_rtld_objlist->next;
- while ((obj = *linkp) != NULL) {
- if (obj->refcount == 0) {
- munmap(obj->mapbase, obj->mapsize);
- free(obj->path);
- while (obj->needed != NULL) {
- Needed_Entry *needed = obj->needed;
- obj->needed = needed->next;
- free(needed);
- }
- _rtld_linkmap_delete(obj);
- *linkp = obj->next;
- if (obj->next == NULL)
- _rtld_objtail = linkp;
- free(obj);
- } else
- linkp = &obj->next;
- }
- }
_rtld_debug.r_state = RT_CONSISTENT;
_rtld_debug_state();