]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/uclibc/lib/contrib/uclibc/ldso/libdl/libdl.c.orig
update
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / ldso / libdl / libdl.c.orig
index 667798a7078751ac0156a53de0222e9cc2d5191b..47c58266e58c85a57cc60459400a1d89f2b25ead 100644 (file)
@@ -42,7 +42,6 @@
 
 #if defined(USE_TLS) && USE_TLS
 #include <ldsodefs.h>
-extern void (*_dl_init_static_tls) (struct link_map *);
 extern void _dl_add_to_slotinfo(struct link_map  *l);
 #endif
 
@@ -739,7 +738,7 @@ static int do_dlclose(void *vhandle, int need_fini)
                _dl_handles = rpnt->next_handle;
        _dl_if_debug_print("%s: usage count: %d\n",
                        handle->dyn->libname, handle->dyn->usage_count);
-       if (handle->dyn->usage_count != 1) {
+       if (handle->dyn->usage_count != 1 || (handle->dyn->rtld_flags & RTLD_NODELETE)) {
                handle->dyn->usage_count--;
                free(handle);
                return 0;
@@ -747,7 +746,8 @@ static int do_dlclose(void *vhandle, int need_fini)
        /* OK, this is a valid handle - now close out the file */
        for (j = 0; j < handle->init_fini.nlist; ++j) {
                tpnt = handle->init_fini.init_fini[j];
-               if (--tpnt->usage_count == 0) {
+               tpnt->usage_count--;
+               if (tpnt->usage_count == 0 && !(tpnt->rtld_flags & RTLD_NODELETE)) {
                        if ((tpnt->dynamic_info[DT_FINI]
                             || tpnt->dynamic_info[DT_FINI_ARRAY])
                         && need_fini