diff options
Diffstat (limited to 'ldso/libdl')
-rw-r--r-- | ldso/libdl/libdl.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c index d102a48ab..8f036b991 100644 --- a/ldso/libdl/libdl.c +++ b/ldso/libdl/libdl.c @@ -792,7 +792,7 @@ static int do_dlclose(void *vhandle, int need_fini) struct dyn_elf *handle; ElfW(Addr) end = 0, start = (ElfW(Addr))(~0ULL); unsigned int i, j; - struct r_scope_elem *ls, *ls_next = NULL; + struct r_scope_elem *ls, *ls_next = NULL, *run_scope; struct elf_resolve **handle_rlist; #if defined(USE_TLS) && USE_TLS @@ -999,6 +999,18 @@ static int do_dlclose(void *vhandle, int need_fini) break; } } + for (run_scope = &_dl_loaded_modules->symbol_scope; run_scope; run_scope = run_scope->next) { + for (i = 0; i < run_scope->r_nlist; ++i) { + if (run_scope->r_list[i] == tpnt) { + _dl_if_debug_print("removed from symbol_scope: %s\n", tpnt->libname); + for (j = i; j < run_scope->r_nlist - 1; ++j) { + run_scope->r_list[j] = run_scope->r_list[j + 1]; + } + --run_scope->r_nlist; + break; + } + } + } } /* Next, remove tpnt from the global symbol table list */ |