rtld: properly handle root directory in load path (bug 30435)
[platform/upstream/glibc.git] / elf / dl-close.c
1 /* Close a shared object opened by `_dl_open'.
2    Copyright (C) 1996-2023 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18
19 #include <assert.h>
20 #include <dlfcn.h>
21 #include <errno.h>
22 #include <libintl.h>
23 #include <stddef.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <libc-lock.h>
29 #include <ldsodefs.h>
30 #include <sys/types.h>
31 #include <sys/mman.h>
32 #include <sysdep-cancel.h>
33 #include <tls.h>
34 #include <stap-probe.h>
35 #include <dl-find_object.h>
36
37 #include <dl-unmap-segments.h>
38
39 /* Special l_idx value used to indicate which objects remain loaded.  */
40 #define IDX_STILL_USED -1
41
42
43 /* Returns true we an non-empty was found.  */
44 static bool
45 remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
46                  bool should_be_there)
47 {
48   if (idx - disp >= listp->len)
49     {
50       if (listp->next == NULL)
51         {
52           /* The index is not actually valid in the slotinfo list,
53              because this object was closed before it was fully set
54              up due to some error.  */
55           assert (! should_be_there);
56         }
57       else
58         {
59           if (remove_slotinfo (idx, listp->next, disp + listp->len,
60                                should_be_there))
61             return true;
62
63           /* No non-empty entry.  Search from the end of this element's
64              slotinfo array.  */
65           idx = disp + listp->len;
66         }
67     }
68   else
69     {
70       struct link_map *old_map = listp->slotinfo[idx - disp].map;
71
72       /* The entry might still be in its unused state if we are closing an
73          object that wasn't fully set up.  */
74       if (__glibc_likely (old_map != NULL))
75         {
76           /* Mark the entry as unused.  These can be read concurrently.  */
77           atomic_store_relaxed (&listp->slotinfo[idx - disp].gen,
78                                 GL(dl_tls_generation) + 1);
79           atomic_store_relaxed (&listp->slotinfo[idx - disp].map, NULL);
80         }
81
82       /* If this is not the last currently used entry no need to look
83          further.  */
84       if (idx != GL(dl_tls_max_dtv_idx))
85         {
86           /* There is an unused dtv entry in the middle.  */
87           GL(dl_tls_dtv_gaps) = true;
88           return true;
89         }
90     }
91
92   while (idx - disp > (disp == 0 ? 1 + GL(dl_tls_static_nelem) : 0))
93     {
94       --idx;
95
96       if (listp->slotinfo[idx - disp].map != NULL)
97         {
98           /* Found a new last used index.  This can be read concurrently.  */
99           atomic_store_relaxed (&GL(dl_tls_max_dtv_idx), idx);
100           return true;
101         }
102     }
103
104   /* No non-entry in this list element.  */
105   return false;
106 }
107
108 void
109 _dl_close_worker (struct link_map *map, bool force)
110 {
111   /* One less direct use.  */
112   --map->l_direct_opencount;
113
114   /* If _dl_close is called recursively (some destructor call dlclose),
115      just record that the parent _dl_close will need to do garbage collection
116      again and return.  */
117   static enum { not_pending, pending, rerun } dl_close_state;
118
119   if (map->l_direct_opencount > 0 || map->l_type != lt_loaded
120       || dl_close_state != not_pending)
121     {
122       if (map->l_direct_opencount == 0 && map->l_type == lt_loaded)
123         dl_close_state = rerun;
124
125       /* There are still references to this object.  Do nothing more.  */
126       if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
127         _dl_debug_printf ("\nclosing file=%s; direct_opencount=%u\n",
128                           map->l_name, map->l_direct_opencount);
129
130       return;
131     }
132
133   Lmid_t nsid = map->l_ns;
134   struct link_namespaces *ns = &GL(dl_ns)[nsid];
135
136  retry:
137   dl_close_state = pending;
138
139   bool any_tls = false;
140   const unsigned int nloaded = ns->_ns_nloaded;
141   struct link_map *maps[nloaded];
142
143   /* Run over the list and assign indexes to the link maps and enter
144      them into the MAPS array.  */
145   int idx = 0;
146   for (struct link_map *l = ns->_ns_loaded; l != NULL; l = l->l_next)
147     {
148       l->l_map_used = 0;
149       l->l_map_done = 0;
150       l->l_idx = idx;
151       maps[idx] = l;
152       ++idx;
153     }
154   assert (idx == nloaded);
155
156   /* Keep track of the lowest index link map we have covered already.  */
157   int done_index = -1;
158   while (++done_index < nloaded)
159     {
160       struct link_map *l = maps[done_index];
161
162       if (l->l_map_done)
163         /* Already handled.  */
164         continue;
165
166       /* Check whether this object is still used.  */
167       if (l->l_type == lt_loaded
168           && l->l_direct_opencount == 0
169           && !l->l_nodelete_active
170           /* See CONCURRENCY NOTES in cxa_thread_atexit_impl.c to know why
171              acquire is sufficient and correct.  */
172           && atomic_load_acquire (&l->l_tls_dtor_count) == 0
173           && !l->l_map_used)
174         continue;
175
176       /* We need this object and we handle it now.  */
177       l->l_map_used = 1;
178       l->l_map_done = 1;
179       /* Signal the object is still needed.  */
180       l->l_idx = IDX_STILL_USED;
181
182       /* Mark all dependencies as used.  */
183       if (l->l_initfini != NULL)
184         {
185           /* We are always the zeroth entry, and since we don't include
186              ourselves in the dependency analysis start at 1.  */
187           struct link_map **lp = &l->l_initfini[1];
188           while (*lp != NULL)
189             {
190               if ((*lp)->l_idx != IDX_STILL_USED)
191                 {
192                   assert ((*lp)->l_idx >= 0 && (*lp)->l_idx < nloaded);
193
194                   if (!(*lp)->l_map_used)
195                     {
196                       (*lp)->l_map_used = 1;
197                       /* If we marked a new object as used, and we've
198                          already processed it, then we need to go back
199                          and process again from that point forward to
200                          ensure we keep all of its dependencies also.  */
201                       if ((*lp)->l_idx - 1 < done_index)
202                         done_index = (*lp)->l_idx - 1;
203                     }
204                 }
205
206               ++lp;
207             }
208         }
209       /* And the same for relocation dependencies.  */
210       if (l->l_reldeps != NULL)
211         for (unsigned int j = 0; j < l->l_reldeps->act; ++j)
212           {
213             struct link_map *jmap = l->l_reldeps->list[j];
214
215             if (jmap->l_idx != IDX_STILL_USED)
216               {
217                 assert (jmap->l_idx >= 0 && jmap->l_idx < nloaded);
218
219                 if (!jmap->l_map_used)
220                   {
221                     jmap->l_map_used = 1;
222                     if (jmap->l_idx - 1 < done_index)
223                       done_index = jmap->l_idx - 1;
224                   }
225               }
226           }
227     }
228
229   /* Sort the entries.  We can skip looking for the binary itself which is
230      at the front of the search list for the main namespace.  */
231   _dl_sort_maps (maps, nloaded, (nsid == LM_ID_BASE), true);
232
233   /* Call all termination functions at once.  */
234   bool unload_any = false;
235   bool scope_mem_left = false;
236   unsigned int unload_global = 0;
237   unsigned int first_loaded = ~0;
238   for (unsigned int i = 0; i < nloaded; ++i)
239     {
240       struct link_map *imap = maps[i];
241
242       /* All elements must be in the same namespace.  */
243       assert (imap->l_ns == nsid);
244
245       if (!imap->l_map_used)
246         {
247           assert (imap->l_type == lt_loaded && !imap->l_nodelete_active);
248
249           /* Call its termination function.  Do not do it for
250              half-cooked objects.  Temporarily disable exception
251              handling, so that errors are fatal.  */
252           if (imap->l_init_called)
253             _dl_catch_exception (NULL, _dl_call_fini, imap);
254
255 #ifdef SHARED
256           /* Auditing checkpoint: we remove an object.  */
257           _dl_audit_objclose (imap);
258 #endif
259
260           /* This object must not be used anymore.  */
261           imap->l_removed = 1;
262
263           /* We indeed have an object to remove.  */
264           unload_any = true;
265
266           if (imap->l_global)
267             ++unload_global;
268
269           /* Remember where the first dynamically loaded object is.  */
270           if (i < first_loaded)
271             first_loaded = i;
272         }
273       /* Else imap->l_map_used.  */
274       else if (imap->l_type == lt_loaded)
275         {
276           struct r_scope_elem *new_list = NULL;
277
278           if (imap->l_searchlist.r_list == NULL && imap->l_initfini != NULL)
279             {
280               /* The object is still used.  But one of the objects we are
281                  unloading right now is responsible for loading it.  If
282                  the current object does not have it's own scope yet we
283                  have to create one.  This has to be done before running
284                  the finalizers.
285
286                  To do this count the number of dependencies.  */
287               unsigned int cnt;
288               for (cnt = 1; imap->l_initfini[cnt] != NULL; ++cnt)
289                 ;
290
291               /* We simply reuse the l_initfini list.  */
292               imap->l_searchlist.r_list = &imap->l_initfini[cnt + 1];
293               imap->l_searchlist.r_nlist = cnt;
294
295               new_list = &imap->l_searchlist;
296             }
297
298           /* Count the number of scopes which remain after the unload.
299              When we add the local search list count it.  Always add
300              one for the terminating NULL pointer.  */
301           size_t remain = (new_list != NULL) + 1;
302           bool removed_any = false;
303           for (size_t cnt = 0; imap->l_scope[cnt] != NULL; ++cnt)
304             /* This relies on l_scope[] entries being always set either
305                to its own l_symbolic_searchlist address, or some map's
306                l_searchlist address.  */
307             if (imap->l_scope[cnt] != &imap->l_symbolic_searchlist)
308               {
309                 struct link_map *tmap = (struct link_map *)
310                   ((char *) imap->l_scope[cnt]
311                    - offsetof (struct link_map, l_searchlist));
312                 assert (tmap->l_ns == nsid);
313                 if (tmap->l_idx == IDX_STILL_USED)
314                   ++remain;
315                 else
316                   removed_any = true;
317               }
318             else
319               ++remain;
320
321           if (removed_any)
322             {
323               /* Always allocate a new array for the scope.  This is
324                  necessary since we must be able to determine the last
325                  user of the current array.  If possible use the link map's
326                  memory.  */
327               size_t new_size;
328               struct r_scope_elem **newp;
329
330 #define SCOPE_ELEMS(imap) \
331   (sizeof (imap->l_scope_mem) / sizeof (imap->l_scope_mem[0]))
332
333               if (imap->l_scope != imap->l_scope_mem
334                   && remain < SCOPE_ELEMS (imap))
335                 {
336                   new_size = SCOPE_ELEMS (imap);
337                   newp = imap->l_scope_mem;
338                 }
339               else
340                 {
341                   new_size = imap->l_scope_max;
342                   newp = (struct r_scope_elem **)
343                     malloc (new_size * sizeof (struct r_scope_elem *));
344                   if (newp == NULL)
345                     _dl_signal_error (ENOMEM, "dlclose", NULL,
346                                       N_("cannot create scope list"));
347                 }
348
349               /* Copy over the remaining scope elements.  */
350               remain = 0;
351               for (size_t cnt = 0; imap->l_scope[cnt] != NULL; ++cnt)
352                 {
353                   if (imap->l_scope[cnt] != &imap->l_symbolic_searchlist)
354                     {
355                       struct link_map *tmap = (struct link_map *)
356                         ((char *) imap->l_scope[cnt]
357                          - offsetof (struct link_map, l_searchlist));
358                       if (tmap->l_idx != IDX_STILL_USED)
359                         {
360                           /* Remove the scope.  Or replace with own map's
361                              scope.  */
362                           if (new_list != NULL)
363                             {
364                               newp[remain++] = new_list;
365                               new_list = NULL;
366                             }
367                           continue;
368                         }
369                     }
370
371                   newp[remain++] = imap->l_scope[cnt];
372                 }
373               newp[remain] = NULL;
374
375               struct r_scope_elem **old = imap->l_scope;
376
377               imap->l_scope = newp;
378
379               /* No user anymore, we can free it now.  */
380               if (old != imap->l_scope_mem)
381                 {
382                   if (_dl_scope_free (old))
383                     /* If _dl_scope_free used THREAD_GSCOPE_WAIT (),
384                        no need to repeat it.  */
385                     scope_mem_left = false;
386                 }
387               else
388                 scope_mem_left = true;
389
390               imap->l_scope_max = new_size;
391             }
392           else if (new_list != NULL)
393             {
394               /* We didn't change the scope array, so reset the search
395                  list.  */
396               imap->l_searchlist.r_list = NULL;
397               imap->l_searchlist.r_nlist = 0;
398             }
399
400           /* The loader is gone, so mark the object as not having one.
401              Note: l_idx != IDX_STILL_USED -> object will be removed.  */
402           if (imap->l_loader != NULL
403               && imap->l_loader->l_idx != IDX_STILL_USED)
404             imap->l_loader = NULL;
405
406           /* Remember where the first dynamically loaded object is.  */
407           if (i < first_loaded)
408             first_loaded = i;
409         }
410     }
411
412   /* If there are no objects to unload, do nothing further.  */
413   if (!unload_any)
414     goto out;
415
416 #ifdef SHARED
417   /* Auditing checkpoint: we will start deleting objects.  */
418   _dl_audit_activity_nsid (nsid, LA_ACT_DELETE);
419 #endif
420
421   /* Notify the debugger we are about to remove some loaded objects.  */
422   struct r_debug *r = _dl_debug_update (nsid);
423   r->r_state = RT_DELETE;
424   _dl_debug_state ();
425   LIBC_PROBE (unmap_start, 2, nsid, r);
426
427   if (unload_global)
428     {
429       /* Some objects are in the global scope list.  Remove them.  */
430       struct r_scope_elem *ns_msl = ns->_ns_main_searchlist;
431       unsigned int i;
432       unsigned int j = 0;
433       unsigned int cnt = ns_msl->r_nlist;
434
435       while (cnt > 0 && ns_msl->r_list[cnt - 1]->l_removed)
436         --cnt;
437
438       if (cnt + unload_global == ns_msl->r_nlist)
439         /* Speed up removing most recently added objects.  */
440         j = cnt;
441       else
442         for (i = 0; i < cnt; i++)
443           if (ns_msl->r_list[i]->l_removed == 0)
444             {
445               if (i != j)
446                 ns_msl->r_list[j] = ns_msl->r_list[i];
447               j++;
448             }
449       ns_msl->r_nlist = j;
450     }
451
452   if (!RTLD_SINGLE_THREAD_P
453       && (unload_global
454           || scope_mem_left
455           || (GL(dl_scope_free_list) != NULL
456               && GL(dl_scope_free_list)->count)))
457     {
458       THREAD_GSCOPE_WAIT ();
459
460       /* Now we can free any queued old scopes.  */
461       struct dl_scope_free_list *fsl = GL(dl_scope_free_list);
462       if (fsl != NULL)
463         while (fsl->count > 0)
464           free (fsl->list[--fsl->count]);
465     }
466
467   size_t tls_free_start;
468   size_t tls_free_end;
469   tls_free_start = tls_free_end = NO_TLS_OFFSET;
470
471   /* Protects global and module specitic TLS state.  */
472   __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
473
474   /* We modify the list of loaded objects.  */
475   __rtld_lock_lock_recursive (GL(dl_load_write_lock));
476
477   /* Check each element of the search list to see if all references to
478      it are gone.  */
479   for (unsigned int i = first_loaded; i < nloaded; ++i)
480     {
481       struct link_map *imap = maps[i];
482       if (!imap->l_map_used)
483         {
484           assert (imap->l_type == lt_loaded);
485
486           /* That was the last reference, and this was a dlopen-loaded
487              object.  We can unmap it.  */
488
489           /* Remove the object from the dtv slotinfo array if it uses TLS.  */
490           if (__glibc_unlikely (imap->l_tls_blocksize > 0))
491             {
492               any_tls = true;
493
494               if (GL(dl_tls_dtv_slotinfo_list) != NULL
495                   && ! remove_slotinfo (imap->l_tls_modid,
496                                         GL(dl_tls_dtv_slotinfo_list), 0,
497                                         imap->l_init_called))
498                 /* All dynamically loaded modules with TLS are unloaded.  */
499                 /* Can be read concurrently.  */
500                 atomic_store_relaxed (&GL(dl_tls_max_dtv_idx),
501                                       GL(dl_tls_static_nelem));
502
503               if (imap->l_tls_offset != NO_TLS_OFFSET
504                   && imap->l_tls_offset != FORCED_DYNAMIC_TLS_OFFSET)
505                 {
506                   /* Collect a contiguous chunk built from the objects in
507                      this search list, going in either direction.  When the
508                      whole chunk is at the end of the used area then we can
509                      reclaim it.  */
510 #if TLS_TCB_AT_TP
511                   if (tls_free_start == NO_TLS_OFFSET
512                       || (size_t) imap->l_tls_offset == tls_free_start)
513                     {
514                       /* Extend the contiguous chunk being reclaimed.  */
515                       tls_free_start
516                         = imap->l_tls_offset - imap->l_tls_blocksize;
517
518                       if (tls_free_end == NO_TLS_OFFSET)
519                         tls_free_end = imap->l_tls_offset;
520                     }
521                   else if (imap->l_tls_offset - imap->l_tls_blocksize
522                            == tls_free_end)
523                     /* Extend the chunk backwards.  */
524                     tls_free_end = imap->l_tls_offset;
525                   else
526                     {
527                       /* This isn't contiguous with the last chunk freed.
528                          One of them will be leaked unless we can free
529                          one block right away.  */
530                       if (tls_free_end == GL(dl_tls_static_used))
531                         {
532                           GL(dl_tls_static_used) = tls_free_start;
533                           tls_free_end = imap->l_tls_offset;
534                           tls_free_start
535                             = tls_free_end - imap->l_tls_blocksize;
536                         }
537                       else if ((size_t) imap->l_tls_offset
538                                == GL(dl_tls_static_used))
539                         GL(dl_tls_static_used)
540                           = imap->l_tls_offset - imap->l_tls_blocksize;
541                       else if (tls_free_end < (size_t) imap->l_tls_offset)
542                         {
543                           /* We pick the later block.  It has a chance to
544                              be freed.  */
545                           tls_free_end = imap->l_tls_offset;
546                           tls_free_start
547                             = tls_free_end - imap->l_tls_blocksize;
548                         }
549                     }
550 #elif TLS_DTV_AT_TP
551                   if (tls_free_start == NO_TLS_OFFSET)
552                     {
553                       tls_free_start = imap->l_tls_firstbyte_offset;
554                       tls_free_end = (imap->l_tls_offset
555                                       + imap->l_tls_blocksize);
556                     }
557                   else if (imap->l_tls_firstbyte_offset == tls_free_end)
558                     /* Extend the contiguous chunk being reclaimed.  */
559                     tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
560                   else if (imap->l_tls_offset + imap->l_tls_blocksize
561                            == tls_free_start)
562                     /* Extend the chunk backwards.  */
563                     tls_free_start = imap->l_tls_firstbyte_offset;
564                   /* This isn't contiguous with the last chunk freed.
565                      One of them will be leaked unless we can free
566                      one block right away.  */
567                   else if (imap->l_tls_offset + imap->l_tls_blocksize
568                            == GL(dl_tls_static_used))
569                     GL(dl_tls_static_used) = imap->l_tls_firstbyte_offset;
570                   else if (tls_free_end == GL(dl_tls_static_used))
571                     {
572                       GL(dl_tls_static_used) = tls_free_start;
573                       tls_free_start = imap->l_tls_firstbyte_offset;
574                       tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
575                     }
576                   else if (tls_free_end < imap->l_tls_firstbyte_offset)
577                     {
578                       /* We pick the later block.  It has a chance to
579                          be freed.  */
580                       tls_free_start = imap->l_tls_firstbyte_offset;
581                       tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
582                     }
583 #else
584 # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
585 #endif
586                 }
587             }
588
589           /* Reset unique symbols if forced.  */
590           if (force)
591             {
592               struct unique_sym_table *tab = &ns->_ns_unique_sym_table;
593               __rtld_lock_lock_recursive (tab->lock);
594               struct unique_sym *entries = tab->entries;
595               if (entries != NULL)
596                 {
597                   size_t idx, size = tab->size;
598                   for (idx = 0; idx < size; ++idx)
599                     {
600                       /* Clear unique symbol entries that belong to this
601                          object.  */
602                       if (entries[idx].name != NULL
603                           && entries[idx].map == imap)
604                         {
605                           entries[idx].name = NULL;
606                           entries[idx].hashval = 0;
607                           tab->n_elements--;
608                         }
609                     }
610                 }
611               __rtld_lock_unlock_recursive (tab->lock);
612             }
613
614           /* We can unmap all the maps at once.  We determined the
615              start address and length when we loaded the object and
616              the `munmap' call does the rest.  */
617           DL_UNMAP (imap);
618
619           /* Finally, unlink the data structure and free it.  */
620 #if DL_NNS == 1
621           /* The assert in the (imap->l_prev == NULL) case gives
622              the compiler license to warn that NS points outside
623              the dl_ns array bounds in that case (as nsid != LM_ID_BASE
624              is tantamount to nsid >= DL_NNS).  That should be impossible
625              in this configuration, so just assert about it instead.  */
626           assert (nsid == LM_ID_BASE);
627           assert (imap->l_prev != NULL);
628 #else
629           if (imap->l_prev == NULL)
630             {
631               assert (nsid != LM_ID_BASE);
632               ns->_ns_loaded = imap->l_next;
633
634               /* Update the pointer to the head of the list
635                  we leave for debuggers to examine.  */
636               r->r_map = (void *) ns->_ns_loaded;
637             }
638           else
639 #endif
640             imap->l_prev->l_next = imap->l_next;
641
642           --ns->_ns_nloaded;
643           if (imap->l_next != NULL)
644             imap->l_next->l_prev = imap->l_prev;
645
646           /* Update the data used by _dl_find_object.  */
647           _dl_find_object_dlclose (imap);
648
649           free (imap->l_versions);
650           if (imap->l_origin != (char *) -1)
651             free ((char *) imap->l_origin);
652
653           free (imap->l_reldeps);
654
655           /* Print debugging message.  */
656           if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
657             _dl_debug_printf ("\nfile=%s [%lu];  destroying link map\n",
658                               imap->l_name, imap->l_ns);
659
660           /* This name always is allocated.  */
661           free (imap->l_name);
662           /* Remove the list with all the names of the shared object.  */
663
664           struct libname_list *lnp = imap->l_libname;
665           do
666             {
667               struct libname_list *this = lnp;
668               lnp = lnp->next;
669               if (!this->dont_free)
670                 free (this);
671             }
672           while (lnp != NULL);
673
674           /* Remove the searchlists.  */
675           free (imap->l_initfini);
676
677           /* Remove the scope array if we allocated it.  */
678           if (imap->l_scope != imap->l_scope_mem)
679             free (imap->l_scope);
680
681           if (imap->l_phdr_allocated)
682             free ((void *) imap->l_phdr);
683
684           if (imap->l_rpath_dirs.dirs != (void *) -1)
685             free (imap->l_rpath_dirs.dirs);
686           if (imap->l_runpath_dirs.dirs != (void *) -1)
687             free (imap->l_runpath_dirs.dirs);
688
689           /* Clear GL(dl_initfirst) when freeing its link_map memory.  */
690           if (imap == GL(dl_initfirst))
691             GL(dl_initfirst) = NULL;
692
693           free (imap);
694         }
695     }
696
697   __rtld_lock_unlock_recursive (GL(dl_load_write_lock));
698
699   /* If we removed any object which uses TLS bump the generation counter.  */
700   if (any_tls)
701     {
702       size_t newgen = GL(dl_tls_generation) + 1;
703       if (__glibc_unlikely (newgen == 0))
704         _dl_fatal_printf ("TLS generation counter wrapped!  Please report as described in "REPORT_BUGS_TO".\n");
705       /* Can be read concurrently.  */
706       atomic_store_relaxed (&GL(dl_tls_generation), newgen);
707
708       if (tls_free_end == GL(dl_tls_static_used))
709         GL(dl_tls_static_used) = tls_free_start;
710     }
711
712   /* TLS is cleaned up for the unloaded modules.  */
713   __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
714
715 #ifdef SHARED
716   /* Auditing checkpoint: we have deleted all objects.  Also, do not notify
717      auditors of the cleanup of a failed audit module loading attempt.  */
718   _dl_audit_activity_nsid (nsid, LA_ACT_CONSISTENT);
719 #endif
720
721   if (__builtin_expect (ns->_ns_loaded == NULL, 0)
722       && nsid == GL(dl_nns) - 1)
723     do
724       --GL(dl_nns);
725     while (GL(dl_ns)[GL(dl_nns) - 1]._ns_loaded == NULL);
726
727   /* Notify the debugger those objects are finalized and gone.  */
728   r->r_state = RT_CONSISTENT;
729   _dl_debug_state ();
730   LIBC_PROBE (unmap_complete, 2, nsid, r);
731
732   /* Recheck if we need to retry, release the lock.  */
733  out:
734   if (dl_close_state == rerun)
735     goto retry;
736
737   dl_close_state = not_pending;
738 }
739
740
741 void
742 _dl_close (void *_map)
743 {
744   struct link_map *map = _map;
745
746   /* We must take the lock to examine the contents of map and avoid
747      concurrent dlopens.  */
748   __rtld_lock_lock_recursive (GL(dl_load_lock));
749
750   /* At this point we are guaranteed nobody else is touching the list of
751      loaded maps, but a concurrent dlclose might have freed our map
752      before we took the lock. There is no way to detect this (see below)
753      so we proceed assuming this isn't the case.  First see whether we
754      can remove the object at all.  */
755   if (__glibc_unlikely (map->l_nodelete_active))
756     {
757       /* Nope.  Do nothing.  */
758       __rtld_lock_unlock_recursive (GL(dl_load_lock));
759       return;
760     }
761
762   /* At present this is an unreliable check except in the case where the
763      caller has recursively called dlclose and we are sure the link map
764      has not been freed.  In a non-recursive dlclose the map itself
765      might have been freed and this access is potentially a data race
766      with whatever other use this memory might have now, or worse we
767      might silently corrupt memory if it looks enough like a link map.
768      POSIX has language in dlclose that appears to guarantee that this
769      should be a detectable case and given that dlclose should be threadsafe
770      we need this to be a reliable detection.
771      This is bug 20990. */
772   if (__builtin_expect (map->l_direct_opencount, 1) == 0)
773     {
774       __rtld_lock_unlock_recursive (GL(dl_load_lock));
775       _dl_signal_error (0, map->l_name, NULL, N_("shared object not open"));
776     }
777
778   _dl_close_worker (map, false);
779
780   __rtld_lock_unlock_recursive (GL(dl_load_lock));
781 }