string: Improve fortify with clang
[glibc.git] / elf / dl-open.c
blobc378da16c025f82523214984b04059a6ae9cc753
1 /* Load a shared object at runtime, relocate it, and run its initializer.
2 Copyright (C) 1996-2024 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, see
17 <https://www.gnu.org/licenses/>. */
19 #include <assert.h>
20 #include <dlfcn.h>
21 #include <errno.h>
22 #include <libintl.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <unistd.h>
27 #include <sys/mman.h> /* Check whether MAP_COPY is defined. */
28 #include <sys/param.h>
29 #include <libc-lock.h>
30 #include <ldsodefs.h>
31 #include <sysdep-cancel.h>
32 #include <tls.h>
33 #include <stap-probe.h>
34 #include <atomic.h>
35 #include <libc-internal.h>
36 #include <array_length.h>
37 #include <libc-early-init.h>
38 #include <gnu/lib-names.h>
39 #include <dl-find_object.h>
41 #include <dl-dst.h>
42 #include <dl-prop.h>
45 /* We must be careful not to leave us in an inconsistent state. Thus we
46 catch any error and re-raise it after cleaning up. */
48 struct dl_open_args
50 const char *file;
51 int mode;
52 /* This is the caller of the dlopen() function. */
53 const void *caller_dlopen;
54 struct link_map *map;
55 /* Namespace ID. */
56 Lmid_t nsid;
58 /* Original value of _ns_global_scope_pending_adds. Set by
59 dl_open_worker. Only valid if nsid is a real namespace
60 (non-negative). */
61 unsigned int original_global_scope_pending_adds;
63 /* Set to true by dl_open_worker if libc.so was already loaded into
64 the namespace at the time dl_open_worker was called. This is
65 used to determine whether libc.so early initialization has
66 already been done before, and whether to roll back the cached
67 libc_map value in the namespace in case of a dlopen failure. */
68 bool libc_already_loaded;
70 /* Set to true if the end of dl_open_worker_begin was reached. */
71 bool worker_continue;
73 /* Original parameters to the program and the current environment. */
74 int argc;
75 char **argv;
76 char **env;
79 /* Called in case the global scope cannot be extended. */
80 static void __attribute__ ((noreturn))
81 add_to_global_resize_failure (struct link_map *new)
83 _dl_signal_error (ENOMEM, new->l_libname->name, NULL,
84 N_ ("cannot extend global scope"));
87 /* Grow the global scope array for the namespace, so that all the new
88 global objects can be added later in add_to_global_update, without
89 risk of memory allocation failure. add_to_global_resize raises
90 exceptions for memory allocation errors. */
91 static void
92 add_to_global_resize (struct link_map *new)
94 struct link_namespaces *ns = &GL (dl_ns)[new->l_ns];
96 /* Count the objects we have to put in the global scope. */
97 unsigned int to_add = 0;
98 for (unsigned int cnt = 0; cnt < new->l_searchlist.r_nlist; ++cnt)
99 if (new->l_searchlist.r_list[cnt]->l_global == 0)
100 ++to_add;
102 /* The symbols of the new objects and its dependencies are to be
103 introduced into the global scope that will be used to resolve
104 references from other dynamically-loaded objects.
106 The global scope is the searchlist in the main link map. We
107 extend this list if necessary. There is one problem though:
108 since this structure was allocated very early (before the libc
109 is loaded) the memory it uses is allocated by the malloc()-stub
110 in the ld.so. When we come here these functions are not used
111 anymore. Instead the malloc() implementation of the libc is
112 used. But this means the block from the main map cannot be used
113 in an realloc() call. Therefore we allocate a completely new
114 array the first time we have to add something to the locale scope. */
116 if (__builtin_add_overflow (ns->_ns_global_scope_pending_adds, to_add,
117 &ns->_ns_global_scope_pending_adds))
118 add_to_global_resize_failure (new);
120 unsigned int new_size = 0; /* 0 means no new allocation. */
121 void *old_global = NULL; /* Old allocation if free-able. */
123 /* Minimum required element count for resizing. Adjusted below for
124 an exponential resizing policy. */
125 size_t required_new_size;
126 if (__builtin_add_overflow (ns->_ns_main_searchlist->r_nlist,
127 ns->_ns_global_scope_pending_adds,
128 &required_new_size))
129 add_to_global_resize_failure (new);
131 if (ns->_ns_global_scope_alloc == 0)
133 if (__builtin_add_overflow (required_new_size, 8, &new_size))
134 add_to_global_resize_failure (new);
136 else if (required_new_size > ns->_ns_global_scope_alloc)
138 if (__builtin_mul_overflow (required_new_size, 2, &new_size))
139 add_to_global_resize_failure (new);
141 /* The old array was allocated with our malloc, not the minimal
142 malloc. */
143 old_global = ns->_ns_main_searchlist->r_list;
146 if (new_size > 0)
148 size_t allocation_size;
149 if (__builtin_mul_overflow (new_size, sizeof (struct link_map *),
150 &allocation_size))
151 add_to_global_resize_failure (new);
152 struct link_map **new_global = malloc (allocation_size);
153 if (new_global == NULL)
154 add_to_global_resize_failure (new);
156 /* Copy over the old entries. */
157 memcpy (new_global, ns->_ns_main_searchlist->r_list,
158 ns->_ns_main_searchlist->r_nlist * sizeof (struct link_map *));
160 ns->_ns_global_scope_alloc = new_size;
161 ns->_ns_main_searchlist->r_list = new_global;
163 if (!RTLD_SINGLE_THREAD_P)
164 THREAD_GSCOPE_WAIT ();
166 free (old_global);
170 /* Actually add the new global objects to the global scope. Must be
171 called after add_to_global_resize. This function cannot fail. */
172 static void
173 add_to_global_update (struct link_map *new)
175 struct link_namespaces *ns = &GL (dl_ns)[new->l_ns];
177 /* Now add the new entries. */
178 unsigned int new_nlist = ns->_ns_main_searchlist->r_nlist;
179 for (unsigned int cnt = 0; cnt < new->l_searchlist.r_nlist; ++cnt)
181 struct link_map *map = new->l_searchlist.r_list[cnt];
183 if (map->l_global == 0)
185 map->l_global = 1;
187 /* The array has been resized by add_to_global_resize. */
188 assert (new_nlist < ns->_ns_global_scope_alloc);
190 ns->_ns_main_searchlist->r_list[new_nlist++] = map;
192 /* We modify the global scope. Report this. */
193 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
194 _dl_debug_printf ("\nadd %s [%lu] to global scope\n",
195 map->l_name, map->l_ns);
199 /* Some of the pending adds have been performed by the loop above.
200 Adjust the counter accordingly. */
201 unsigned int added = new_nlist - ns->_ns_main_searchlist->r_nlist;
202 assert (added <= ns->_ns_global_scope_pending_adds);
203 ns->_ns_global_scope_pending_adds -= added;
205 atomic_write_barrier ();
206 ns->_ns_main_searchlist->r_nlist = new_nlist;
209 /* Search link maps in all namespaces for the DSO that contains the object at
210 address ADDR. Returns the pointer to the link map of the matching DSO, or
211 NULL if a match is not found. */
212 struct link_map *
213 _dl_find_dso_for_object (const ElfW(Addr) addr)
215 struct link_map *l;
217 /* Find the highest-addressed object that ADDR is not below. */
218 for (Lmid_t ns = 0; ns < GL(dl_nns); ++ns)
219 for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
220 if (addr >= l->l_map_start && addr < l->l_map_end
221 && (l->l_contiguous
222 || _dl_addr_inside_object (l, (ElfW(Addr)) addr)))
224 assert (ns == l->l_ns);
225 return l;
227 return NULL;
229 rtld_hidden_def (_dl_find_dso_for_object);
231 /* Return true if NEW is found in the scope for MAP. */
232 static size_t
233 scope_has_map (struct link_map *map, struct link_map *new)
235 size_t cnt;
236 for (cnt = 0; map->l_scope[cnt] != NULL; ++cnt)
237 if (map->l_scope[cnt] == &new->l_searchlist)
238 return true;
239 return false;
242 /* Return the length of the scope for MAP. */
243 static size_t
244 scope_size (struct link_map *map)
246 size_t cnt;
247 for (cnt = 0; map->l_scope[cnt] != NULL; )
248 ++cnt;
249 return cnt;
252 /* Resize the scopes of depended-upon objects, so that the new object
253 can be added later without further allocation of memory. This
254 function can raise an exceptions due to malloc failure. */
255 static void
256 resize_scopes (struct link_map *new)
258 /* If the file is not loaded now as a dependency, add the search
259 list of the newly loaded object to the scope. */
260 for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
262 struct link_map *imap = new->l_searchlist.r_list[i];
264 /* If the initializer has been called already, the object has
265 not been loaded here and now. */
266 if (imap->l_init_called && imap->l_type == lt_loaded)
268 if (scope_has_map (imap, new))
269 /* Avoid duplicates. */
270 continue;
272 size_t cnt = scope_size (imap);
273 if (__glibc_unlikely (cnt + 1 >= imap->l_scope_max))
275 /* The l_scope array is too small. Allocate a new one
276 dynamically. */
277 size_t new_size;
278 struct r_scope_elem **newp;
280 if (imap->l_scope != imap->l_scope_mem
281 && imap->l_scope_max < array_length (imap->l_scope_mem))
283 /* If the current l_scope memory is not pointing to
284 the static memory in the structure, but the
285 static memory in the structure is large enough to
286 use for cnt + 1 scope entries, then switch to
287 using the static memory. */
288 new_size = array_length (imap->l_scope_mem);
289 newp = imap->l_scope_mem;
291 else
293 new_size = imap->l_scope_max * 2;
294 newp = (struct r_scope_elem **)
295 malloc (new_size * sizeof (struct r_scope_elem *));
296 if (newp == NULL)
297 _dl_signal_error (ENOMEM, "dlopen", NULL,
298 N_("cannot create scope list"));
301 /* Copy the array and the terminating NULL. */
302 memcpy (newp, imap->l_scope,
303 (cnt + 1) * sizeof (imap->l_scope[0]));
304 struct r_scope_elem **old = imap->l_scope;
306 imap->l_scope = newp;
308 if (old != imap->l_scope_mem)
309 _dl_scope_free (old);
311 imap->l_scope_max = new_size;
317 /* Second stage of resize_scopes: Add NEW to the scopes. Also print
318 debugging information about scopes if requested.
320 This function cannot raise an exception because all required memory
321 has been allocated by a previous call to resize_scopes. */
322 static void
323 update_scopes (struct link_map *new)
325 for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
327 struct link_map *imap = new->l_searchlist.r_list[i];
328 int from_scope = 0;
330 if (imap->l_init_called && imap->l_type == lt_loaded)
332 if (scope_has_map (imap, new))
333 /* Avoid duplicates. */
334 continue;
336 size_t cnt = scope_size (imap);
337 /* Assert that resize_scopes has sufficiently enlarged the
338 array. */
339 assert (cnt + 1 < imap->l_scope_max);
341 /* First terminate the extended list. Otherwise a thread
342 might use the new last element and then use the garbage
343 at offset IDX+1. */
344 imap->l_scope[cnt + 1] = NULL;
345 atomic_write_barrier ();
346 imap->l_scope[cnt] = &new->l_searchlist;
348 from_scope = cnt;
351 /* Print scope information. */
352 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
353 _dl_show_scope (imap, from_scope);
357 /* Call _dl_add_to_slotinfo with DO_ADD set to false, to allocate
358 space in GL (dl_tls_dtv_slotinfo_list). This can raise an
359 exception. The return value is true if any of the new objects use
360 TLS. */
361 static bool
362 resize_tls_slotinfo (struct link_map *new)
364 bool any_tls = false;
365 for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
367 struct link_map *imap = new->l_searchlist.r_list[i];
369 /* Only add TLS memory if this object is loaded now and
370 therefore is not yet initialized. */
371 if (! imap->l_init_called && imap->l_tls_blocksize > 0)
373 _dl_add_to_slotinfo (imap, false);
374 any_tls = true;
377 return any_tls;
380 /* Second stage of TLS update, after resize_tls_slotinfo. This
381 function does not raise any exception. It should only be called if
382 resize_tls_slotinfo returned true. */
383 static void
384 update_tls_slotinfo (struct link_map *new)
386 unsigned int first_static_tls = new->l_searchlist.r_nlist;
387 for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
389 struct link_map *imap = new->l_searchlist.r_list[i];
391 /* Only add TLS memory if this object is loaded now and
392 therefore is not yet initialized. */
393 if (! imap->l_init_called && imap->l_tls_blocksize > 0)
395 _dl_add_to_slotinfo (imap, true);
397 if (imap->l_need_tls_init
398 && first_static_tls == new->l_searchlist.r_nlist)
399 first_static_tls = i;
403 size_t newgen = GL(dl_tls_generation) + 1;
404 if (__glibc_unlikely (newgen == 0))
405 _dl_fatal_printf (N_("\
406 TLS generation counter wrapped! Please report this."));
407 /* Can be read concurrently. */
408 atomic_store_release (&GL(dl_tls_generation), newgen);
410 /* We need a second pass for static tls data, because
411 _dl_update_slotinfo must not be run while calls to
412 _dl_add_to_slotinfo are still pending. */
413 for (unsigned int i = first_static_tls; i < new->l_searchlist.r_nlist; ++i)
415 struct link_map *imap = new->l_searchlist.r_list[i];
417 if (imap->l_need_tls_init
418 && ! imap->l_init_called
419 && imap->l_tls_blocksize > 0)
421 /* For static TLS we have to allocate the memory here and
422 now, but we can delay updating the DTV. */
423 imap->l_need_tls_init = 0;
424 #ifdef SHARED
425 /* Update the slot information data for the current
426 generation. */
428 /* FIXME: This can terminate the process on memory
429 allocation failure. It is not possible to raise
430 exceptions from this context; to fix this bug,
431 _dl_update_slotinfo would have to be split into two
432 operations, similar to resize_scopes and update_scopes
433 above. This is related to bug 16134. */
434 _dl_update_slotinfo (imap->l_tls_modid, newgen);
435 #endif
437 dl_init_static_tls (imap);
438 assert (imap->l_need_tls_init == 0);
443 /* Mark the objects as NODELETE if required. This is delayed until
444 after dlopen failure is not possible, so that _dl_close can clean
445 up objects if necessary. */
446 static void
447 activate_nodelete (struct link_map *new)
449 /* It is necessary to traverse the entire namespace. References to
450 objects in the global scope and unique symbol bindings can force
451 NODELETE status for objects outside the local scope. */
452 for (struct link_map *l = GL (dl_ns)[new->l_ns]._ns_loaded; l != NULL;
453 l = l->l_next)
454 if (l->l_nodelete_pending)
456 if (__glibc_unlikely (GLRO (dl_debug_mask) & DL_DEBUG_FILES))
457 _dl_debug_printf ("activating NODELETE for %s [%lu]\n",
458 l->l_name, l->l_ns);
460 /* The flag can already be true at this point, e.g. a signal
461 handler may have triggered lazy binding and set NODELETE
462 status immediately. */
463 l->l_nodelete_active = true;
465 /* This is just a debugging aid, to indicate that
466 activate_nodelete has run for this map. */
467 l->l_nodelete_pending = false;
471 /* Relocate the object L. *RELOCATION_IN_PROGRESS controls whether
472 the debugger is notified of the start of relocation processing. */
473 static void
474 _dl_open_relocate_one_object (struct dl_open_args *args, struct r_debug *r,
475 struct link_map *l, int reloc_mode,
476 bool *relocation_in_progress)
478 if (l->l_real->l_relocated)
479 return;
481 if (!*relocation_in_progress)
483 /* Notify the debugger that relocations are about to happen. */
484 LIBC_PROBE (reloc_start, 2, args->nsid, r);
485 *relocation_in_progress = true;
488 #ifdef SHARED
489 if (__glibc_unlikely (GLRO(dl_profile) != NULL))
491 /* If this here is the shared object which we want to profile
492 make sure the profile is started. We can find out whether
493 this is necessary or not by observing the `_dl_profile_map'
494 variable. If it was NULL but is not NULL afterwards we must
495 start the profiling. */
496 struct link_map *old_profile_map = GL(dl_profile_map);
498 _dl_relocate_object (l, l->l_scope, reloc_mode | RTLD_LAZY, 1);
500 if (old_profile_map == NULL && GL(dl_profile_map) != NULL)
502 /* We must prepare the profiling. */
503 _dl_start_profile ();
505 /* Prevent unloading the object. */
506 GL(dl_profile_map)->l_nodelete_active = true;
509 else
510 #endif
511 _dl_relocate_object (l, l->l_scope, reloc_mode, 0);
515 /* struct dl_init_args and call_dl_init are used to call _dl_init with
516 exception handling disabled. */
517 struct dl_init_args
519 struct link_map *new;
520 int argc;
521 char **argv;
522 char **env;
525 static void
526 call_dl_init (void *closure)
528 struct dl_init_args *args = closure;
529 _dl_init (args->new, args->argc, args->argv, args->env);
532 static void
533 dl_open_worker_begin (void *a)
535 struct dl_open_args *args = a;
536 const char *file = args->file;
537 int mode = args->mode;
538 struct link_map *call_map = NULL;
540 /* Determine the caller's map if necessary. This is needed in case
541 we have a DST, when we don't know the namespace ID we have to put
542 the new object in, or when the file name has no path in which
543 case we need to look along the RUNPATH/RPATH of the caller. */
544 const char *dst = strchr (file, '$');
545 if (dst != NULL || args->nsid == __LM_ID_CALLER
546 || strchr (file, '/') == NULL)
548 const void *caller_dlopen = args->caller_dlopen;
550 /* We have to find out from which object the caller is calling.
551 By default we assume this is the main application. */
552 call_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
554 struct link_map *l = _dl_find_dso_for_object ((ElfW(Addr)) caller_dlopen);
556 if (l)
557 call_map = l;
559 if (args->nsid == __LM_ID_CALLER)
560 args->nsid = call_map->l_ns;
563 /* The namespace ID is now known. Keep track of whether libc.so was
564 already loaded, to determine whether it is necessary to call the
565 early initialization routine (or clear libc_map on error). */
566 args->libc_already_loaded = GL(dl_ns)[args->nsid].libc_map != NULL;
568 /* Retain the old value, so that it can be restored. */
569 args->original_global_scope_pending_adds
570 = GL (dl_ns)[args->nsid]._ns_global_scope_pending_adds;
572 /* One might be tempted to assert that we are RT_CONSISTENT at this point, but that
573 may not be true if this is a recursive call to dlopen. */
574 _dl_debug_initialize (0, args->nsid);
576 /* Load the named object. */
577 struct link_map *new;
578 args->map = new = _dl_map_object (call_map, file, lt_loaded, 0,
579 mode | __RTLD_CALLMAP, args->nsid);
581 /* If the pointer returned is NULL this means the RTLD_NOLOAD flag is
582 set and the object is not already loaded. */
583 if (new == NULL)
585 assert (mode & RTLD_NOLOAD);
586 return;
589 if (__glibc_unlikely (mode & __RTLD_SPROF))
590 /* This happens only if we load a DSO for 'sprof'. */
591 return;
593 /* This object is directly loaded. */
594 ++new->l_direct_opencount;
596 /* It was already open. */
597 if (__glibc_unlikely (new->l_searchlist.r_list != NULL))
599 /* Let the user know about the opencount. */
600 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
601 _dl_debug_printf ("opening file=%s [%lu]; direct_opencount=%u\n\n",
602 new->l_name, new->l_ns, new->l_direct_opencount);
604 /* If the user requested the object to be in the global
605 namespace but it is not so far, prepare to add it now. This
606 can raise an exception to do a malloc failure. */
607 if ((mode & RTLD_GLOBAL) && new->l_global == 0)
608 add_to_global_resize (new);
610 /* Mark the object as not deletable if the RTLD_NODELETE flags
611 was passed. */
612 if (__glibc_unlikely (mode & RTLD_NODELETE))
614 if (__glibc_unlikely (GLRO (dl_debug_mask) & DL_DEBUG_FILES)
615 && !new->l_nodelete_active)
616 _dl_debug_printf ("marking %s [%lu] as NODELETE\n",
617 new->l_name, new->l_ns);
618 new->l_nodelete_active = true;
621 /* Finalize the addition to the global scope. */
622 if ((mode & RTLD_GLOBAL) && new->l_global == 0)
623 add_to_global_update (new);
625 const int r_state __attribute__ ((unused))
626 = _dl_debug_update (args->nsid)->r_state;
627 assert (r_state == RT_CONSISTENT);
629 return;
632 /* Schedule NODELETE marking for the directly loaded object if
633 requested. */
634 if (__glibc_unlikely (mode & RTLD_NODELETE))
635 new->l_nodelete_pending = true;
637 /* Load that object's dependencies. */
638 _dl_map_object_deps (new, NULL, 0, 0,
639 mode & (__RTLD_DLOPEN | RTLD_DEEPBIND | __RTLD_AUDIT));
641 /* So far, so good. Now check the versions. */
642 for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
643 if (new->l_searchlist.r_list[i]->l_real->l_versions == NULL)
645 struct link_map *map = new->l_searchlist.r_list[i]->l_real;
646 _dl_check_map_versions (map, 0, 0);
647 #ifndef SHARED
648 /* During static dlopen, check if ld.so has been loaded.
649 Perform partial initialization in this case. This must
650 come after the symbol versioning initialization in
651 _dl_check_map_versions. */
652 if (map->l_info[DT_SONAME] != NULL
653 && strcmp (((const char *) D_PTR (map, l_info[DT_STRTAB])
654 + map->l_info[DT_SONAME]->d_un.d_val), LD_SO) == 0)
655 __rtld_static_init (map);
656 #endif
659 #ifdef SHARED
660 /* Auditing checkpoint: we have added all objects. */
661 _dl_audit_activity_nsid (new->l_ns, LA_ACT_CONSISTENT);
662 #endif
664 /* Notify the debugger all new objects are now ready to go. */
665 struct r_debug *r = _dl_debug_update (args->nsid);
666 r->r_state = RT_CONSISTENT;
667 _dl_debug_state ();
668 LIBC_PROBE (map_complete, 3, args->nsid, r, new);
670 _dl_open_check (new);
672 /* Print scope information. */
673 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
674 _dl_show_scope (new, 0);
676 /* Only do lazy relocation if `LD_BIND_NOW' is not set. */
677 int reloc_mode = mode & __RTLD_AUDIT;
678 if (GLRO(dl_lazy))
679 reloc_mode |= mode & RTLD_LAZY;
681 /* Objects must be sorted by dependency for the relocation process.
682 This allows IFUNC relocations to work and it also means copy
683 relocation of dependencies are if necessary overwritten.
684 __dl_map_object_deps has already sorted l_initfini for us. */
685 unsigned int first = UINT_MAX;
686 unsigned int last = 0;
687 unsigned int j = 0;
688 struct link_map *l = new->l_initfini[0];
691 if (! l->l_real->l_relocated)
693 if (first == UINT_MAX)
694 first = j;
695 last = j + 1;
697 l = new->l_initfini[++j];
699 while (l != NULL);
701 bool relocation_in_progress = false;
703 /* Perform relocation. This can trigger lazy binding in IFUNC
704 resolvers. For NODELETE mappings, these dependencies are not
705 recorded because the flag has not been applied to the newly
706 loaded objects. This means that upon dlopen failure, these
707 NODELETE objects can be unloaded despite existing references to
708 them. However, such relocation dependencies in IFUNC resolvers
709 are undefined anyway, so this is not a problem. */
711 /* Ensure that libc is relocated first. This helps with the
712 execution of IFUNC resolvers in libc, and matters only to newly
713 created dlmopen namespaces. Do not do this for static dlopen
714 because libc has relocations against ld.so, which may not have
715 been relocated at this point. */
716 #ifdef SHARED
717 if (GL(dl_ns)[args->nsid].libc_map != NULL)
718 _dl_open_relocate_one_object (args, r, GL(dl_ns)[args->nsid].libc_map,
719 reloc_mode, &relocation_in_progress);
720 #endif
722 for (unsigned int i = last; i-- > first; )
723 _dl_open_relocate_one_object (args, r, new->l_initfini[i], reloc_mode,
724 &relocation_in_progress);
726 /* This only performs the memory allocations. The actual update of
727 the scopes happens below, after failure is impossible. */
728 resize_scopes (new);
730 /* Increase the size of the GL (dl_tls_dtv_slotinfo_list) data
731 structure. */
732 bool any_tls = resize_tls_slotinfo (new);
734 /* Perform the necessary allocations for adding new global objects
735 to the global scope below. */
736 if (mode & RTLD_GLOBAL)
737 add_to_global_resize (new);
739 /* Demarcation point: After this, no recoverable errors are allowed.
740 All memory allocations for new objects must have happened
741 before. */
743 /* Finalize the NODELETE status first. This comes before
744 update_scopes, so that lazy binding will not see pending NODELETE
745 state for newly loaded objects. There is a compiler barrier in
746 update_scopes which ensures that the changes from
747 activate_nodelete are visible before new objects show up in the
748 local scope. */
749 activate_nodelete (new);
751 /* Second stage after resize_scopes: Actually perform the scope
752 update. After this, dlsym and lazy binding can bind to new
753 objects. */
754 update_scopes (new);
756 if (!_dl_find_object_update (new))
757 _dl_signal_error (ENOMEM, new->l_libname->name, NULL,
758 N_ ("cannot allocate address lookup data"));
760 /* FIXME: It is unclear whether the order here is correct.
761 Shouldn't new objects be made available for binding (and thus
762 execution) only after there TLS data has been set up fully?
763 Fixing bug 16134 will likely make this distinction less
764 important. */
766 /* Second stage after resize_tls_slotinfo: Update the slotinfo data
767 structures. */
768 if (any_tls)
769 /* FIXME: This calls _dl_update_slotinfo, which aborts the process
770 on memory allocation failure. See bug 16134. */
771 update_tls_slotinfo (new);
773 /* Notify the debugger all new objects have been relocated. */
774 if (relocation_in_progress)
775 LIBC_PROBE (reloc_complete, 3, args->nsid, r, new);
777 /* If libc.so was not there before, attempt to call its early
778 initialization routine. Indicate to the initialization routine
779 whether the libc being initialized is the one in the base
780 namespace. */
781 if (!args->libc_already_loaded)
783 /* dlopen cannot be used to load an initial libc by design. */
784 struct link_map *libc_map = GL(dl_ns)[args->nsid].libc_map;
785 _dl_call_libc_early_init (libc_map, false);
788 args->worker_continue = true;
791 static void
792 dl_open_worker (void *a)
794 struct dl_open_args *args = a;
796 args->worker_continue = false;
799 /* Protects global and module specific TLS state. */
800 __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
802 struct dl_exception ex;
803 int err = _dl_catch_exception (&ex, dl_open_worker_begin, args);
805 __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
807 if (__glibc_unlikely (ex.errstring != NULL))
808 /* Reraise the error. */
809 _dl_signal_exception (err, &ex, NULL);
812 if (!args->worker_continue)
813 return;
815 int mode = args->mode;
816 struct link_map *new = args->map;
818 /* Run the initializer functions of new objects. Temporarily
819 disable the exception handler, so that lazy binding failures are
820 fatal. */
822 struct dl_init_args init_args =
824 .new = new,
825 .argc = args->argc,
826 .argv = args->argv,
827 .env = args->env
829 _dl_catch_exception (NULL, call_dl_init, &init_args);
832 /* Now we can make the new map available in the global scope. */
833 if (mode & RTLD_GLOBAL)
834 add_to_global_update (new);
836 /* Let the user know about the opencount. */
837 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
838 _dl_debug_printf ("opening file=%s [%lu]; direct_opencount=%u\n\n",
839 new->l_name, new->l_ns, new->l_direct_opencount);
842 void *
843 _dl_open (const char *file, int mode, const void *caller_dlopen, Lmid_t nsid,
844 int argc, char *argv[], char *env[])
846 if ((mode & RTLD_BINDING_MASK) == 0)
847 /* One of the flags must be set. */
848 _dl_signal_error (EINVAL, file, NULL, N_("invalid mode for dlopen()"));
850 /* Make sure we are alone. */
851 __rtld_lock_lock_recursive (GL(dl_load_lock));
853 if (__glibc_unlikely (nsid == LM_ID_NEWLM))
855 /* Find a new namespace. */
856 for (nsid = 1; DL_NNS > 1 && nsid < GL(dl_nns); ++nsid)
857 if (GL(dl_ns)[nsid]._ns_loaded == NULL)
858 break;
860 if (__glibc_unlikely (nsid == DL_NNS))
862 /* No more namespace available. */
863 __rtld_lock_unlock_recursive (GL(dl_load_lock));
865 _dl_signal_error (EINVAL, file, NULL, N_("\
866 no more namespaces available for dlmopen()"));
868 else if (nsid == GL(dl_nns))
870 __rtld_lock_initialize (GL(dl_ns)[nsid]._ns_unique_sym_table.lock);
871 ++GL(dl_nns);
874 GL(dl_ns)[nsid].libc_map = NULL;
875 _dl_debug_update (nsid)->r_state = RT_CONSISTENT;
877 /* Never allow loading a DSO in a namespace which is empty. Such
878 direct placements is only causing problems. Also don't allow
879 loading into a namespace used for auditing. */
880 else if (__glibc_unlikely (nsid != LM_ID_BASE && nsid != __LM_ID_CALLER)
881 && (__glibc_unlikely (nsid < 0 || nsid >= GL(dl_nns))
882 /* This prevents the [NSID] index expressions from being
883 evaluated, so the compiler won't think that we are
884 accessing an invalid index here in the !SHARED case where
885 DL_NNS is 1 and so any NSID != 0 is invalid. */
886 || DL_NNS == 1
887 || GL(dl_ns)[nsid]._ns_nloaded == 0
888 || GL(dl_ns)[nsid]._ns_loaded->l_auditing))
889 _dl_signal_error (EINVAL, file, NULL,
890 N_("invalid target namespace in dlmopen()"));
892 struct dl_open_args args;
893 args.file = file;
894 args.mode = mode;
895 args.caller_dlopen = caller_dlopen;
896 args.map = NULL;
897 args.nsid = nsid;
898 /* args.libc_already_loaded is always assigned by dl_open_worker
899 (before any explicit/non-local returns). */
900 args.argc = argc;
901 args.argv = argv;
902 args.env = env;
904 struct dl_exception exception;
905 int errcode = _dl_catch_exception (&exception, dl_open_worker, &args);
907 #if defined USE_LDCONFIG && !defined MAP_COPY
908 /* We must unmap the cache file. */
909 _dl_unload_cache ();
910 #endif
912 /* Do this for both the error and success cases. The old value has
913 only been determined if the namespace ID was assigned (i.e., it
914 is not __LM_ID_CALLER). In the success case, we actually may
915 have consumed more pending adds than planned (because the local
916 scopes overlap in case of a recursive dlopen, the inner dlopen
917 doing some of the globalization work of the outer dlopen), so the
918 old pending adds value is larger than absolutely necessary.
919 Since it is just a conservative upper bound, this is harmless.
920 The top-level dlopen call will restore the field to zero. */
921 if (args.nsid >= 0)
922 GL (dl_ns)[args.nsid]._ns_global_scope_pending_adds
923 = args.original_global_scope_pending_adds;
925 /* See if an error occurred during loading. */
926 if (__glibc_unlikely (exception.errstring != NULL))
928 /* Avoid keeping around a dangling reference to the libc.so link
929 map in case it has been cached in libc_map. */
930 if (!args.libc_already_loaded)
931 GL(dl_ns)[args.nsid].libc_map = NULL;
933 /* Remove the object from memory. It may be in an inconsistent
934 state if relocation failed, for example. */
935 if (args.map)
937 _dl_close_worker (args.map, true);
939 /* All l_nodelete_pending objects should have been deleted
940 at this point, which is why it is not necessary to reset
941 the flag here. */
944 /* Release the lock. */
945 __rtld_lock_unlock_recursive (GL(dl_load_lock));
947 /* Reraise the error. */
948 _dl_signal_exception (errcode, &exception, NULL);
951 const int r_state __attribute__ ((unused))
952 = _dl_debug_update (args.nsid)->r_state;
953 assert (r_state == RT_CONSISTENT);
955 /* Release the lock. */
956 __rtld_lock_unlock_recursive (GL(dl_load_lock));
958 return args.map;
962 void
963 _dl_show_scope (struct link_map *l, int from)
965 _dl_debug_printf ("object=%s [%lu]\n",
966 DSO_FILENAME (l->l_name), l->l_ns);
967 if (l->l_scope != NULL)
968 for (int scope_cnt = from; l->l_scope[scope_cnt] != NULL; ++scope_cnt)
970 _dl_debug_printf (" scope %u:", scope_cnt);
972 for (unsigned int cnt = 0; cnt < l->l_scope[scope_cnt]->r_nlist; ++cnt)
973 if (*l->l_scope[scope_cnt]->r_list[cnt]->l_name)
974 _dl_debug_printf_c (" %s",
975 l->l_scope[scope_cnt]->r_list[cnt]->l_name);
976 else
977 _dl_debug_printf_c (" %s", RTLD_PROGNAME);
979 _dl_debug_printf_c ("\n");
981 else
982 _dl_debug_printf (" no scope\n");
983 _dl_debug_printf ("\n");