* sysdeps/unix/sysv/linux/bits/sched.h: Make second parameter of
[glibc.git] / elf / dl-close.c
blob8e5c9fc03390954f80baee68aa5e4a1800ba9552
1 /* Close a shared object opened by `_dl_open'.
2 Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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.
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.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
20 #include <assert.h>
21 #include <dlfcn.h>
22 #include <errno.h>
23 #include <libintl.h>
24 #include <stddef.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <unistd.h>
29 #include <bits/libc-lock.h>
30 #include <ldsodefs.h>
31 #include <sys/types.h>
32 #include <sys/mman.h>
33 #include <sysdep-cancel.h>
34 #include <tls.h>
37 /* Type of the constructor functions. */
38 typedef void (*fini_t) (void);
41 /* Special l_idx value used to indicate which objects remain loaded. */
42 #define IDX_STILL_USED -1
45 /* Returns true we an non-empty was found. */
46 static bool
47 remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
48 bool should_be_there)
50 if (idx - disp >= listp->len)
52 if (listp->next == NULL)
54 /* The index is not actually valid in the slotinfo list,
55 because this object was closed before it was fully set
56 up due to some error. */
57 assert (! should_be_there);
59 else
61 if (remove_slotinfo (idx, listp->next, disp + listp->len,
62 should_be_there))
63 return true;
65 /* No non-empty entry. Search from the end of this element's
66 slotinfo array. */
67 idx = disp + listp->len;
70 else
72 struct link_map *old_map = listp->slotinfo[idx - disp].map;
74 /* The entry might still be in its unused state if we are closing an
75 object that wasn't fully set up. */
76 if (__builtin_expect (old_map != NULL, 1))
78 assert (old_map->l_tls_modid == idx);
80 /* Mark the entry as unused. */
81 listp->slotinfo[idx - disp].gen = GL(dl_tls_generation) + 1;
82 listp->slotinfo[idx - disp].map = NULL;
85 /* If this is not the last currently used entry no need to look
86 further. */
87 if (idx != GL(dl_tls_max_dtv_idx))
88 return true;
91 while (idx - disp > (disp == 0 ? 1 + GL(dl_tls_static_nelem) : 0))
93 --idx;
95 if (listp->slotinfo[idx - disp].map != NULL)
97 /* Found a new last used index. */
98 GL(dl_tls_max_dtv_idx) = idx;
99 return true;
103 /* No non-entry in this list element. */
104 return false;
108 void
109 _dl_close_worker (struct link_map *map)
111 /* One less direct use. */
112 --map->l_direct_opencount;
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;
119 if (map->l_direct_opencount > 0 || map->l_type != lt_loaded
120 || dl_close_state != not_pending)
122 if (map->l_direct_opencount == 0 && map->l_type == lt_loaded)
123 dl_close_state = rerun;
125 /* There are still references to this object. Do nothing more. */
126 if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
127 _dl_debug_printf ("\nclosing file=%s; direct_opencount=%u\n",
128 map->l_name, map->l_direct_opencount);
130 return;
133 Lmid_t nsid = map->l_ns;
134 struct link_namespaces *ns = &GL(dl_ns)[nsid];
136 retry:
137 dl_close_state = pending;
139 bool any_tls = false;
140 const unsigned int nloaded = ns->_ns_nloaded;
141 char used[nloaded];
142 char done[nloaded];
143 struct link_map *maps[nloaded];
145 /* Run over the list and assign indexes to the link maps and enter
146 them into the MAPS array. */
147 int idx = 0;
148 for (struct link_map *l = ns->_ns_loaded; l != NULL; l = l->l_next)
150 l->l_idx = idx;
151 maps[idx] = l;
152 ++idx;
154 assert (idx == nloaded);
156 /* Prepare the bitmaps. */
157 memset (used, '\0', sizeof (used));
158 memset (done, '\0', sizeof (done));
160 /* Keep track of the lowest index link map we have covered already. */
161 int done_index = -1;
162 while (++done_index < nloaded)
164 struct link_map *l = maps[done_index];
166 if (done[done_index])
167 /* Already handled. */
168 continue;
170 /* Check whether this object is still used. */
171 if (l->l_type == lt_loaded
172 && l->l_direct_opencount == 0
173 && (l->l_flags_1 & DF_1_NODELETE) == 0
174 && !used[done_index])
175 continue;
177 /* We need this object and we handle it now. */
178 done[done_index] = 1;
179 used[done_index] = 1;
180 /* Signal the object is still needed. */
181 l->l_idx = IDX_STILL_USED;
183 /* Mark all dependencies as used. */
184 if (l->l_initfini != NULL)
186 struct link_map **lp = &l->l_initfini[1];
187 while (*lp != NULL)
189 if ((*lp)->l_idx != IDX_STILL_USED)
191 assert ((*lp)->l_idx >= 0 && (*lp)->l_idx < nloaded);
193 if (!used[(*lp)->l_idx])
195 used[(*lp)->l_idx] = 1;
196 if ((*lp)->l_idx - 1 < done_index)
197 done_index = (*lp)->l_idx - 1;
201 ++lp;
204 /* And the same for relocation dependencies. */
205 if (l->l_reldeps != NULL)
206 for (unsigned int j = 0; j < l->l_reldepsact; ++j)
208 struct link_map *jmap = l->l_reldeps[j];
210 if (jmap->l_idx != IDX_STILL_USED)
212 assert (jmap->l_idx >= 0 && jmap->l_idx < nloaded);
214 if (!used[jmap->l_idx])
216 used[jmap->l_idx] = 1;
217 if (jmap->l_idx - 1 < done_index)
218 done_index = jmap->l_idx - 1;
224 /* Sort the entries. */
225 _dl_sort_fini (ns->_ns_loaded, maps, nloaded, used, nsid);
227 /* Call all termination functions at once. */
228 #ifdef SHARED
229 bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing;
230 #endif
231 bool unload_any = false;
232 unsigned int first_loaded = ~0;
233 for (unsigned int i = 0; i < nloaded; ++i)
235 struct link_map *imap = maps[i];
237 /* All elements must be in the same namespace. */
238 assert (imap->l_ns == nsid);
240 if (!used[i])
242 assert (imap->l_type == lt_loaded
243 && (imap->l_flags_1 & DF_1_NODELETE) == 0);
245 /* Call its termination function. Do not do it for
246 half-cooked objects. */
247 if (imap->l_init_called)
249 /* When debugging print a message first. */
250 if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS,
252 _dl_debug_printf ("\ncalling fini: %s [%lu]\n\n",
253 imap->l_name, nsid);
255 if (imap->l_info[DT_FINI_ARRAY] != NULL)
257 ElfW(Addr) *array =
258 (ElfW(Addr) *) (imap->l_addr
259 + imap->l_info[DT_FINI_ARRAY]->d_un.d_ptr);
260 unsigned int sz = (imap->l_info[DT_FINI_ARRAYSZ]->d_un.d_val
261 / sizeof (ElfW(Addr)));
263 while (sz-- > 0)
264 ((fini_t) array[sz]) ();
267 /* Next try the old-style destructor. */
268 if (imap->l_info[DT_FINI] != NULL)
269 (*(void (*) (void)) DL_DT_FINI_ADDRESS
270 (imap, ((void *) imap->l_addr
271 + imap->l_info[DT_FINI]->d_un.d_ptr))) ();
274 #ifdef SHARED
275 /* Auditing checkpoint: we have a new object. */
276 if (__builtin_expect (do_audit, 0))
278 struct audit_ifaces *afct = GLRO(dl_audit);
279 for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
281 if (afct->objclose != NULL)
282 /* Return value is ignored. */
283 (void) afct->objclose (&imap->l_audit[cnt].cookie);
285 afct = afct->next;
288 #endif
290 /* This object must not be used anymore. */
291 imap->l_removed = 1;
293 /* We indeed have an object to remove. */
294 unload_any = true;
296 /* Remember where the first dynamically loaded object is. */
297 if (i < first_loaded)
298 first_loaded = i;
300 /* Else used[i]. */
301 else if (imap->l_type == lt_loaded)
303 struct r_scope_elem *new_list = NULL;
305 if (imap->l_searchlist.r_list == NULL && imap->l_initfini != NULL)
307 /* The object is still used. But one of the objects we are
308 unloading right now is responsible for loading it. If
309 the current object does not have it's own scope yet we
310 have to create one. This has to be done before running
311 the finalizers.
313 To do this count the number of dependencies. */
314 unsigned int cnt;
315 for (cnt = 1; imap->l_initfini[cnt] != NULL; ++cnt)
318 /* We simply reuse the l_initfini list. */
319 imap->l_searchlist.r_list = &imap->l_initfini[cnt + 1];
320 imap->l_searchlist.r_nlist = cnt;
322 new_list = &imap->l_searchlist;
325 /* Count the number of scopes which remain after the unload.
326 When we add the local search list count it. Always add
327 one for the terminating NULL pointer. */
328 size_t remain = (new_list != NULL) + 1;
329 bool removed_any = false;
330 for (size_t cnt = 0; imap->l_scope[cnt] != NULL; ++cnt)
331 /* This relies on l_scope[] entries being always set either
332 to its own l_symbolic_searchlist address, or some map's
333 l_searchlist address. */
334 if (imap->l_scope[cnt] != &imap->l_symbolic_searchlist)
336 struct link_map *tmap = (struct link_map *)
337 ((char *) imap->l_scope[cnt]
338 - offsetof (struct link_map, l_searchlist));
339 assert (tmap->l_ns == nsid);
340 if (tmap->l_idx == IDX_STILL_USED)
341 ++remain;
342 else
343 removed_any = true;
345 else
346 ++remain;
348 if (removed_any)
350 /* Always allocate a new array for the scope. This is
351 necessary since we must be able to determine the last
352 user of the current array. If possible use the link map's
353 memory. */
354 size_t new_size;
355 struct r_scope_elem **newp;
357 #define SCOPE_ELEMS(imap) \
358 (sizeof (imap->l_scope_mem) / sizeof (imap->l_scope_mem[0]))
360 if (imap->l_scope != imap->l_scope_mem
361 && remain < SCOPE_ELEMS (imap))
363 new_size = SCOPE_ELEMS (imap);
364 newp = imap->l_scope_mem;
366 else
368 new_size = imap->l_scope_max;
369 newp = (struct r_scope_elem **)
370 malloc (new_size * sizeof (struct r_scope_elem *));
371 if (newp == NULL)
372 _dl_signal_error (ENOMEM, "dlclose", NULL,
373 N_("cannot create scope list"));
376 /* Copy over the remaining scope elements. */
377 remain = 0;
378 for (size_t cnt = 0; imap->l_scope[cnt] != NULL; ++cnt)
380 if (imap->l_scope[cnt] != &imap->l_symbolic_searchlist)
382 struct link_map *tmap = (struct link_map *)
383 ((char *) imap->l_scope[cnt]
384 - offsetof (struct link_map, l_searchlist));
385 if (tmap->l_idx != IDX_STILL_USED)
387 /* Remove the scope. Or replace with own map's
388 scope. */
389 if (new_list != NULL)
391 newp[remain++] = new_list;
392 new_list = NULL;
394 continue;
398 newp[remain++] = imap->l_scope[cnt];
400 newp[remain] = NULL;
402 struct r_scope_elem **old = imap->l_scope;
404 if (RTLD_SINGLE_THREAD_P)
405 imap->l_scope = newp;
406 else
408 __rtld_mrlock_change (imap->l_scope_lock);
409 imap->l_scope = newp;
410 __rtld_mrlock_done (imap->l_scope_lock);
413 /* No user anymore, we can free it now. */
414 if (old != imap->l_scope_mem)
415 free (old);
417 imap->l_scope_max = new_size;
420 /* The loader is gone, so mark the object as not having one.
421 Note: l_idx != IDX_STILL_USED -> object will be removed. */
422 if (imap->l_loader != NULL
423 && imap->l_loader->l_idx != IDX_STILL_USED)
424 imap->l_loader = NULL;
426 /* Remember where the first dynamically loaded object is. */
427 if (i < first_loaded)
428 first_loaded = i;
432 /* If there are no objects to unload, do nothing further. */
433 if (!unload_any)
434 goto out;
436 #ifdef SHARED
437 /* Auditing checkpoint: we will start deleting objects. */
438 if (__builtin_expect (do_audit, 0))
440 struct link_map *head = ns->_ns_loaded;
441 struct audit_ifaces *afct = GLRO(dl_audit);
442 /* Do not call the functions for any auditing object. */
443 if (head->l_auditing == 0)
445 for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
447 if (afct->activity != NULL)
448 afct->activity (&head->l_audit[cnt].cookie, LA_ACT_DELETE);
450 afct = afct->next;
454 #endif
456 /* Notify the debugger we are about to remove some loaded objects. */
457 struct r_debug *r = _dl_debug_initialize (0, nsid);
458 r->r_state = RT_DELETE;
459 _dl_debug_state ();
461 size_t tls_free_start;
462 size_t tls_free_end;
463 tls_free_start = tls_free_end = NO_TLS_OFFSET;
465 /* Check each element of the search list to see if all references to
466 it are gone. */
467 for (unsigned int i = first_loaded; i < nloaded; ++i)
469 struct link_map *imap = maps[i];
470 if (!used[i])
472 assert (imap->l_type == lt_loaded);
474 /* That was the last reference, and this was a dlopen-loaded
475 object. We can unmap it. */
476 if (__builtin_expect (imap->l_global, 0))
478 /* This object is in the global scope list. Remove it. */
479 struct r_scope_elem *ns_msl = ns->_ns_main_searchlist;
480 unsigned int cnt = ns_msl->r_nlist;
483 --cnt;
484 while (ns_msl->r_list[cnt] != imap);
486 /* The object was already correctly registered. */
487 while (++cnt < ns_msl->r_nlist)
488 ns_msl->r_list[cnt - 1] = ns_msl->r_list[cnt];
490 --ns_msl->r_nlist;
492 if (!RTLD_SINGLE_THREAD_P)
493 THREAD_GSCOPE_WAIT ();
496 /* Remove the object from the dtv slotinfo array if it uses TLS. */
497 if (__builtin_expect (imap->l_tls_blocksize > 0, 0))
499 any_tls = true;
501 if (GL(dl_tls_dtv_slotinfo_list) != NULL
502 && ! remove_slotinfo (imap->l_tls_modid,
503 GL(dl_tls_dtv_slotinfo_list), 0,
504 imap->l_init_called))
505 /* All dynamically loaded modules with TLS are unloaded. */
506 GL(dl_tls_max_dtv_idx) = GL(dl_tls_static_nelem);
508 if (imap->l_tls_offset != NO_TLS_OFFSET)
510 /* Collect a contiguous chunk built from the objects in
511 this search list, going in either direction. When the
512 whole chunk is at the end of the used area then we can
513 reclaim it. */
514 #if TLS_TCB_AT_TP
515 if (tls_free_start == NO_TLS_OFFSET
516 || (size_t) imap->l_tls_offset == tls_free_start)
518 /* Extend the contiguous chunk being reclaimed. */
519 tls_free_start
520 = imap->l_tls_offset - imap->l_tls_blocksize;
522 if (tls_free_end == NO_TLS_OFFSET)
523 tls_free_end = imap->l_tls_offset;
525 else if (imap->l_tls_offset - imap->l_tls_blocksize
526 == tls_free_end)
527 /* Extend the chunk backwards. */
528 tls_free_end = imap->l_tls_offset;
529 else
531 /* This isn't contiguous with the last chunk freed.
532 One of them will be leaked unless we can free
533 one block right away. */
534 if (tls_free_end == GL(dl_tls_static_used))
536 GL(dl_tls_static_used) = tls_free_start;
537 tls_free_end = imap->l_tls_offset;
538 tls_free_start
539 = tls_free_end - imap->l_tls_blocksize;
541 else if ((size_t) imap->l_tls_offset
542 == GL(dl_tls_static_used))
543 GL(dl_tls_static_used)
544 = imap->l_tls_offset - imap->l_tls_blocksize;
545 else if (tls_free_end < (size_t) imap->l_tls_offset)
547 /* We pick the later block. It has a chance to
548 be freed. */
549 tls_free_end = imap->l_tls_offset;
550 tls_free_start
551 = tls_free_end - imap->l_tls_blocksize;
554 #elif TLS_DTV_AT_TP
555 if ((size_t) imap->l_tls_offset == tls_free_end)
556 /* Extend the contiguous chunk being reclaimed. */
557 tls_free_end -= imap->l_tls_blocksize;
558 else if (imap->l_tls_offset + imap->l_tls_blocksize
559 == tls_free_start)
560 /* Extend the chunk backwards. */
561 tls_free_start = imap->l_tls_offset;
562 else
564 /* This isn't contiguous with the last chunk freed.
565 One of them will be leaked. */
566 if (tls_free_end == GL(dl_tls_static_used))
567 GL(dl_tls_static_used) = tls_free_start;
568 tls_free_start = imap->l_tls_offset;
569 tls_free_end = tls_free_start + imap->l_tls_blocksize;
571 #else
572 # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
573 #endif
577 /* We can unmap all the maps at once. We determined the
578 start address and length when we loaded the object and
579 the `munmap' call does the rest. */
580 DL_UNMAP (imap);
582 /* Finally, unlink the data structure and free it. */
583 if (imap->l_prev != NULL)
584 imap->l_prev->l_next = imap->l_next;
585 else
587 #ifdef SHARED
588 assert (nsid != LM_ID_BASE);
589 #endif
590 ns->_ns_loaded = imap->l_next;
593 --ns->_ns_nloaded;
594 if (imap->l_next != NULL)
595 imap->l_next->l_prev = imap->l_prev;
597 free (imap->l_versions);
598 if (imap->l_origin != (char *) -1)
599 free ((char *) imap->l_origin);
601 free (imap->l_reldeps);
603 /* Print debugging message. */
604 if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
605 _dl_debug_printf ("\nfile=%s [%lu]; destroying link map\n",
606 imap->l_name, imap->l_ns);
608 /* This name always is allocated. */
609 free (imap->l_name);
610 /* Remove the list with all the names of the shared object. */
612 struct libname_list *lnp = imap->l_libname;
615 struct libname_list *this = lnp;
616 lnp = lnp->next;
617 if (!this->dont_free)
618 free (this);
620 while (lnp != NULL);
622 /* Remove the searchlists. */
623 free (imap->l_initfini);
625 /* Remove the scope array if we allocated it. */
626 if (imap->l_scope != imap->l_scope_mem)
627 free (imap->l_scope);
629 if (imap->l_phdr_allocated)
630 free ((void *) imap->l_phdr);
632 if (imap->l_rpath_dirs.dirs != (void *) -1)
633 free (imap->l_rpath_dirs.dirs);
634 if (imap->l_runpath_dirs.dirs != (void *) -1)
635 free (imap->l_runpath_dirs.dirs);
637 free (imap);
641 /* If we removed any object which uses TLS bump the generation counter. */
642 if (any_tls)
644 if (__builtin_expect (++GL(dl_tls_generation) == 0, 0))
645 _dl_fatal_printf ("TLS generation counter wrapped! Please report as described in <http://www.gnu.org/software/libc/bugs.html>.\n");
647 if (tls_free_end == GL(dl_tls_static_used))
648 GL(dl_tls_static_used) = tls_free_start;
651 #ifdef SHARED
652 /* Auditing checkpoint: we have deleted all objects. */
653 if (__builtin_expect (do_audit, 0))
655 struct link_map *head = ns->_ns_loaded;
656 /* Do not call the functions for any auditing object. */
657 if (head->l_auditing == 0)
659 struct audit_ifaces *afct = GLRO(dl_audit);
660 for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
662 if (afct->activity != NULL)
663 afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT);
665 afct = afct->next;
669 #endif
671 /* Notify the debugger those objects are finalized and gone. */
672 r->r_state = RT_CONSISTENT;
673 _dl_debug_state ();
675 /* Recheck if we need to retry, release the lock. */
676 out:
677 if (dl_close_state == rerun)
678 goto retry;
680 dl_close_state = not_pending;
684 void
685 _dl_close (void *_map)
687 struct link_map *map = _map;
689 /* First see whether we can remove the object at all. */
690 if (__builtin_expect (map->l_flags_1 & DF_1_NODELETE, 0))
692 assert (map->l_init_called);
693 /* Nope. Do nothing. */
694 return;
697 if (__builtin_expect (map->l_direct_opencount, 1) == 0)
698 GLRO(dl_signal_error) (0, map->l_name, NULL, N_("shared object not open"));
700 /* Acquire the lock. */
701 __rtld_lock_lock_recursive (GL(dl_load_lock));
703 _dl_close_worker (map);
705 __rtld_lock_unlock_recursive (GL(dl_load_lock));
709 static bool __libc_freeres_fn_section
710 free_slotinfo (struct dtv_slotinfo_list **elemp)
712 size_t cnt;
714 if (*elemp == NULL)
715 /* Nothing here, all is removed (or there never was anything). */
716 return true;
718 if (!free_slotinfo (&(*elemp)->next))
719 /* We cannot free the entry. */
720 return false;
722 /* That cleared our next pointer for us. */
724 for (cnt = 0; cnt < (*elemp)->len; ++cnt)
725 if ((*elemp)->slotinfo[cnt].map != NULL)
726 /* Still used. */
727 return false;
729 /* We can remove the list element. */
730 free (*elemp);
731 *elemp = NULL;
733 return true;
737 libc_freeres_fn (free_mem)
739 for (Lmid_t nsid = 0; nsid < DL_NNS; ++nsid)
740 if (__builtin_expect (GL(dl_ns)[nsid]._ns_global_scope_alloc, 0) != 0
741 && (GL(dl_ns)[nsid]._ns_main_searchlist->r_nlist
742 // XXX Check whether we need NS-specific initial_searchlist
743 == GLRO(dl_initial_searchlist).r_nlist))
745 /* All object dynamically loaded by the program are unloaded. Free
746 the memory allocated for the global scope variable. */
747 struct link_map **old = GL(dl_ns)[nsid]._ns_main_searchlist->r_list;
749 /* Put the old map in. */
750 GL(dl_ns)[nsid]._ns_main_searchlist->r_list
751 // XXX Check whether we need NS-specific initial_searchlist
752 = GLRO(dl_initial_searchlist).r_list;
753 /* Signal that the original map is used. */
754 GL(dl_ns)[nsid]._ns_global_scope_alloc = 0;
756 /* Now free the old map. */
757 free (old);
760 if (USE___THREAD || GL(dl_tls_dtv_slotinfo_list) != NULL)
762 /* Free the memory allocated for the dtv slotinfo array. We can do
763 this only if all modules which used this memory are unloaded. */
764 #ifdef SHARED
765 if (GL(dl_initial_dtv) == NULL)
766 /* There was no initial TLS setup, it was set up later when
767 it used the normal malloc. */
768 free_slotinfo (&GL(dl_tls_dtv_slotinfo_list));
769 else
770 #endif
771 /* The first element of the list does not have to be deallocated.
772 It was allocated in the dynamic linker (i.e., with a different
773 malloc), and in the static library it's in .bss space. */
774 free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);