]> git.ipfire.org Git - thirdparty/glibc.git/blame - elf/rtld.c
nptl: Extract <bits/atomic_wide_counter.h> from pthread_cond_common.c
[thirdparty/glibc.git] / elf / rtld.c
CommitLineData
d66e34cd 1/* Run time dynamic linker.
2b778ceb 2 Copyright (C) 1995-2021 Free Software Foundation, Inc.
afd4eb37 3 This file is part of the GNU C Library.
d66e34cd 4
afd4eb37 5 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
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.
d66e34cd 9
afd4eb37
UD
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
41bdb6e2 13 Lesser General Public License for more details.
d66e34cd 14
41bdb6e2 15 You should have received a copy of the GNU Lesser General Public
59ba27a6 16 License along with the GNU C Library; if not, see
5a82c748 17 <https://www.gnu.org/licenses/>. */
d66e34cd 18
7d0b1164 19#include <errno.h>
154d10bd 20#include <dlfcn.h>
7dea968e 21#include <fcntl.h>
164a7164 22#include <stdbool.h>
d66e34cd 23#include <stdlib.h>
f51d1dfd 24#include <string.h>
d66e34cd 25#include <unistd.h>
20739e54 26#include <sys/mman.h>
af8bf6bd 27#include <sys/param.h>
ba9fcb3f 28#include <sys/stat.h>
a42195db 29#include <ldsodefs.h>
eb96ffb0 30#include <_itoa.h>
f21acc89 31#include <entry.h>
c94a8080 32#include <fpu_control.h>
db276fa1 33#include <hp-timing.h>
ec999b8e 34#include <libc-lock.h>
8f480b4b 35#include <dl-librecon.h>
74955460 36#include <unsecvars.h>
5688da55 37#include <dl-cache.h>
2f4db0df 38#include <dl-osinfo.h>
5688da55 39#include <dl-procinfo.h>
f753fa7d 40#include <dl-prop.h>
1bdda52f
AZ
41#include <dl-vdso.h>
42#include <dl-vdso-setup.h>
5f5843e3 43#include <tls.h>
815e6fa3 44#include <stap-probe.h>
30950a5f 45#include <stackinfo.h>
329ea513 46#include <not-cancel.h>
4c6e0415 47#include <array_length.h>
ec935dea 48#include <libc-early-init.h>
2bf9e641 49#include <dl-main.h>
4d098554 50#include <gnu/lib-names.h>
86f65dff 51#include <dl-tunables.h>
d6d89608 52#include <get-dynamic-info.h>
f5348425 53
a853022c 54#include <assert.h>
f5348425 55
d6d89608
AZ
56/* This #define produces dynamic linking inline functions for
57 bootstrap relocation instead of general-purpose relocation.
58 Since ld.so must not have any undefined symbols the result
59 is trivial: always the map of ld.so itself. */
60#define RTLD_BOOTSTRAP
61#define RESOLVE_MAP(map, scope, sym, version, flags) map
62#include "dynamic-link.h"
63
1e372ded
AZ
64/* Only enables rtld profiling for architectures which provides non generic
65 hp-timing support. The generic support requires either syscall
66 (clock_gettime), which will incur in extra overhead on loading time.
67 Using vDSO is also an option, but it will require extra support on loader
68 to setup the vDSO pointer before its usage. */
69#if HP_TIMING_INLINE
70# define RLTD_TIMING_DECLARE(var, classifier,...) \
71 classifier hp_timing_t var __VA_ARGS__
72# define RTLD_TIMING_VAR(var) RLTD_TIMING_DECLARE (var, )
73# define RTLD_TIMING_SET(var, value) (var) = (value)
74# define RTLD_TIMING_REF(var) &(var)
75
76static inline void
77rtld_timer_start (hp_timing_t *var)
78{
79 HP_TIMING_NOW (*var);
80}
81
82static inline void
83rtld_timer_stop (hp_timing_t *var, hp_timing_t start)
84{
85 hp_timing_t stop;
86 HP_TIMING_NOW (stop);
87 HP_TIMING_DIFF (*var, start, stop);
88}
89
90static inline void
91rtld_timer_accum (hp_timing_t *sum, hp_timing_t start)
92{
93 hp_timing_t stop;
94 rtld_timer_stop (&stop, start);
95 HP_TIMING_ACCUM_NT(*sum, stop);
96}
97#else
98# define RLTD_TIMING_DECLARE(var, classifier...)
99# define RTLD_TIMING_SET(var, value)
100# define RTLD_TIMING_VAR(var)
101# define RTLD_TIMING_REF(var) 0
102# define rtld_timer_start(var)
103# define rtld_timer_stop(var, start)
104# define rtld_timer_accum(sum, start)
105#endif
106
6ce3881d
RM
107/* Avoid PLT use for our local calls at startup. */
108extern __typeof (__mempcpy) __mempcpy attribute_hidden;
109
110/* GCC has mental blocks about _exit. */
111extern __typeof (_exit) exit_internal asm ("_exit") attribute_hidden;
112#define _exit exit_internal
113
fd26970f 114/* Helper function to handle errors while resolving symbols. */
c84142e8
UD
115static void print_unresolved (int errcode, const char *objname,
116 const char *errsting);
117
118/* Helper function to handle errors when a version is missing. */
119static void print_missing_version (int errcode, const char *objname,
120 const char *errsting);
fd26970f 121
db276fa1 122/* Print the various times we collected. */
1e372ded 123static void print_statistics (const hp_timing_t *total_timep);
ea278354 124
4c6e0415
FW
125/* Creates an empty audit list. */
126static void audit_list_init (struct audit_list *);
127
128/* Add a string to the end of the audit list, for later parsing. Must
129 not be called after audit_list_next. */
130static void audit_list_add_string (struct audit_list *, const char *);
131
8f7a75d7
FW
132/* Add the audit strings from the link map, found in the dynamic
133 segment at TG (either DT_AUDIT and DT_DEPAUDIT). Must be called
134 before audit_list_next. */
135static void audit_list_add_dynamic_tag (struct audit_list *,
136 struct link_map *,
137 unsigned int tag);
138
4c6e0415
FW
139/* Extract the next audit module from the audit list. Only modules
140 for which dso_name_valid_for_suid is true are returned. Must be
8f7a75d7
FW
141 called after all the audit_list_add_string,
142 audit_list_add_dynamic_tags calls. */
4c6e0415 143static const char *audit_list_next (struct audit_list *);
74780cf6 144
2bf9e641
FW
145/* Initialize *STATE with the defaults. */
146static void dl_main_state_init (struct dl_main_state *state);
ea278354
UD
147
148/* Process all environments variables the dynamic linker must recognize.
149 Since all of them start with `LD_' we are a bit smarter while finding
150 all the entries. */
851f32cf 151extern char **_environ attribute_hidden;
2bf9e641 152static void process_envvars (struct dl_main_state *state);
ea278354 153
11986c68 154#ifdef DL_ARGV_NOT_RELRO
22aa06a5 155int _dl_argc attribute_hidden;
11986c68 156char **_dl_argv = NULL;
22aa06a5
RM
157/* Nonzero if we were run directly. */
158unsigned int _dl_skip_args attribute_hidden;
11986c68 159#else
22aa06a5 160int _dl_argc attribute_relro attribute_hidden;
697afbe1 161char **_dl_argv attribute_relro = NULL;
22aa06a5 162unsigned int _dl_skip_args attribute_relro attribute_hidden;
11986c68 163#endif
4243cbea 164rtld_hidden_data_def (_dl_argv)
5c82e15e 165
35f1e827
UD
166#ifndef THREAD_SET_STACK_GUARD
167/* Only exported for architectures that don't store the stack guard canary
168 in thread local area. */
169uintptr_t __stack_chk_guard attribute_relro;
170#endif
171
827b7087
UD
172/* Only exported for architectures that don't store the pointer guard
173 value in thread local area. */
7c241325 174uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
827b7087
UD
175#ifndef THREAD_SET_POINTER_GUARD
176strong_alias (__pointer_chk_guard_local, __pointer_chk_guard)
177#endif
178
6d0ba622
FW
179/* Check that AT_SECURE=0, or that the passed name does not contain
180 directories and is not overly long. Reject empty names
181 unconditionally. */
182static bool
183dso_name_valid_for_suid (const char *p)
184{
185 if (__glibc_unlikely (__libc_enable_secure))
186 {
187 /* Ignore pathnames with directories for AT_SECURE=1
188 programs, and also skip overlong names. */
189 size_t len = strlen (p);
190 if (len >= SECURE_NAME_LIMIT || memchr (p, '/', len) != NULL)
191 return false;
192 }
193 return *p != '\0';
194}
827b7087 195
4c6e0415
FW
196static void
197audit_list_init (struct audit_list *list)
9dcafc55 198{
4c6e0415
FW
199 list->length = 0;
200 list->current_index = 0;
201 list->current_tail = NULL;
202}
9dcafc55 203
4c6e0415
FW
204static void
205audit_list_add_string (struct audit_list *list, const char *string)
81b82fb9 206{
4c6e0415
FW
207 /* Empty strings do not load anything. */
208 if (*string == '\0')
209 return;
81b82fb9 210
4c6e0415
FW
211 if (list->length == array_length (list->audit_strings))
212 _dl_fatal_printf ("Fatal glibc error: Too many audit modules requested\n");
81b82fb9 213
4c6e0415 214 list->audit_strings[list->length++] = string;
81b82fb9 215
4c6e0415
FW
216 /* Initialize processing of the first string for
217 audit_list_next. */
218 if (list->length == 1)
219 list->current_tail = string;
81b82fb9
FW
220}
221
8f7a75d7
FW
222static void
223audit_list_add_dynamic_tag (struct audit_list *list, struct link_map *main_map,
224 unsigned int tag)
225{
226 ElfW(Dyn) *info = main_map->l_info[ADDRIDX (tag)];
227 const char *strtab = (const char *) D_PTR (main_map, l_info[DT_STRTAB]);
228 if (info != NULL)
229 audit_list_add_string (list, strtab + info->d_un.d_val);
230}
231
81b82fb9 232static const char *
4c6e0415 233audit_list_next (struct audit_list *list)
81b82fb9 234{
4c6e0415
FW
235 if (list->current_tail == NULL)
236 return NULL;
237
238 while (true)
81b82fb9 239 {
4c6e0415
FW
240 /* Advance to the next string in audit_strings if the current
241 string has been exhausted. */
242 while (*list->current_tail == '\0')
81b82fb9 243 {
4c6e0415
FW
244 ++list->current_index;
245 if (list->current_index == list->length)
81b82fb9 246 {
4c6e0415
FW
247 list->current_tail = NULL;
248 return NULL;
81b82fb9 249 }
4c6e0415 250 list->current_tail = list->audit_strings[list->current_index];
81b82fb9 251 }
81b82fb9 252
4c6e0415
FW
253 /* Split the in-string audit list at the next colon colon. */
254 size_t len = strcspn (list->current_tail, ":");
255 if (len > 0 && len < sizeof (list->fname))
256 {
257 memcpy (list->fname, list->current_tail, len);
258 list->fname[len] = '\0';
259 }
260 else
261 /* Mark the name as unusable for dso_name_valid_for_suid. */
262 list->fname[0] = '\0';
263
264 /* Skip over the substring and the following delimiter. */
265 list->current_tail += len;
266 if (*list->current_tail == ':')
267 ++list->current_tail;
268
269 /* If the name is valid, return it. */
270 if (dso_name_valid_for_suid (list->fname))
271 return list->fname;
272
273 /* Otherwise wrap around to find the next list element. . */
81b82fb9 274 }
81b82fb9
FW
275}
276
17796419
SN
277/* Count audit modules before they are loaded so GLRO(dl_naudit)
278 is not yet usable. */
279static size_t
280audit_list_count (struct audit_list *list)
281{
282 /* Restore the audit_list iterator state at the end. */
283 const char *saved_tail = list->current_tail;
284 size_t naudit = 0;
285
286 assert (list->current_index == 0);
287 while (audit_list_next (list) != NULL)
288 naudit++;
289 list->current_tail = saved_tail;
290 list->current_index = 0;
291 return naudit;
292}
293
2bf9e641
FW
294static void
295dl_main_state_init (struct dl_main_state *state)
296{
297 audit_list_init (&state->audit_list);
298 state->library_path = NULL;
27316f4a 299 state->library_path_source = NULL;
2bf9e641
FW
300 state->preloadlist = NULL;
301 state->preloadarg = NULL;
dad90d52
FW
302 state->glibc_hwcaps_prepend = NULL;
303 state->glibc_hwcaps_mask = NULL;
2bf9e641
FW
304 state->mode = rtld_mode_normal;
305 state->any_debug = false;
306 state->version_info = false;
307}
308
ce6e047f 309#ifndef HAVE_INLINED_SYSCALLS
39778c6c
UD
310/* Set nonzero during loading and initialization of executable and
311 libraries, cleared before the executable's entry point runs. This
312 must not be initialized to nonzero, because the unused dynamic
313 linker loaded in for libc.so's "ld.so.1" dep will provide the
314 definition seen by libc.so's initializer; that value must be zero,
315 and will be since that dynamic linker's _dl_start and dl_main will
316 never be called. */
e6caf4e1 317int _dl_starting_up = 0;
9cf27b8d 318rtld_hidden_def (_dl_starting_up)
ce6e047f 319#endif
39778c6c 320
d6b5d570
UD
321/* This is the structure which defines all variables global to ld.so
322 (except those which cannot be added for some reason). */
5688da55
UD
323struct rtld_global _rtld_global =
324 {
674ea882
L
325 /* Get architecture specific initializer. */
326#include <dl-procruntime.c>
30950a5f
RA
327 /* Generally the default presumption without further information is an
328 * executable stack but this is not true for all platforms. */
329 ._dl_stack_flags = DEFAULT_STACK_PERMS,
ffa8d2a0 330#ifdef _LIBC_REENTRANT
22c83193 331 ._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
5a2a1d75 332 ._dl_load_write_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
83b53232 333 ._dl_load_tls_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
ffa8d2a0 334#endif
415ac3df
UD
335 ._dl_nns = 1,
336 ._dl_ns =
337 {
bea9b193 338#ifdef _LIBC_REENTRANT
415ac3df
UD
339 [LM_ID_BASE] = { ._ns_unique_sym_table
340 = { .lock = _RTLD_LOCK_RECURSIVE_INITIALIZER } }
bea9b193 341#endif
415ac3df 342 }
5688da55 343 };
27a754a9
UD
344/* If we would use strong_alias here the compiler would see a
345 non-hidden definition. This would undo the effect of the previous
7ee881f1 346 declaration. So spell out what strong_alias does plus add the
27a754a9
UD
347 visibility attribute. */
348extern struct rtld_global _rtld_local
349 __attribute__ ((alias ("_rtld_global"), visibility ("hidden")));
c0fb8a56 350
afdca0f2
UD
351
352/* This variable is similar to _rtld_local, but all values are
353 read-only after relocation. */
354struct rtld_global_ro _rtld_global_ro attribute_relro =
355 {
c31e278f
UD
356 /* Get architecture specific initializer. */
357#include <dl-procinfo.c>
afdca0f2
UD
358#ifdef NEED_DL_SYSINFO
359 ._dl_sysinfo = DL_SYSINFO_DEFAULT,
360#endif
dd70526e 361 ._dl_debug_fd = STDERR_FILENO,
afdca0f2
UD
362 ._dl_use_load_bias = -2,
363 ._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID,
ff08fc59 364#if !HAVE_TUNABLES
afdca0f2 365 ._dl_hwcap_mask = HWCAP_IMPORTANT,
ff08fc59 366#endif
afdca0f2
UD
367 ._dl_lazy = 1,
368 ._dl_fpu_control = _FPU_DEFAULT,
02d46fc4 369 ._dl_pagesize = EXEC_PAGESIZE,
73d65cc3 370 ._dl_inhibit_cache = 0,
154d10bd
UD
371
372 /* Function pointers. */
154d10bd 373 ._dl_debug_printf = _dl_debug_printf,
ab97ee8f 374 ._dl_mcount = _dl_mcount,
021723ab 375 ._dl_lookup_symbol_x = _dl_lookup_symbol_x,
9dcafc55 376 ._dl_open = _dl_open,
93025f93 377 ._dl_close = _dl_close,
b2964eb1 378 ._dl_catch_error = _rtld_catch_error,
fada9018 379 ._dl_error_free = _dl_error_free,
7c22c7ec
UD
380 ._dl_tls_get_addr_soft = _dl_tls_get_addr_soft,
381#ifdef HAVE_DL_DISCOVER_OSVERSION
382 ._dl_discover_osversion = _dl_discover_osversion
383#endif
afdca0f2
UD
384 };
385/* If we would use strong_alias here the compiler would see a
386 non-hidden definition. This would undo the effect of the previous
387 declaration. So spell out was strong_alias does plus add the
388 visibility attribute. */
389extern struct rtld_global_ro _rtld_local_ro
390 __attribute__ ((alias ("_rtld_global_ro"), visibility ("hidden")));
391
392
67ddea92 393static void dl_main (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
3a56ea26 394 ElfW(Addr) *user_entry, ElfW(auxv_t) *auxv);
d66e34cd 395
392a6b52 396/* These two variables cannot be moved into .data.rel.ro. */
d6b5d570
UD
397static struct libname_list _dl_rtld_libname;
398static struct libname_list _dl_rtld_libname2;
86d2c878 399
db276fa1 400/* Variable for statistics. */
1e372ded
AZ
401RLTD_TIMING_DECLARE (relocate_time, static);
402RLTD_TIMING_DECLARE (load_time, static, attribute_relro);
403RLTD_TIMING_DECLARE (start_time, static, attribute_relro);
db276fa1 404
2a76f7ef
UD
405/* Additional definitions needed by TLS initialization. */
406#ifdef TLS_INIT_HELPER
407TLS_INIT_HELPER
5e289179
UD
408#endif
409
410/* Helper function for syscall implementation. */
411#ifdef DL_SYSINFO_IMPLEMENTATION
412DL_SYSINFO_IMPLEMENTATION
2a76f7ef
UD
413#endif
414
01d8e36d
UD
415/* Before ld.so is relocated we must not access variables which need
416 relocations. This means variables which are exported. Variables
417 declared as static are fine. If we can mark a variable hidden this
27a754a9 418 is fine, too. The latter is important here. We can avoid setting
01d8e36d
UD
419 up a temporary link map for ld.so if we can mark _rtld_global as
420 hidden. */
11bf311e 421#ifdef PI_STATIC_AND_HIDDEN
01d8e36d
UD
422# define DONT_USE_BOOTSTRAP_MAP 1
423#endif
424
425#ifdef DONT_USE_BOOTSTRAP_MAP
426static ElfW(Addr) _dl_start_final (void *arg);
427#else
4874b009
RM
428struct dl_start_final_info
429{
430 struct link_map l;
1e372ded 431 RTLD_TIMING_VAR (start_time);
4874b009 432};
01d8e36d 433static ElfW(Addr) _dl_start_final (void *arg,
4874b009 434 struct dl_start_final_info *info);
01d8e36d 435#endif
6a1db4ff 436
65da9563
RM
437/* These defined magically in the linker script. */
438extern char _begin[] attribute_hidden;
eec8b6ca 439extern char _etext[] attribute_hidden;
65da9563
RM
440extern char _end[] attribute_hidden;
441
442
b1dbbaa4
RM
443#ifdef RTLD_START
444RTLD_START
445#else
eaad82e0 446# error "sysdeps/MACHINE/dl-machine.h fails to define RTLD_START"
b1dbbaa4
RM
447#endif
448
c2248c44
RM
449/* This is the second half of _dl_start (below). It can be inlined safely
450 under DONT_USE_BOOTSTRAP_MAP, where it is careful not to make any GOT
451 references. When the tools don't permit us to avoid using a GOT entry
452 for _dl_rtld_global (no attribute_hidden support), we must make sure
453 this function is not inlined (see below). */
454
455#ifdef DONT_USE_BOOTSTRAP_MAP
456static inline ElfW(Addr) __attribute__ ((always_inline))
457_dl_start_final (void *arg)
458#else
459static ElfW(Addr) __attribute__ ((noinline))
4874b009 460_dl_start_final (void *arg, struct dl_start_final_info *info)
c2248c44
RM
461#endif
462{
463 ElfW(Addr) start_addr;
c2248c44 464
1e372ded
AZ
465 /* If it hasn't happen yet record the startup time. */
466 rtld_timer_start (&start_time);
467#if !defined DONT_USE_BOOTSTRAP_MAP
468 RTLD_TIMING_SET (start_time, info->start_time);
4874b009 469#endif
c2248c44
RM
470
471 /* Transfer data about ourselves to the permanent link_map structure. */
472#ifndef DONT_USE_BOOTSTRAP_MAP
4874b009
RM
473 GL(dl_rtld_map).l_addr = info->l.l_addr;
474 GL(dl_rtld_map).l_ld = info->l.l_ld;
b413280c 475 GL(dl_rtld_map).l_ld_readonly = info->l.l_ld_readonly;
4874b009 476 memcpy (GL(dl_rtld_map).l_info, info->l.l_info,
c2248c44 477 sizeof GL(dl_rtld_map).l_info);
4874b009 478 GL(dl_rtld_map).l_mach = info->l.l_mach;
82221992 479 GL(dl_rtld_map).l_relocated = 1;
c2248c44
RM
480#endif
481 _dl_setup_hash (&GL(dl_rtld_map));
c0f62c56 482 GL(dl_rtld_map).l_real = &GL(dl_rtld_map);
c2248c44
RM
483 GL(dl_rtld_map).l_map_start = (ElfW(Addr)) _begin;
484 GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end;
eec8b6ca 485 GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext;
c2248c44 486 /* Copy the TLS related data if necessary. */
11bf311e 487#ifndef DONT_USE_BOOTSTRAP_MAP
3d8c8bff 488# if NO_TLS_OFFSET != 0
299601a1 489 GL(dl_rtld_map).l_tls_offset = NO_TLS_OFFSET;
c2248c44 490# endif
c2248c44
RM
491#endif
492
ea4f25a7
UD
493 /* Initialize the stack end variable. */
494 __libc_stack_end = __builtin_frame_address (0);
495
c2248c44
RM
496 /* Call the OS-dependent function to set up life so we can do things like
497 file access. It will call `dl_main' (below) to do all the real work
498 of the dynamic linker, and then unwind our frame and run the user
499 entry point on the same stack we entered on. */
ecdeaac0 500 start_addr = _dl_sysdep_start (arg, &dl_main);
c2248c44 501
a1ffb40e 502 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS))
39b04aa3 503 {
1e372ded
AZ
504 RTLD_TIMING_VAR (rtld_total_time);
505 rtld_timer_stop (&rtld_total_time, start_time);
506 print_statistics (RTLD_TIMING_REF(rtld_total_time));
39b04aa3 507 }
c2248c44
RM
508
509 return start_addr;
510}
511
01d8e36d
UD
512#ifdef DONT_USE_BOOTSTRAP_MAP
513# define bootstrap_map GL(dl_rtld_map)
514#else
4874b009 515# define bootstrap_map info.l
739d440d 516#endif
d66e34cd 517
490e6c62
FS
518static ElfW(Addr) __attribute_used__
519_dl_start (void *arg)
520{
4874b009 521#ifdef DONT_USE_BOOTSTRAP_MAP
1e372ded 522 rtld_timer_start (&start_time);
4874b009 523#else
490e6c62 524 struct dl_start_final_info info;
1e372ded 525 rtld_timer_start (&info.start_time);
4874b009 526#endif
db276fa1 527
e66d0a4c
UD
528 /* Partly clean the `bootstrap_map' structure up. Don't use
529 `memset' since it might not be built in or inlined and we cannot
530 make function calls at this point. Use '__builtin_memset' if we
01d8e36d
UD
531 know it is available. We do not have to clear the memory if we
532 do not have to use the temporary bootstrap_map. Global variables
533 are initialized to zero by default. */
534#ifndef DONT_USE_BOOTSTRAP_MAP
535# ifdef HAVE_BUILTIN_MEMSET
e66d0a4c 536 __builtin_memset (bootstrap_map.l_info, '\0', sizeof (bootstrap_map.l_info));
01d8e36d 537# else
ce460d04 538 for (size_t cnt = 0;
264ec183
UD
539 cnt < sizeof (bootstrap_map.l_info) / sizeof (bootstrap_map.l_info[0]);
540 ++cnt)
541 bootstrap_map.l_info[cnt] = 0;
01d8e36d 542# endif
e66d0a4c 543#endif
264ec183 544
d66e34cd 545 /* Figure out the run-time load address of the dynamic linker itself. */
86d2c878 546 bootstrap_map.l_addr = elf_machine_load_address ();
d66e34cd 547
47707456
UD
548 /* Read our own dynamic section and fill in the info array. */
549 bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
2ec99d8c 550 bootstrap_map.l_ld_readonly = DL_RO_DYN_SECTION;
5118dcac 551 elf_get_dynamic_info (&bootstrap_map, true, false);
d66e34cd 552
11bf311e 553#if NO_TLS_OFFSET != 0
299601a1
UD
554 bootstrap_map.l_tls_offset = NO_TLS_OFFSET;
555#endif
556
d66e34cd 557#ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
490e6c62 558 ELF_MACHINE_BEFORE_RTLD_RELOC (&bootstrap_map, bootstrap_map.l_info);
d66e34cd
RM
559#endif
560
32e6df36
UD
561 if (bootstrap_map.l_addr || ! bootstrap_map.l_info[VALIDX(DT_GNU_PRELINKED)])
562 {
563 /* Relocate ourselves so we can do normal function calls and
564 data access using the global offset table. */
565
490e6c62 566 ELF_DYNAMIC_RELOCATE (&bootstrap_map, NULL, 0, 0, 0);
32e6df36 567 }
f85f3563 568 bootstrap_map.l_relocated = 1;
421f82e5 569
ea7eb7e3
UD
570 /* Please note that we don't allow profiling of this object and
571 therefore need not test whether we have to allocate the array
572 for the relocation results (as done in dl-reloc.c). */
421f82e5 573
d66e34cd
RM
574 /* Now life is sane; we can call functions and access global data.
575 Set up to use the operating system facilities, and find out from
576 the operating system's program loader where to find the program
6a1db4ff
UD
577 header table in core. Put the rest of _dl_start into a separate
578 function, that way the compiler cannot put accesses to the GOT
579 before ELF_DYNAMIC_RELOCATE. */
3a0ecccb
FW
580
581 __rtld_malloc_init_stubs ();
582
c0282c06 583 {
01d8e36d
UD
584#ifdef DONT_USE_BOOTSTRAP_MAP
585 ElfW(Addr) entry = _dl_start_final (arg);
586#else
4874b009 587 ElfW(Addr) entry = _dl_start_final (arg, &info);
01d8e36d 588#endif
c0282c06
UD
589
590#ifndef ELF_MACHINE_START_ADDRESS
591# define ELF_MACHINE_START_ADDRESS(map, start) (start)
592#endif
593
7cb92a99 594 return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, entry);
c0282c06 595 }
6a1db4ff
UD
596}
597
598
d66e34cd 599
d66e34cd
RM
600/* Now life is peachy; we can do all normal operations.
601 On to the real work. */
602
993b3242
UD
603/* Some helper functions. */
604
605/* Arguments to relocate_doit. */
606struct relocate_args
607{
608 struct link_map *l;
2ca285b0 609 int reloc_mode;
993b3242
UD
610};
611
612struct map_args
613{
614 /* Argument to map_doit. */
acf869f4 615 const char *str;
f04b9a68 616 struct link_map *loader;
f04b9a68 617 int mode;
993b3242 618 /* Return value of map_doit. */
f04b9a68 619 struct link_map *map;
993b3242
UD
620};
621
9dcafc55
UD
622struct dlmopen_args
623{
624 const char *fname;
625 struct link_map *map;
626};
627
628struct lookup_args
629{
630 const char *name;
631 struct link_map *map;
632 void *result;
633};
634
993b3242
UD
635/* Arguments to version_check_doit. */
636struct version_check_args
637{
993b3242 638 int doexit;
145b8413 639 int dotrace;
993b3242
UD
640};
641
642static void
643relocate_doit (void *a)
644{
645 struct relocate_args *args = (struct relocate_args *) a;
646
2ca285b0 647 _dl_relocate_object (args->l, args->l->l_scope, args->reloc_mode, 0);
993b3242
UD
648}
649
650static void
651map_doit (void *a)
652{
be935610 653 struct map_args *args = (struct map_args *) a;
798212a0
PP
654 int type = (args->mode == __RTLD_OPENEXEC) ? lt_executable : lt_library;
655 args->map = _dl_map_object (args->loader, args->str, type, 0,
8e9f92e9 656 args->mode, LM_ID_BASE);
993b3242
UD
657}
658
9dcafc55
UD
659static void
660dlmopen_doit (void *a)
661{
662 struct dlmopen_args *args = (struct dlmopen_args *) a;
8e9f92e9
AS
663 args->map = _dl_open (args->fname,
664 (RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT
665 | __RTLD_SECURE),
4243cbea 666 dl_main, LM_ID_NEWLM, _dl_argc, _dl_argv,
9dcafc55
UD
667 __environ);
668}
669
670static void
671lookup_doit (void *a)
672{
673 struct lookup_args *args = (struct lookup_args *) a;
674 const ElfW(Sym) *ref = NULL;
675 args->result = NULL;
676 lookup_t l = _dl_lookup_symbol_x (args->name, args->map, &ref,
677 args->map->l_local_scope, NULL, 0,
678 DL_LOOKUP_RETURN_NEWEST, NULL);
679 if (ref != NULL)
680 args->result = DL_SYMBOL_ADDRESS (l, ref);
681}
682
993b3242
UD
683static void
684version_check_doit (void *a)
685{
be935610 686 struct version_check_args *args = (struct version_check_args *) a;
c0f62c56
UD
687 if (_dl_check_all_versions (GL(dl_ns)[LM_ID_BASE]._ns_loaded, 1,
688 args->dotrace) && args->doexit)
993b3242
UD
689 /* We cannot start the application. Abort now. */
690 _exit (1);
691}
692
ce37fa88
UD
693
694static inline struct link_map *
695find_needed (const char *name)
696{
c0f62c56
UD
697 struct r_scope_elem *scope = &GL(dl_ns)[LM_ID_BASE]._ns_loaded->l_searchlist;
698 unsigned int n = scope->r_nlist;
ce37fa88 699
be935610 700 while (n-- > 0)
c0f62c56
UD
701 if (_dl_name_match_p (name, scope->r_list[n]))
702 return scope->r_list[n];
ce37fa88
UD
703
704 /* Should never happen. */
705 return NULL;
706}
707
708static int
709match_version (const char *string, struct link_map *map)
710{
a42195db 711 const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
ce37fa88
UD
712 ElfW(Verdef) *def;
713
b0982c4a 714#define VERDEFTAG (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERDEF))
ce37fa88
UD
715 if (map->l_info[VERDEFTAG] == NULL)
716 /* The file has no symbol versioning. */
717 return 0;
718
719 def = (ElfW(Verdef) *) ((char *) map->l_addr
720 + map->l_info[VERDEFTAG]->d_un.d_ptr);
721 while (1)
722 {
723 ElfW(Verdaux) *aux = (ElfW(Verdaux) *) ((char *) def + def->vd_aux);
724
725 /* Compare the version strings. */
726 if (strcmp (string, strtab + aux->vda_name) == 0)
727 /* Bingo! */
728 return 1;
729
730 /* If no more definitions we failed to find what we want. */
731 if (def->vd_next == 0)
732 break;
733
734 /* Next definition. */
735 def = (ElfW(Verdef) *) ((char *) def + def->vd_next);
736 }
737
738 return 0;
739}
740
9dcafc55
UD
741static bool tls_init_tp_called;
742
743static void *
17796419 744init_tls (size_t naudit)
9dcafc55
UD
745{
746 /* Number of elements in the static TLS block. */
747 GL(dl_tls_static_nelem) = GL(dl_tls_max_dtv_idx);
748
749 /* Do not do this twice. The audit interface might have required
750 the DTV interfaces to be set up early. */
751 if (GL(dl_initial_dtv) != NULL)
752 return NULL;
753
754 /* Allocate the array which contains the information about the
755 dtv slots. We allocate a few entries more than needed to
756 avoid the need for reallocation. */
757 size_t nelem = GL(dl_tls_max_dtv_idx) + 1 + TLS_SLOTINFO_SURPLUS;
758
759 /* Allocate. */
760 GL(dl_tls_dtv_slotinfo_list) = (struct dtv_slotinfo_list *)
761 calloc (sizeof (struct dtv_slotinfo_list)
762 + nelem * sizeof (struct dtv_slotinfo), 1);
763 /* No need to check the return value. If memory allocation failed
764 the program would have been terminated. */
765
766 struct dtv_slotinfo *slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
767 GL(dl_tls_dtv_slotinfo_list)->len = nelem;
768 GL(dl_tls_dtv_slotinfo_list)->next = NULL;
769
770 /* Fill in the information from the loaded modules. No namespace
771 but the base one can be filled at this time. */
772 assert (GL(dl_ns)[LM_ID_BASE + 1]._ns_loaded == NULL);
773 int i = 0;
774 for (struct link_map *l = GL(dl_ns)[LM_ID_BASE]._ns_loaded; l != NULL;
775 l = l->l_next)
776 if (l->l_tls_blocksize != 0)
777 {
778 /* This is a module with TLS data. Store the map reference.
779 The generation counter is zero. */
780 slotinfo[i].map = l;
781 /* slotinfo[i].gen = 0; */
782 ++i;
783 }
784 assert (i == GL(dl_tls_max_dtv_idx));
785
0c7b002f 786 /* Calculate the size of the static TLS surplus. */
17796419 787 _dl_tls_static_surplus_init (naudit);
0c7b002f 788
9dcafc55
UD
789 /* Compute the TLS offsets for the various blocks. */
790 _dl_determine_tlsoffset ();
791
792 /* Construct the static TLS block and the dtv for the initial
793 thread. For some platforms this will include allocating memory
794 for the thread descriptor. The memory for the TLS block will
795 never be freed. It should be allocated accordingly. The dtv
796 array can be changed if dynamic loading requires it. */
797 void *tcbp = _dl_allocate_tls_storage ();
798 if (tcbp == NULL)
799 _dl_fatal_printf ("\
f648728c 800cannot allocate TLS data structures for initial thread\n");
9dcafc55
UD
801
802 /* Store for detection of the special case by __tls_get_addr
803 so it knows not to pass this dtv to the normal realloc. */
804 GL(dl_initial_dtv) = GET_DTV (tcbp);
805
3d8c8bff 806 /* And finally install it for the main thread. */
774f9285 807 const char *lossage = TLS_INIT_TP (tcbp);
a1ffb40e 808 if (__glibc_unlikely (lossage != NULL))
9dcafc55 809 _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
90d7e7e5 810 __tls_init_tp ();
9dcafc55
UD
811 tls_init_tp_called = true;
812
813 return tcbp;
814}
9dcafc55 815
20fe49b9 816static unsigned int
acf869f4 817do_preload (const char *fname, struct link_map *main_map, const char *where)
20fe49b9
UD
818{
819 const char *objname;
820 const char *err_str = NULL;
821 struct map_args args;
74780cf6 822 bool malloced;
20fe49b9
UD
823
824 args.str = fname;
825 args.loader = main_map;
8e9f92e9 826 args.mode = __RTLD_SECURE;
20fe49b9
UD
827
828 unsigned int old_nloaded = GL(dl_ns)[LM_ID_BASE]._ns_nloaded;
829
74780cf6 830 (void) _dl_catch_error (&objname, &err_str, &malloced, map_doit, &args);
a1ffb40e 831 if (__glibc_unlikely (err_str != NULL))
20fe49b9
UD
832 {
833 _dl_error_printf ("\
4db5b08f
MS
834ERROR: ld.so: object '%s' from %s cannot be preloaded (%s): ignored.\n",
835 fname, where, err_str);
20fe49b9
UD
836 /* No need to call free, this is still before
837 the libc's malloc is used. */
838 }
839 else if (GL(dl_ns)[LM_ID_BASE]._ns_nloaded != old_nloaded)
840 /* It is no duplicate. */
841 return 1;
842
843 /* Nothing loaded. */
844 return 0;
845}
846
4c48ef06
UD
847static void
848security_init (void)
849{
850 /* Set up the stack checker's canary. */
965cb60a 851 uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
4c48ef06
UD
852#ifdef THREAD_SET_STACK_GUARD
853 THREAD_SET_STACK_GUARD (stack_chk_guard);
854#else
855 __stack_chk_guard = stack_chk_guard;
856#endif
857
858 /* Set up the pointer guard as well, if necessary. */
a014cecd
FW
859 uintptr_t pointer_chk_guard
860 = _dl_setup_pointer_guard (_dl_random, stack_chk_guard);
4c48ef06 861#ifdef THREAD_SET_POINTER_GUARD
a014cecd 862 THREAD_SET_POINTER_GUARD (pointer_chk_guard);
4c48ef06 863#endif
a014cecd 864 __pointer_chk_guard_local = pointer_chk_guard;
965cb60a
UD
865
866 /* We do not need the _dl_random value anymore. The less
867 information we leave behind, the better, so clear the
868 variable. */
869 _dl_random = NULL;
4c48ef06
UD
870}
871
1bdda52f 872#include <setup-vdso.h>
4c48ef06 873
6d0ba622
FW
874/* The LD_PRELOAD environment variable gives list of libraries
875 separated by white space or colons that are loaded before the
876 executable's dependencies and prepended to the global scope list.
877 (If the binary is running setuid all elements containing a '/' are
878 ignored since it is insecure.) Return the number of preloads
8692ebdb 879 performed. Ditto for --preload command argument. */
6d0ba622 880unsigned int
8692ebdb
DN
881handle_preload_list (const char *preloadlist, struct link_map *main_map,
882 const char *where)
6d0ba622
FW
883{
884 unsigned int npreloads = 0;
885 const char *p = preloadlist;
886 char fname[SECURE_PATH_LIMIT];
887
888 while (*p != '\0')
889 {
890 /* Split preload list at space/colon. */
891 size_t len = strcspn (p, " :");
892 if (len > 0 && len < sizeof (fname))
893 {
894 memcpy (fname, p, len);
895 fname[len] = '\0';
896 }
897 else
898 fname[0] = '\0';
899
900 /* Skip over the substring and the following delimiter. */
901 p += len;
902 if (*p != '\0')
903 ++p;
904
905 if (dso_name_valid_for_suid (fname))
8692ebdb 906 npreloads += do_preload (fname, main_map, where);
6d0ba622
FW
907 }
908 return npreloads;
909}
910
3b856d09
FW
911/* Called if the audit DSO cannot be used: if it does not have the
912 appropriate interfaces, or it expects a more recent version library
913 version than what the dynamic linker provides. */
914static void
915unload_audit_module (struct link_map *map, int original_tls_idx)
916{
917#ifndef NDEBUG
918 Lmid_t ns = map->l_ns;
919#endif
920 _dl_close (map);
921
922 /* Make sure the namespace has been cleared entirely. */
923 assert (GL(dl_ns)[ns]._ns_loaded == NULL);
924 assert (GL(dl_ns)[ns]._ns_nloaded == 0);
925
926 GL(dl_tls_max_dtv_idx) = original_tls_idx;
927}
928
929/* Called to print an error message if loading of an audit module
930 failed. */
931static void
932report_audit_module_load_error (const char *name, const char *err_str,
933 bool malloced)
934{
935 _dl_error_printf ("\
936ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
937 name, err_str);
938 if (malloced)
939 free ((char *) err_str);
940}
941
942/* Load one audit module. */
943static void
944load_audit_module (const char *name, struct audit_ifaces **last_audit)
945{
946 int original_tls_idx = GL(dl_tls_max_dtv_idx);
947
948 struct dlmopen_args dlmargs;
949 dlmargs.fname = name;
950 dlmargs.map = NULL;
951
952 const char *objname;
953 const char *err_str = NULL;
954 bool malloced;
955 _dl_catch_error (&objname, &err_str, &malloced, dlmopen_doit, &dlmargs);
956 if (__glibc_unlikely (err_str != NULL))
957 {
958 report_audit_module_load_error (name, err_str, malloced);
959 return;
960 }
961
962 struct lookup_args largs;
963 largs.name = "la_version";
964 largs.map = dlmargs.map;
965 _dl_catch_error (&objname, &err_str, &malloced, lookup_doit, &largs);
966 if (__glibc_likely (err_str != NULL))
967 {
968 unload_audit_module (dlmargs.map, original_tls_idx);
969 report_audit_module_load_error (name, err_str, malloced);
970 return;
971 }
972
973 unsigned int (*laversion) (unsigned int) = largs.result;
974
975 /* A null symbol indicates that something is very wrong with the
976 loaded object because defined symbols are supposed to have a
977 valid, non-null address. */
978 assert (laversion != NULL);
979
980 unsigned int lav = laversion (LAV_CURRENT);
981 if (lav == 0)
982 {
983 /* Only print an error message if debugging because this can
984 happen deliberately. */
985 if (GLRO(dl_debug_mask) & DL_DEBUG_FILES)
986 _dl_debug_printf ("\
987file=%s [%lu]; audit interface function la_version returned zero; ignored.\n",
988 dlmargs.map->l_name, dlmargs.map->l_ns);
989 unload_audit_module (dlmargs.map, original_tls_idx);
990 return;
991 }
992
993 if (lav > LAV_CURRENT)
994 {
995 _dl_debug_printf ("\
996ERROR: audit interface '%s' requires version %d (maximum supported version %d); ignored.\n",
997 name, lav, LAV_CURRENT);
998 unload_audit_module (dlmargs.map, original_tls_idx);
999 return;
1000 }
1001
1002 enum { naudit_ifaces = 8 };
1003 union
1004 {
1005 struct audit_ifaces ifaces;
1006 void (*fptr[naudit_ifaces]) (void);
1007 } *newp = malloc (sizeof (*newp));
1008 if (newp == NULL)
1009 _dl_fatal_printf ("Out of memory while loading audit modules\n");
1010
1011 /* Names of the auditing interfaces. All in one
1012 long string. */
1013 static const char audit_iface_names[] =
1014 "la_activity\0"
1015 "la_objsearch\0"
1016 "la_objopen\0"
1017 "la_preinit\0"
1018#if __ELF_NATIVE_CLASS == 32
1019 "la_symbind32\0"
1020#elif __ELF_NATIVE_CLASS == 64
1021 "la_symbind64\0"
1022#else
1023# error "__ELF_NATIVE_CLASS must be defined"
1024#endif
1025#define STRING(s) __STRING (s)
1026 "la_" STRING (ARCH_LA_PLTENTER) "\0"
1027 "la_" STRING (ARCH_LA_PLTEXIT) "\0"
1028 "la_objclose\0";
1029 unsigned int cnt = 0;
1030 const char *cp = audit_iface_names;
1031 do
1032 {
1033 largs.name = cp;
1034 _dl_catch_error (&objname, &err_str, &malloced, lookup_doit, &largs);
1035
1036 /* Store the pointer. */
1037 if (err_str == NULL && largs.result != NULL)
c7bf5cea 1038 newp->fptr[cnt] = largs.result;
3b856d09
FW
1039 else
1040 newp->fptr[cnt] = NULL;
1041 ++cnt;
1042
1043 cp = rawmemchr (cp, '\0') + 1;
1044 }
1045 while (*cp != '\0');
1046 assert (cnt == naudit_ifaces);
1047
1048 /* Now append the new auditing interface to the list. */
1049 newp->ifaces.next = NULL;
1050 if (*last_audit == NULL)
1051 *last_audit = GLRO(dl_audit) = &newp->ifaces;
1052 else
1053 *last_audit = (*last_audit)->next = &newp->ifaces;
c7bf5cea 1054
e1d559f3
FW
1055 /* The dynamic linker link map is statically allocated, so the
1056 cookie in _dl_new_object has not happened. */
1057 link_map_audit_state (&GL (dl_rtld_map), GLRO (dl_naudit))->cookie
c7bf5cea
FW
1058 = (intptr_t) &GL (dl_rtld_map);
1059
3b856d09
FW
1060 ++GLRO(dl_naudit);
1061
1062 /* Mark the DSO as being used for auditing. */
1063 dlmargs.map->l_auditing = 1;
1064}
1065
1066/* Notify the the audit modules that the object MAP has already been
1067 loaded. */
1068static void
1069notify_audit_modules_of_loaded_object (struct link_map *map)
1070{
1071 struct audit_ifaces *afct = GLRO(dl_audit);
1072 for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
1073 {
1074 if (afct->objopen != NULL)
1075 {
e1d559f3
FW
1076 struct auditstate *state = link_map_audit_state (map, cnt);
1077 state->bindflags = afct->objopen (map, LM_ID_BASE, &state->cookie);
1078 map->l_audit_any_plt |= state->bindflags != 0;
3b856d09
FW
1079 }
1080
1081 afct = afct->next;
1082 }
1083}
1084
1085/* Load all audit modules. */
1086static void
4c6e0415 1087load_audit_modules (struct link_map *main_map, struct audit_list *audit_list)
3b856d09
FW
1088{
1089 struct audit_ifaces *last_audit = NULL;
3b856d09
FW
1090
1091 while (true)
1092 {
4c6e0415 1093 const char *name = audit_list_next (audit_list);
3b856d09
FW
1094 if (name == NULL)
1095 break;
1096 load_audit_module (name, &last_audit);
1097 }
1098
1099 /* Notify audit modules of the initially loaded modules (the main
1100 program and the dynamic linker itself). */
1101 if (GLRO(dl_naudit) > 0)
1102 {
1103 notify_audit_modules_of_loaded_object (main_map);
1104 notify_audit_modules_of_loaded_object (&GL(dl_rtld_map));
1105 }
1106}
1107
d66e34cd 1108static void
266180eb 1109dl_main (const ElfW(Phdr) *phdr,
72f70279 1110 ElfW(Word) phnum,
3a56ea26
AK
1111 ElfW(Addr) *user_entry,
1112 ElfW(auxv_t) *auxv)
d66e34cd 1113{
266180eb 1114 const ElfW(Phdr) *ph;
c0f62c56 1115 struct link_map *main_map;
14bab8de
UD
1116 size_t file_size;
1117 char *file;
164a7164 1118 bool has_interp = false;
77aba05b 1119 unsigned int i;
164a7164
UD
1120 bool prelinked = false;
1121 bool rtld_is_main = false;
9dcafc55 1122 void *tcbp = NULL;
d66e34cd 1123
2bf9e641
FW
1124 struct dl_main_state state;
1125 dl_main_state_init (&state);
4c6e0415 1126
d017b0ab 1127 __tls_pre_init_tp ();
334fcf2a 1128
2dd87703 1129#if !PTHREAD_IN_LIBC
c70ba488
RM
1130 /* The explicit initialization here is cheaper than processing the reloc
1131 in the _rtld_local definition's initializer. */
1132 GL(dl_make_stack_executable_hook) = &_dl_make_stack_executable;
2dd87703 1133#endif
c70ba488 1134
ea278354 1135 /* Process the environment variable which control the behaviour. */
2bf9e641 1136 process_envvars (&state);
3996f34b 1137
ce6e047f 1138#ifndef HAVE_INLINED_SYSCALLS
46ec036d 1139 /* Set up a flag which tells we are just starting. */
9cf27b8d 1140 _dl_starting_up = 1;
ce6e047f 1141#endif
46ec036d 1142
e0f1a58f 1143 const char *ld_so_name = _dl_argv[0];
a16956f3 1144 if (*user_entry == (ElfW(Addr)) ENTRY_POINT)
0200214b
RM
1145 {
1146 /* Ho ho. We are not the program interpreter! We are the program
1147 itself! This means someone ran ld.so as a command. Well, that
1148 might be convenient to do sometimes. We support it by
1149 interpreting the args like this:
1150
1151 ld.so PROGRAM ARGS...
1152
1153 The first argument is the name of a file containing an ELF
1154 executable we will load and run with the following arguments.
1155 To simplify life here, PROGRAM is searched for using the
1156 normal rules for shared objects, rather than $PATH or anything
1157 like that. We just load it and use its entry point; we don't
1158 pay attention to its PT_INTERP command (we are the interpreter
1159 ourselves). This is an easy way to test a new ld.so before
1160 installing it. */
164a7164 1161 rtld_is_main = true;
421f82e5 1162
c6702789
VM
1163 char *argv0 = NULL;
1164
ffee1316 1165 /* Note the place where the dynamic linker actually came from. */
e6caf4e1 1166 GL(dl_rtld_map).l_name = rtld_progname;
6a76c115 1167
fd26970f 1168 while (_dl_argc > 1)
4243cbea 1169 if (! strcmp (_dl_argv[1], "--list"))
fd26970f 1170 {
e0f1a58f
FW
1171 if (state.mode != rtld_mode_help)
1172 {
1173 state.mode = rtld_mode_list;
1174 /* This means do no dependency analysis. */
1175 GLRO(dl_lazy) = -1;
1176 }
61965e9b 1177
fd26970f
UD
1178 ++_dl_skip_args;
1179 --_dl_argc;
4243cbea 1180 ++_dl_argv;
fd26970f 1181 }
4243cbea 1182 else if (! strcmp (_dl_argv[1], "--verify"))
fd26970f 1183 {
e0f1a58f
FW
1184 if (state.mode != rtld_mode_help)
1185 state.mode = rtld_mode_verify;
6a76c115 1186
73d65cc3
SP
1187 ++_dl_skip_args;
1188 --_dl_argc;
4243cbea 1189 ++_dl_argv;
73d65cc3 1190 }
4243cbea 1191 else if (! strcmp (_dl_argv[1], "--inhibit-cache"))
73d65cc3
SP
1192 {
1193 GLRO(dl_inhibit_cache) = 1;
fd26970f
UD
1194 ++_dl_skip_args;
1195 --_dl_argc;
4243cbea 1196 ++_dl_argv;
fd26970f 1197 }
4243cbea 1198 else if (! strcmp (_dl_argv[1], "--library-path")
e6caf4e1 1199 && _dl_argc > 2)
880f421f 1200 {
2bf9e641 1201 state.library_path = _dl_argv[2];
27316f4a 1202 state.library_path_source = "--library-path";
880f421f 1203
310930c1
UD
1204 _dl_skip_args += 2;
1205 _dl_argc -= 2;
4243cbea 1206 _dl_argv += 2;
310930c1 1207 }
4243cbea 1208 else if (! strcmp (_dl_argv[1], "--inhibit-rpath")
e6caf4e1 1209 && _dl_argc > 2)
310930c1 1210 {
4243cbea 1211 GLRO(dl_inhibit_rpath) = _dl_argv[2];
310930c1 1212
74780cf6
UD
1213 _dl_skip_args += 2;
1214 _dl_argc -= 2;
4243cbea 1215 _dl_argv += 2;
74780cf6 1216 }
4243cbea 1217 else if (! strcmp (_dl_argv[1], "--audit") && _dl_argc > 2)
74780cf6 1218 {
2bf9e641 1219 audit_list_add_string (&state.audit_list, _dl_argv[2]);
74780cf6 1220
8692ebdb
DN
1221 _dl_skip_args += 2;
1222 _dl_argc -= 2;
1223 _dl_argv += 2;
1224 }
1225 else if (! strcmp (_dl_argv[1], "--preload") && _dl_argc > 2)
1226 {
2bf9e641 1227 state.preloadarg = _dl_argv[2];
c6702789
VM
1228 _dl_skip_args += 2;
1229 _dl_argc -= 2;
1230 _dl_argv += 2;
1231 }
1232 else if (! strcmp (_dl_argv[1], "--argv0") && _dl_argc > 2)
1233 {
1234 argv0 = _dl_argv[2];
1235
dad90d52
FW
1236 _dl_skip_args += 2;
1237 _dl_argc -= 2;
1238 _dl_argv += 2;
1239 }
1240 else if (strcmp (_dl_argv[1], "--glibc-hwcaps-prepend") == 0
1241 && _dl_argc > 2)
1242 {
1243 state.glibc_hwcaps_prepend = _dl_argv[2];
1244 _dl_skip_args += 2;
1245 _dl_argc -= 2;
1246 _dl_argv += 2;
1247 }
1248 else if (strcmp (_dl_argv[1], "--glibc-hwcaps-mask") == 0
1249 && _dl_argc > 2)
1250 {
1251 state.glibc_hwcaps_mask = _dl_argv[2];
880f421f
UD
1252 _dl_skip_args += 2;
1253 _dl_argc -= 2;
4243cbea 1254 _dl_argv += 2;
880f421f 1255 }
86f65dff
L
1256#if HAVE_TUNABLES
1257 else if (! strcmp (_dl_argv[1], "--list-tunables"))
1258 {
1259 state.mode = rtld_mode_list_tunables;
1260
1261 ++_dl_skip_args;
1262 --_dl_argc;
1263 ++_dl_argv;
1264 }
1265#endif
851f32cf
FW
1266 else if (! strcmp (_dl_argv[1], "--list-diagnostics"))
1267 {
1268 state.mode = rtld_mode_list_diagnostics;
1269
1270 ++_dl_skip_args;
1271 --_dl_argc;
1272 ++_dl_argv;
1273 }
e0f1a58f
FW
1274 else if (strcmp (_dl_argv[1], "--help") == 0)
1275 {
1276 state.mode = rtld_mode_help;
1277 --_dl_argc;
1278 ++_dl_argv;
1279 }
542923d9
FW
1280 else if (strcmp (_dl_argv[1], "--version") == 0)
1281 _dl_version ();
e0f1a58f
FW
1282 else if (_dl_argv[1][0] == '-' && _dl_argv[1][1] == '-')
1283 {
1284 if (_dl_argv[1][1] == '\0')
1285 /* End of option list. */
1286 break;
1287 else
1288 /* Unrecognized option. */
1289 _dl_usage (ld_so_name, _dl_argv[1]);
1290 }
fd26970f
UD
1291 else
1292 break;
d66e34cd 1293
86f65dff
L
1294#if HAVE_TUNABLES
1295 if (__glibc_unlikely (state.mode == rtld_mode_list_tunables))
1296 {
1297 __tunables_print ();
1298 _exit (0);
1299 }
1300#endif
1301
851f32cf
FW
1302 if (state.mode == rtld_mode_list_diagnostics)
1303 _dl_print_diagnostics (_environ);
1304
61eb22d3
UD
1305 /* If we have no further argument the program was called incorrectly.
1306 Grant the user some education. */
1307 if (_dl_argc < 2)
e0f1a58f
FW
1308 {
1309 if (state.mode == rtld_mode_help)
1310 /* --help without an executable is not an error. */
1311 _dl_help (ld_so_name, &state);
1312 else
1313 _dl_usage (ld_so_name, NULL);
1314 }
61eb22d3 1315
0200214b
RM
1316 ++_dl_skip_args;
1317 --_dl_argc;
4243cbea 1318 ++_dl_argv;
91f62ce6 1319
c70ba488
RM
1320 /* The initialization of _dl_stack_flags done below assumes the
1321 executable's PT_GNU_STACK may have been honored by the kernel, and
1322 so a PT_GNU_STACK with PF_X set means the stack started out with
1323 execute permission. However, this is not really true if the
1324 dynamic linker is the executable the kernel loaded. For this
1325 case, we must reinitialize _dl_stack_flags to match the dynamic
1326 linker itself. If the dynamic linker was built with a
1327 PT_GNU_STACK, then the kernel may have loaded us with a
1328 nonexecutable stack that we will have to make executable when we
1329 load the program below unless it has a PT_GNU_STACK indicating
1330 nonexecutable stack is ok. */
1331
1332 for (ph = phdr; ph < &phdr[phnum]; ++ph)
1333 if (ph->p_type == PT_GNU_STACK)
1334 {
1335 GL(dl_stack_flags) = ph->p_flags;
1336 break;
1337 }
1338
e0f1a58f
FW
1339 if (__glibc_unlikely (state.mode == rtld_mode_verify
1340 || state.mode == rtld_mode_help))
2de99474 1341 {
8e17ea58
UD
1342 const char *objname;
1343 const char *err_str = NULL;
993b3242 1344 struct map_args args;
74780cf6 1345 bool malloced;
2de99474 1346
e6caf4e1 1347 args.str = rtld_progname;
f04b9a68 1348 args.loader = NULL;
f04b9a68 1349 args.mode = __RTLD_OPENEXEC;
74780cf6
UD
1350 (void) _dl_catch_error (&objname, &err_str, &malloced, map_doit,
1351 &args);
a1ffb40e 1352 if (__glibc_unlikely (err_str != NULL))
e0f1a58f
FW
1353 {
1354 /* We don't free the returned string, the programs stops
1355 anyway. */
1356 if (state.mode == rtld_mode_help)
1357 /* Mask the failure to load the main object. The help
1358 message contains less information in this case. */
1359 _dl_help (ld_so_name, &state);
1360 else
1361 _exit (EXIT_FAILURE);
1362 }
2de99474
UD
1363 }
1364 else
db276fa1 1365 {
1e372ded
AZ
1366 RTLD_TIMING_VAR (start);
1367 rtld_timer_start (&start);
798212a0 1368 _dl_map_object (NULL, rtld_progname, lt_executable, 0,
c0f62c56 1369 __RTLD_OPENEXEC, LM_ID_BASE);
1e372ded 1370 rtld_timer_stop (&load_time, start);
db276fa1 1371 }
2de99474 1372
c0f62c56
UD
1373 /* Now the map for the main executable is available. */
1374 main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
1375
2bf9e641 1376 if (__glibc_likely (state.mode == rtld_mode_normal)
f3fd569c 1377 && GL(dl_rtld_map).l_info[DT_SONAME] != NULL
01f16ab0
UD
1378 && main_map->l_info[DT_SONAME] != NULL
1379 && strcmp ((const char *) D_PTR (&GL(dl_rtld_map), l_info[DT_STRTAB])
1380 + GL(dl_rtld_map).l_info[DT_SONAME]->d_un.d_val,
1381 (const char *) D_PTR (main_map, l_info[DT_STRTAB])
1382 + main_map->l_info[DT_SONAME]->d_un.d_val) == 0)
1383 _dl_fatal_printf ("loader cannot load itself\n");
1384
c0f62c56
UD
1385 phdr = main_map->l_phdr;
1386 phnum = main_map->l_phnum;
143e2b96
UD
1387 /* We overwrite here a pointer to a malloc()ed string. But since
1388 the malloc() implementation used at this point is the dummy
1389 implementations which has no real free() function it does not
1390 makes sense to free the old string first. */
c0f62c56
UD
1391 main_map->l_name = (char *) "";
1392 *user_entry = main_map->l_entry;
3a56ea26 1393
15a0c573
CLT
1394 /* Set bit indicating this is the main program map. */
1395 main_map->l_main_map = 1;
1396
bc58236c 1397#ifdef HAVE_AUX_VECTOR
3a56ea26
AK
1398 /* Adjust the on-stack auxiliary vector so that it looks like the
1399 binary was executed directly. */
bc58236c 1400 for (ElfW(auxv_t) *av = auxv; av->a_type != AT_NULL; av++)
3a56ea26
AK
1401 switch (av->a_type)
1402 {
1403 case AT_PHDR:
4dd019e3 1404 av->a_un.a_val = (uintptr_t) phdr;
3a56ea26
AK
1405 break;
1406 case AT_PHNUM:
1407 av->a_un.a_val = phnum;
1408 break;
1409 case AT_ENTRY:
1410 av->a_un.a_val = *user_entry;
1411 break;
5c349950
PP
1412 case AT_EXECFN:
1413 av->a_un.a_val = (uintptr_t) _dl_argv[0];
1414 break;
3a56ea26 1415 }
bc58236c 1416#endif
c6702789
VM
1417
1418 /* Set the argv[0] string now that we've processed the executable. */
1419 if (argv0 != NULL)
1420 _dl_argv[0] = argv0;
0200214b
RM
1421 }
1422 else
1423 {
1424 /* Create a link_map for the executable itself.
1425 This will be what dlopen on "" returns. */
9fbdeb41
UD
1426 main_map = _dl_new_object ((char *) "", "", lt_executable, NULL,
1427 __RTLD_OPENEXEC, LM_ID_BASE);
9dcafc55 1428 assert (main_map != NULL);
c0f62c56
UD
1429 main_map->l_phdr = phdr;
1430 main_map->l_phnum = phnum;
1431 main_map->l_entry = *user_entry;
da832465 1432
f0967738
AK
1433 /* Even though the link map is not yet fully initialized we can add
1434 it to the map list since there are no possible users running yet. */
1435 _dl_add_to_namespace_list (main_map, LM_ID_BASE);
fa41c84d 1436 assert (main_map == GL(dl_ns)[LM_ID_BASE]._ns_loaded);
f0967738 1437
61e0617a
UD
1438 /* At this point we are in a bit of trouble. We would have to
1439 fill in the values for l_dev and l_ino. But in general we
1440 do not know where the file is. We also do not handle AT_EXECFD
1441 even if it would be passed up.
1442
1443 We leave the values here defined to 0. This is normally no
1444 problem as the program code itself is normally no shared
1445 object and therefore cannot be loaded dynamically. Nothing
1446 prevent the use of dynamic binaries and in these situations
1447 we might get problems. We might not be able to find out
1448 whether the object is already loaded. But since there is no
1449 easy way out and because the dynamic binary must also not
1450 have an SONAME we ignore this program for now. If it becomes
1451 a problem we can force people using SONAMEs. */
1452
97a51d8a
UD
1453 /* We delay initializing the path structure until we got the dynamic
1454 information for the program. */
0200214b
RM
1455 }
1456
c0f62c56
UD
1457 main_map->l_map_end = 0;
1458 main_map->l_text_end = 0;
052b6a6c 1459 /* Perhaps the executable has no PT_LOAD header entries at all. */
c0f62c56 1460 main_map->l_map_start = ~0;
c0f62c56
UD
1461 /* And it was opened directly. */
1462 ++main_map->l_direct_opencount;
052b6a6c 1463
0200214b 1464 /* Scan the program header table for the dynamic section. */
72f70279 1465 for (ph = phdr; ph < &phdr[phnum]; ++ph)
0200214b
RM
1466 switch (ph->p_type)
1467 {
da832465
UD
1468 case PT_PHDR:
1469 /* Find out the load address. */
c0f62c56 1470 main_map->l_addr = (ElfW(Addr)) phdr - ph->p_vaddr;
da832465 1471 break;
0200214b
RM
1472 case PT_DYNAMIC:
1473 /* This tells us where to find the dynamic section,
1474 which tells us everything we need to do. */
c0f62c56 1475 main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr;
b413280c 1476 main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0;
0200214b
RM
1477 break;
1478 case PT_INTERP:
1479 /* This "interpreter segment" was used by the program loader to
1480 find the program interpreter, which is this program itself, the
1481 dynamic linker. We note what name finds us, so that a future
1482 dlopen call or DT_NEEDED entry, for something that wants to link
1483 against the dynamic linker as a shared library, will know that
1484 the shared object is already loaded. */
c0f62c56 1485 _dl_rtld_libname.name = ((const char *) main_map->l_addr
be935610 1486 + ph->p_vaddr);
752a2a50 1487 /* _dl_rtld_libname.next = NULL; Already zero. */
d6b5d570 1488 GL(dl_rtld_map).l_libname = &_dl_rtld_libname;
f41c8091
UD
1489
1490 /* Ordinarilly, we would get additional names for the loader from
1491 our DT_SONAME. This can't happen if we were actually linked as
1492 a static executable (detect this case when we have no DYNAMIC).
1493 If so, assume the filename component of the interpreter path to
1494 be our SONAME, and add it to our name list. */
d6b5d570 1495 if (GL(dl_rtld_map).l_ld == NULL)
f41c8091 1496 {
88794e30
UD
1497 const char *p = NULL;
1498 const char *cp = _dl_rtld_libname.name;
1499
1500 /* Find the filename part of the path. */
1501 while (*cp != '\0')
1502 if (*cp++ == '/')
1503 p = cp;
1504
1505 if (p != NULL)
f41c8091 1506 {
88794e30 1507 _dl_rtld_libname2.name = p;
752a2a50 1508 /* _dl_rtld_libname2.next = NULL; Already zero. */
f41c8091
UD
1509 _dl_rtld_libname.next = &_dl_rtld_libname2;
1510 }
1511 }
1512
164a7164 1513 has_interp = true;
0200214b 1514 break;
052b6a6c 1515 case PT_LOAD:
052b6a6c
UD
1516 {
1517 ElfW(Addr) mapstart;
2373b30e
UD
1518 ElfW(Addr) allocend;
1519
1520 /* Remember where the main program starts in memory. */
b92e3780
UD
1521 mapstart = (main_map->l_addr
1522 + (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1)));
c0f62c56
UD
1523 if (main_map->l_map_start > mapstart)
1524 main_map->l_map_start = mapstart;
2373b30e
UD
1525
1526 /* Also where it ends. */
c0f62c56
UD
1527 allocend = main_map->l_addr + ph->p_vaddr + ph->p_memsz;
1528 if (main_map->l_map_end < allocend)
1529 main_map->l_map_end = allocend;
1530 if ((ph->p_flags & PF_X) && allocend > main_map->l_text_end)
1531 main_map->l_text_end = allocend;
052b6a6c
UD
1532 }
1533 break;
9dcafc55 1534
a334319f 1535 case PT_TLS:
aed283dd
UD
1536 if (ph->p_memsz > 0)
1537 {
1538 /* Note that in the case the dynamic linker we duplicate work
1539 here since we read the PT_TLS entry already in
1540 _dl_start_final. But the result is repeatable so do not
1541 check for this special but unimportant case. */
c0f62c56
UD
1542 main_map->l_tls_blocksize = ph->p_memsz;
1543 main_map->l_tls_align = ph->p_align;
99fe3b0e 1544 if (ph->p_align == 0)
c0f62c56 1545 main_map->l_tls_firstbyte_offset = 0;
99fe3b0e 1546 else
c0f62c56
UD
1547 main_map->l_tls_firstbyte_offset = (ph->p_vaddr
1548 & (ph->p_align - 1));
1549 main_map->l_tls_initimage_size = ph->p_filesz;
1550 main_map->l_tls_initimage = (void *) ph->p_vaddr;
aed283dd
UD
1551
1552 /* This image gets the ID one. */
c0f62c56 1553 GL(dl_tls_max_dtv_idx) = main_map->l_tls_modid = 1;
aed283dd 1554 }
9dcafc55
UD
1555 break;
1556
ecdeaac0
RM
1557 case PT_GNU_STACK:
1558 GL(dl_stack_flags) = ph->p_flags;
1559 break;
e8ed861d
UD
1560
1561 case PT_GNU_RELRO:
c0f62c56
UD
1562 main_map->l_relro_addr = ph->p_vaddr;
1563 main_map->l_relro_size = ph->p_memsz;
e8ed861d 1564 break;
c7aa8596
SN
1565 }
1566 /* Process program headers again, but scan them backwards so
1567 that PT_NOTE can be skipped if PT_GNU_PROPERTY exits. */
1568 for (ph = &phdr[phnum]; ph != phdr; --ph)
1569 switch (ph[-1].p_type)
1570 {
f753fa7d 1571 case PT_NOTE:
c00452d7 1572 _dl_process_pt_note (main_map, -1, &ph[-1]);
c7aa8596
SN
1573 break;
1574 case PT_GNU_PROPERTY:
c00452d7 1575 _dl_process_pt_gnu_property (main_map, -1, &ph[-1]);
f753fa7d 1576 break;
0200214b 1577 }
11bf311e
UD
1578
1579 /* Adjust the address of the TLS initialization image in case
1580 the executable is actually an ET_DYN object. */
1581 if (main_map->l_tls_initimage != NULL)
1582 main_map->l_tls_initimage
1583 = (char *) main_map->l_tls_initimage + main_map->l_addr;
c0f62c56
UD
1584 if (! main_map->l_map_end)
1585 main_map->l_map_end = ~0;
1586 if (! main_map->l_text_end)
1587 main_map->l_text_end = ~0;
d6b5d570 1588 if (! GL(dl_rtld_map).l_libname && GL(dl_rtld_map).l_name)
c84142e8
UD
1589 {
1590 /* We were invoked directly, so the program might not have a
1591 PT_INTERP. */
d6b5d570 1592 _dl_rtld_libname.name = GL(dl_rtld_map).l_name;
f0967738 1593 /* _dl_rtld_libname.next = NULL; Already zero. */
d6b5d570 1594 GL(dl_rtld_map).l_libname = &_dl_rtld_libname;
c84142e8 1595 }
ffee1316 1596 else
d6b5d570 1597 assert (GL(dl_rtld_map).l_libname); /* How else did we get here? */
0200214b 1598
9dcafc55
UD
1599 /* If the current libname is different from the SONAME, add the
1600 latter as well. */
1601 if (GL(dl_rtld_map).l_info[DT_SONAME] != NULL
1602 && strcmp (GL(dl_rtld_map).l_libname->name,
1603 (const char *) D_PTR (&GL(dl_rtld_map), l_info[DT_STRTAB])
1604 + GL(dl_rtld_map).l_info[DT_SONAME]->d_un.d_val) != 0)
1605 {
1606 static struct libname_list newname;
1607 newname.name = ((char *) D_PTR (&GL(dl_rtld_map), l_info[DT_STRTAB])
1608 + GL(dl_rtld_map).l_info[DT_SONAME]->d_un.d_ptr);
1609 newname.next = NULL;
1610 newname.dont_free = 1;
1611
1612 assert (GL(dl_rtld_map).l_libname->next == NULL);
1613 GL(dl_rtld_map).l_libname->next = &newname;
1614 }
1615 /* The ld.so must be relocated since otherwise loading audit modules
1616 will fail since they reuse the very same ld.so. */
1617 assert (GL(dl_rtld_map).l_relocated);
1618
9a51759b
UD
1619 if (! rtld_is_main)
1620 {
1621 /* Extract the contents of the dynamic section for easy access. */
5118dcac 1622 elf_get_dynamic_info (main_map, false, false);
4d098554
FW
1623
1624 /* If the main map is libc.so, update the base namespace to
1625 refer to this map. If libc.so is loaded later, this happens
1626 in _dl_map_object_from_fd. */
1627 if (main_map->l_info[DT_SONAME] != NULL
1628 && (strcmp (((const char *) D_PTR (main_map, l_info[DT_STRTAB])
1629 + main_map->l_info[DT_SONAME]->d_un.d_val), LIBC_SO)
1630 == 0))
1631 GL(dl_ns)[LM_ID_BASE].libc_map = main_map;
1632
efec5079 1633 /* Set up our cache of pointers into the hash table. */
c0f62c56 1634 _dl_setup_hash (main_map);
9a51759b 1635 }
0200214b 1636
2bf9e641 1637 if (__glibc_unlikely (state.mode == rtld_mode_verify))
e2102c14
UD
1638 {
1639 /* We were called just to verify that this is a dynamic
1640 executable using us as the program interpreter. Exit with an
1641 error if we were not able to load the binary or no interpreter
1642 is specified (i.e., this is no dynamically linked binary. */
c0f62c56 1643 if (main_map->l_ld == NULL)
e2102c14 1644 _exit (1);
e2102c14
UD
1645
1646 /* We allow here some platform specific code. */
1647#ifdef DISTINGUISH_LIB_VERSIONS
1648 DISTINGUISH_LIB_VERSIONS;
1649#endif
eb406346 1650 _exit (has_interp ? 0 : 2);
e2102c14
UD
1651 }
1652
ab1d521d 1653 struct link_map **first_preload = &GL(dl_rtld_map).l_next;
ab1d521d
RM
1654 /* Set up the data structures for the system-supplied DSO early,
1655 so they can influence _dl_init_paths. */
9cee5585 1656 setup_vdso (main_map, &first_preload);
ab1d521d 1657
1bdda52f
AZ
1658 /* With vDSO setup we can initialize the function pointers. */
1659 setup_vdso_pointers ();
1660
ab1d521d 1661#ifdef DL_SYSDEP_OSCHECK
ceb809dc 1662 DL_SYSDEP_OSCHECK (_dl_fatal_printf);
ab1d521d
RM
1663#endif
1664
1665 /* Initialize the data structures for the search paths for shared
1666 objects. */
2bf9e641 1667 call_init_paths (&state);
97a51d8a 1668
a93d9e03 1669 /* Initialize _r_debug_extended. */
29f97654
UD
1670 struct r_debug *r = _dl_debug_initialize (GL(dl_rtld_map).l_addr,
1671 LM_ID_BASE);
9dcafc55
UD
1672 r->r_state = RT_CONSISTENT;
1673
0200214b 1674 /* Put the link_map for ourselves on the chain so it can be found by
ceb2d9aa 1675 name. Note that at this point the global chain of link maps contains
d6b5d570
UD
1676 exactly one element, which is pointed to by dl_loaded. */
1677 if (! GL(dl_rtld_map).l_name)
ffee1316
RM
1678 /* If not invoked directly, the dynamic linker shared object file was
1679 found by the PT_INTERP name. */
d6b5d570
UD
1680 GL(dl_rtld_map).l_name = (char *) GL(dl_rtld_map).l_libname->name;
1681 GL(dl_rtld_map).l_type = lt_library;
c0f62c56
UD
1682 main_map->l_next = &GL(dl_rtld_map);
1683 GL(dl_rtld_map).l_prev = main_map;
1684 ++GL(dl_ns)[LM_ID_BASE]._ns_nloaded;
e8ed861d 1685 ++GL(dl_load_adds);
0200214b 1686
97fd3a30
UD
1687 /* If LD_USE_LOAD_BIAS env variable has not been seen, default
1688 to not using bias for non-prelinked PIEs and libraries
1689 and using it for executables or prelinked PIEs or libraries. */
afdca0f2 1690 if (GLRO(dl_use_load_bias) == (ElfW(Addr)) -2)
c0f62c56 1691 GLRO(dl_use_load_bias) = main_map->l_addr == 0 ? -1 : 0;
97fd3a30 1692
44c4e5d5
RM
1693 /* Starting from binutils-2.23, the linker will define the magic symbol
1694 __ehdr_start to point to our own ELF header if it is visible in a
1695 segment that also includes the phdrs. If that's not available, we use
1696 the old method that assumes the beginning of the file is part of the
1697 lowest-addressed PT_LOAD segment. */
44c4e5d5 1698 extern const ElfW(Ehdr) __ehdr_start __attribute__ ((visibility ("hidden")));
302247c8
FS
1699
1700 /* Set up the program header information for the dynamic linker
1701 itself. It is needed in the dl_iterate_phdr callbacks. */
1702 const ElfW(Ehdr) *rtld_ehdr = &__ehdr_start;
44c4e5d5
RM
1703 assert (rtld_ehdr->e_ehsize == sizeof *rtld_ehdr);
1704 assert (rtld_ehdr->e_phentsize == sizeof (ElfW(Phdr)));
1705
1706 const ElfW(Phdr) *rtld_phdr = (const void *) rtld_ehdr + rtld_ehdr->e_phoff;
1707
e8ed861d 1708 GL(dl_rtld_map).l_phdr = rtld_phdr;
553eca26
UD
1709 GL(dl_rtld_map).l_phnum = rtld_ehdr->e_phnum;
1710
9dcafc55 1711
e8ed861d
UD
1712 /* PT_GNU_RELRO is usually the last phdr. */
1713 size_t cnt = rtld_ehdr->e_phnum;
1714 while (cnt-- > 0)
1715 if (rtld_phdr[cnt].p_type == PT_GNU_RELRO)
1716 {
1717 GL(dl_rtld_map).l_relro_addr = rtld_phdr[cnt].p_vaddr;
1718 GL(dl_rtld_map).l_relro_size = rtld_phdr[cnt].p_memsz;
1719 break;
1720 }
1721
9dcafc55
UD
1722 /* Add the dynamic linker to the TLS list if it also uses TLS. */
1723 if (GL(dl_rtld_map).l_tls_blocksize != 0)
1724 /* Assign a module ID. Do this before loading any audit modules. */
ba33937b 1725 _dl_assign_tls_modid (&GL(dl_rtld_map));
9dcafc55 1726
2bf9e641
FW
1727 audit_list_add_dynamic_tag (&state.audit_list, main_map, DT_AUDIT);
1728 audit_list_add_dynamic_tag (&state.audit_list, main_map, DT_DEPAUDIT);
8f7a75d7 1729
e0f1a58f
FW
1730 /* At this point, all data has been obtained that is included in the
1731 --help output. */
1732 if (__glibc_unlikely (state.mode == rtld_mode_help))
1733 _dl_help (ld_so_name, &state);
1734
9dcafc55 1735 /* If we have auditing DSOs to load, do it now. */
81b82fb9 1736 bool need_security_init = true;
2bf9e641 1737 if (state.audit_list.length > 0)
9dcafc55 1738 {
2bf9e641 1739 size_t naudit = audit_list_count (&state.audit_list);
17796419 1740
3abee0b7
UD
1741 /* Since we start using the auditing DSOs right away we need to
1742 initialize the data structures now. */
17796419 1743 tcbp = init_tls (naudit);
3abee0b7 1744
4c48ef06
UD
1745 /* Initialize security features. We need to do it this early
1746 since otherwise the constructors of the audit libraries will
1747 use different values (especially the pointer guard) and will
1748 fail later on. */
1749 security_init ();
81b82fb9 1750 need_security_init = false;
4c48ef06 1751
2bf9e641 1752 load_audit_modules (main_map, &state.audit_list);
17796419
SN
1753
1754 /* The count based on audit strings may overestimate the number
1755 of audit modules that got loaded, but not underestimate. */
1756 assert (GLRO(dl_naudit) <= naudit);
9dcafc55
UD
1757 }
1758
d0503676
CD
1759 /* Keep track of the currently loaded modules to count how many
1760 non-audit modules which use TLS are loaded. */
1761 size_t count_modids = _dl_count_modids ();
1762
c63d8f80
UD
1763 /* Set up debugging before the debugger is notified for the first time. */
1764#ifdef ELF_MACHINE_DEBUG_SETUP
1765 /* Some machines (e.g. MIPS) don't use DT_DEBUG in this way. */
1766 ELF_MACHINE_DEBUG_SETUP (main_map, r);
c63d8f80
UD
1767#else
1768 if (main_map->l_info[DT_DEBUG] != NULL)
1769 /* There is a DT_DEBUG entry in the dynamic section. Fill it in
1770 with the run-time address of the r_debug structure */
1771 main_map->l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r;
c63d8f80
UD
1772#endif
1773
9dcafc55
UD
1774 /* We start adding objects. */
1775 r->r_state = RT_ADD;
1776 _dl_debug_state ();
815e6fa3 1777 LIBC_PROBE (init_start, 2, LM_ID_BASE, r);
9dcafc55
UD
1778
1779 /* Auditing checkpoint: we are ready to signal that the initial map
1780 is being constructed. */
a1ffb40e 1781 if (__glibc_unlikely (GLRO(dl_naudit) > 0))
9dcafc55
UD
1782 {
1783 struct audit_ifaces *afct = GLRO(dl_audit);
1784 for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
1785 {
1786 if (afct->activity != NULL)
e1d559f3
FW
1787 afct->activity (&link_map_audit_state (main_map, cnt)->cookie,
1788 LA_ACT_ADD);
9dcafc55
UD
1789
1790 afct = afct->next;
1791 }
1792 }
1793
14bab8de 1794 /* We have two ways to specify objects to preload: via environment
49c091e5 1795 variable and via the file /etc/ld.so.preload. The latter can also
14bab8de 1796 be used when security is enabled. */
ab1d521d 1797 assert (*first_preload == NULL);
20fe49b9
UD
1798 struct link_map **preloads = NULL;
1799 unsigned int npreloads = 0;
14bab8de 1800
2bf9e641 1801 if (__glibc_unlikely (state.preloadlist != NULL))
c4029823 1802 {
1e372ded
AZ
1803 RTLD_TIMING_VAR (start);
1804 rtld_timer_start (&start);
2bf9e641
FW
1805 npreloads += handle_preload_list (state.preloadlist, main_map,
1806 "LD_PRELOAD");
1e372ded 1807 rtld_timer_accum (&load_time, start);
8692ebdb
DN
1808 }
1809
2bf9e641 1810 if (__glibc_unlikely (state.preloadarg != NULL))
8692ebdb 1811 {
1e372ded
AZ
1812 RTLD_TIMING_VAR (start);
1813 rtld_timer_start (&start);
2bf9e641
FW
1814 npreloads += handle_preload_list (state.preloadarg, main_map,
1815 "--preload");
1e372ded 1816 rtld_timer_accum (&load_time, start);
c4029823
UD
1817 }
1818
761490a1
UD
1819 /* There usually is no ld.so.preload file, it should only be used
1820 for emergencies and testing. So the open call etc should usually
1821 fail. Using access() on a non-existing file is faster than using
1822 open(). So we do this first. If it succeeds we do almost twice
1823 the work but this does not matter, since it is not for production
1824 use. */
1825 static const char preload_file[] = "/etc/ld.so.preload";
a1ffb40e 1826 if (__glibc_unlikely (__access (preload_file, R_OK) == 0))
14bab8de 1827 {
761490a1
UD
1828 /* Read the contents of the file. */
1829 file = _dl_sysdep_read_whole_file (preload_file, &file_size,
1830 PROT_READ | PROT_WRITE);
a1ffb40e 1831 if (__glibc_unlikely (file != MAP_FAILED))
14bab8de 1832 {
761490a1
UD
1833 /* Parse the file. It contains names of libraries to be loaded,
1834 separated by white spaces or `:'. It may also contain
1835 comments introduced by `#'. */
1836 char *problem;
1837 char *runp;
1838 size_t rest;
1839
1840 /* Eliminate comments. */
e2102c14 1841 runp = file;
761490a1
UD
1842 rest = file_size;
1843 while (rest > 0)
1844 {
1845 char *comment = memchr (runp, '#', rest);
1846 if (comment == NULL)
1847 break;
1848
1849 rest -= comment - runp;
1850 do
1851 *comment = ' ';
1852 while (--rest > 0 && *++comment != '\n');
1853 }
1854
1855 /* We have one problematic case: if we have a name at the end of
1856 the file without a trailing terminating characters, we cannot
1857 place the \0. Handle the case separately. */
1858 if (file[file_size - 1] != ' ' && file[file_size - 1] != '\t'
1859 && file[file_size - 1] != '\n' && file[file_size - 1] != ':')
1860 {
1861 problem = &file[file_size];
1862 while (problem > file && problem[-1] != ' '
1863 && problem[-1] != '\t'
1864 && problem[-1] != '\n' && problem[-1] != ':')
1865 --problem;
1866
1867 if (problem > file)
1868 problem[-1] = '\0';
1869 }
1870 else
1871 {
1872 problem = NULL;
1873 file[file_size - 1] = '\0';
1874 }
f04b9a68 1875
1e372ded
AZ
1876 RTLD_TIMING_VAR (start);
1877 rtld_timer_start (&start);
f04b9a68 1878
761490a1
UD
1879 if (file != problem)
1880 {
1881 char *p;
1882 runp = file;
1883 while ((p = strsep (&runp, ": \t\n")) != NULL)
1884 if (p[0] != '\0')
20fe49b9 1885 npreloads += do_preload (p, main_map, preload_file);
761490a1
UD
1886 }
1887
1888 if (problem != NULL)
1889 {
1890 char *p = strndupa (problem, file_size - (problem - file));
20fe49b9
UD
1891
1892 npreloads += do_preload (p, main_map, preload_file);
761490a1 1893 }
14bab8de 1894
1e372ded 1895 rtld_timer_accum (&load_time, start);
db276fa1 1896
761490a1
UD
1897 /* We don't need the file anymore. */
1898 __munmap (file, file_size);
1899 }
14bab8de
UD
1900 }
1901
a1ffb40e 1902 if (__glibc_unlikely (*first_preload != NULL))
14bab8de
UD
1903 {
1904 /* Set up PRELOADS with a vector of the preloaded libraries. */
ab1d521d 1905 struct link_map *l = *first_preload;
14bab8de 1906 preloads = __alloca (npreloads * sizeof preloads[0]);
14bab8de
UD
1907 i = 0;
1908 do
1909 {
1910 preloads[i++] = l;
1911 l = l->l_next;
1912 } while (l);
1913 assert (i == npreloads);
1914 }
1915
2064087b
RM
1916 /* Load all the libraries specified by DT_NEEDED entries. If LD_PRELOAD
1917 specified some libraries to load, these are inserted before the actual
1918 dependencies in the executable's searchlist for symbol resolution. */
1e372ded
AZ
1919 {
1920 RTLD_TIMING_VAR (start);
1921 rtld_timer_start (&start);
2bf9e641
FW
1922 _dl_map_object_deps (main_map, preloads, npreloads,
1923 state.mode == rtld_mode_trace, 0);
1e372ded
AZ
1924 rtld_timer_accum (&load_time, start);
1925 }
e3e35cfc 1926
20fe49b9 1927 /* Mark all objects as being in the global scope. */
c0f62c56 1928 for (i = main_map->l_searchlist.r_nlist; i > 0; )
20fe49b9 1929 main_map->l_searchlist.r_list[--i]->l_global = 1;
d66e34cd 1930
f9496a7b 1931 /* Remove _dl_rtld_map from the chain. */
d6b5d570 1932 GL(dl_rtld_map).l_prev->l_next = GL(dl_rtld_map).l_next;
20fe49b9 1933 if (GL(dl_rtld_map).l_next != NULL)
d6b5d570 1934 GL(dl_rtld_map).l_next->l_prev = GL(dl_rtld_map).l_prev;
f9496a7b 1935
20fe49b9
UD
1936 for (i = 1; i < main_map->l_searchlist.r_nlist; ++i)
1937 if (main_map->l_searchlist.r_list[i] == &GL(dl_rtld_map))
1938 break;
1939
1940 bool rtld_multiple_ref = false;
a1ffb40e 1941 if (__glibc_likely (i < main_map->l_searchlist.r_nlist))
0200214b 1942 {
f9496a7b
RM
1943 /* Some DT_NEEDED entry referred to the interpreter object itself, so
1944 put it back in the list of visible objects. We insert it into the
1945 chain in symbol search order because gdb uses the chain's order as
1946 its symbol search order. */
20fe49b9
UD
1947 rtld_multiple_ref = true;
1948
c0f62c56 1949 GL(dl_rtld_map).l_prev = main_map->l_searchlist.r_list[i - 1];
2bf9e641 1950 if (__glibc_likely (state.mode == rtld_mode_normal))
3b3ddb4f 1951 {
c0f62c56
UD
1952 GL(dl_rtld_map).l_next = (i + 1 < main_map->l_searchlist.r_nlist
1953 ? main_map->l_searchlist.r_list[i + 1]
3b3ddb4f 1954 : NULL);
7775448e 1955#ifdef NEED_DL_SYSINFO_DSO
ab1d521d
RM
1956 if (GLRO(dl_sysinfo_map) != NULL
1957 && GL(dl_rtld_map).l_prev->l_next == GLRO(dl_sysinfo_map)
1958 && GL(dl_rtld_map).l_next != GLRO(dl_sysinfo_map))
1959 GL(dl_rtld_map).l_prev = GLRO(dl_sysinfo_map);
3b3ddb4f
UD
1960#endif
1961 }
b2bcd61a
UD
1962 else
1963 /* In trace mode there might be an invisible object (which we
1964 could not find) after the previous one in the search list.
1965 In this case it doesn't matter much where we put the
1966 interpreter object, so we just initialize the list pointer so
1967 that the assertion below holds. */
d6b5d570 1968 GL(dl_rtld_map).l_next = GL(dl_rtld_map).l_prev->l_next;
b2bcd61a 1969
d6b5d570
UD
1970 assert (GL(dl_rtld_map).l_prev->l_next == GL(dl_rtld_map).l_next);
1971 GL(dl_rtld_map).l_prev->l_next = &GL(dl_rtld_map);
3fb55878 1972 if (GL(dl_rtld_map).l_next != NULL)
f9496a7b 1973 {
d6b5d570
UD
1974 assert (GL(dl_rtld_map).l_next->l_prev == GL(dl_rtld_map).l_prev);
1975 GL(dl_rtld_map).l_next->l_prev = &GL(dl_rtld_map);
f9496a7b 1976 }
0200214b 1977 }
d66e34cd 1978
c84142e8
UD
1979 /* Now let us see whether all libraries are available in the
1980 versions we need. */
1981 {
993b3242 1982 struct version_check_args args;
2bf9e641
FW
1983 args.doexit = state.mode == rtld_mode_normal;
1984 args.dotrace = state.mode == rtld_mode_trace;
993b3242 1985 _dl_receive_error (print_missing_version, version_check_doit, &args);
c84142e8
UD
1986 }
1987
2d148689
RM
1988 /* We do not initialize any of the TLS functionality unless any of the
1989 initial modules uses TLS. This makes dynamic loading of modules with
1990 TLS impossible, but to support it requires either eagerly doing setup
1991 now or lazily doing it later. Doing it now makes us incompatible with
1992 an old kernel that can't perform TLS_INIT_TP, even if no TLS is ever
1993 used. Trying to do it lazily is too hairy to try when there could be
1994 multiple threads (from a non-TLS-using libpthread). */
9dcafc55 1995 bool was_tls_init_tp_called = tls_init_tp_called;
35f1e827 1996 if (tcbp == NULL)
17796419 1997 tcbp = init_tls (0);
0ecb606c 1998
81b82fb9 1999 if (__glibc_likely (need_security_init))
4c48ef06
UD
2000 /* Initialize security features. But only if we have not done it
2001 earlier. */
2002 security_init ();
827b7087 2003
2bf9e641 2004 if (__glibc_unlikely (state.mode != rtld_mode_normal))
0200214b
RM
2005 {
2006 /* We were run just to list the shared libraries. It is
2007 important that we do this before real relocation, because the
2008 functions we call below for output may no longer work properly
2009 after relocation. */
81f3ac4c
UD
2010 struct link_map *l;
2011
afdca0f2 2012 if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
ceb2d9aa 2013 {
c0f62c56 2014 struct r_scope_elem *scope = &main_map->l_searchlist;
ceb2d9aa 2015
81f3ac4c 2016 for (i = 0; i < scope->r_nlist; i++)
32e6df36 2017 {
81f3ac4c
UD
2018 l = scope->r_list [i];
2019 if (l->l_faked)
32e6df36 2020 {
81f3ac4c
UD
2021 _dl_printf ("\t%s => not found\n", l->l_libname->name);
2022 continue;
2023 }
afdca0f2
UD
2024 if (_dl_name_match_p (GLRO(dl_trace_prelink), l))
2025 GLRO(dl_trace_prelink_map) = l;
81f3ac4c 2026 _dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)",
b9375348
SP
2027 DSO_FILENAME (l->l_libname->name),
2028 DSO_FILENAME (l->l_name),
d347a4ab
UD
2029 (int) sizeof l->l_map_start * 2,
2030 (size_t) l->l_map_start,
2031 (int) sizeof l->l_addr * 2,
2032 (size_t) l->l_addr);
11bf311e 2033
81f3ac4c
UD
2034 if (l->l_tls_modid)
2035 _dl_printf (" TLS(0x%Zx, 0x%0*Zx)\n", l->l_tls_modid,
2036 (int) sizeof l->l_tls_offset * 2,
d347a4ab 2037 (size_t) l->l_tls_offset);
81f3ac4c 2038 else
81f3ac4c 2039 _dl_printf ("\n");
32e6df36 2040 }
ceb2d9aa 2041 }
7a11603d
UD
2042 else if (GLRO(dl_debug_mask) & DL_DEBUG_UNUSED)
2043 {
2044 /* Look through the dependencies of the main executable
2045 and determine which of them is not actually
2046 required. */
c0f62c56 2047 struct link_map *l = main_map;
7a11603d
UD
2048
2049 /* Relocate the main executable. */
2ca285b0 2050 struct relocate_args args = { .l = l,
3a62d00d
AS
2051 .reloc_mode = ((GLRO(dl_lazy)
2052 ? RTLD_LAZY : 0)
2053 | __RTLD_NOIFUNC) };
7a11603d
UD
2054 _dl_receive_error (print_unresolved, relocate_doit, &args);
2055
2056 /* This loop depends on the dependencies of the executable to
2057 correspond in number and order to the DT_NEEDED entries. */
c0f62c56 2058 ElfW(Dyn) *dyn = main_map->l_ld;
7a11603d
UD
2059 bool first = true;
2060 while (dyn->d_tag != DT_NULL)
2061 {
2062 if (dyn->d_tag == DT_NEEDED)
2063 {
2064 l = l->l_next;
7775448e 2065#ifdef NEED_DL_SYSINFO_DSO
ff9f1c5f
DM
2066 /* Skip the VDSO since it's not part of the list
2067 of objects we brought in via DT_NEEDED entries. */
2068 if (l == GLRO(dl_sysinfo_map))
2069 l = l->l_next;
2070#endif
7a11603d
UD
2071 if (!l->l_used)
2072 {
2073 if (first)
2074 {
2075 _dl_printf ("Unused direct dependencies:\n");
2076 first = false;
2077 }
2078
2079 _dl_printf ("\t%s\n", l->l_name);
2080 }
2081 }
2082
2083 ++dyn;
2084 }
2085
2086 _exit (first != true);
2087 }
c0f62c56 2088 else if (! main_map->l_info[DT_NEEDED])
81f3ac4c
UD
2089 _dl_printf ("\tstatically linked\n");
2090 else
2091 {
c0f62c56 2092 for (l = main_map->l_next; l; l = l->l_next)
81f3ac4c
UD
2093 if (l->l_faked)
2094 /* The library was not found. */
2095 _dl_printf ("\t%s => not found\n", l->l_libname->name);
75489693 2096 else if (strcmp (l->l_libname->name, l->l_name) == 0)
7a11603d
UD
2097 _dl_printf ("\t%s (0x%0*Zx)\n", l->l_libname->name,
2098 (int) sizeof l->l_map_start * 2,
2099 (size_t) l->l_map_start);
81f3ac4c
UD
2100 else
2101 _dl_printf ("\t%s => %s (0x%0*Zx)\n", l->l_libname->name,
2102 l->l_name, (int) sizeof l->l_map_start * 2,
d347a4ab 2103 (size_t) l->l_map_start);
81f3ac4c 2104 }
1a3a58fd 2105
2bf9e641 2106 if (__glibc_unlikely (state.mode != rtld_mode_trace))
5a47e7f2 2107 for (i = 1; i < (unsigned int) _dl_argc; ++i)
cddcfecf
RM
2108 {
2109 const ElfW(Sym) *ref = NULL;
c0282c06
UD
2110 ElfW(Addr) loadbase;
2111 lookup_t result;
c0282c06 2112
4243cbea 2113 result = _dl_lookup_symbol_x (_dl_argv[i], main_map,
11bf311e
UD
2114 &ref, main_map->l_scope,
2115 NULL, ELF_RTYPE_CLASS_PLT,
021723ab 2116 DL_LOOKUP_ADD_DEPENDENCY, NULL);
c0282c06 2117
10a446dd 2118 loadbase = LOOKUP_VALUE_ADDRESS (result, false);
c0282c06 2119
35fc382a 2120 _dl_printf ("%s found at 0x%0*Zd in object at 0x%0*Zd\n",
4243cbea 2121 _dl_argv[i],
d347a4ab
UD
2122 (int) sizeof ref->st_value * 2,
2123 (size_t) ref->st_value,
2124 (int) sizeof loadbase * 2, (size_t) loadbase);
cddcfecf 2125 }
ce37fa88 2126 else
fd26970f 2127 {
20fe49b9 2128 /* If LD_WARN is set, warn about undefined symbols. */
afdca0f2 2129 if (GLRO(dl_lazy) >= 0 && GLRO(dl_verbose))
ce37fa88
UD
2130 {
2131 /* We have to do symbol dependency testing. */
2132 struct relocate_args args;
48b67d71 2133 unsigned int i;
993b3242 2134
3a62d00d
AS
2135 args.reloc_mode = ((GLRO(dl_lazy) ? RTLD_LAZY : 0)
2136 | __RTLD_NOIFUNC);
fd26970f 2137
48b67d71
AS
2138 i = main_map->l_searchlist.r_nlist;
2139 while (i-- > 0)
ce37fa88 2140 {
48b67d71 2141 struct link_map *l = main_map->l_initfini[i];
d6b5d570 2142 if (l != &GL(dl_rtld_map) && ! l->l_faked)
ce37fa88
UD
2143 {
2144 args.l = l;
2145 _dl_receive_error (print_unresolved, relocate_doit,
2146 &args);
ce37fa88 2147 }
20fe49b9 2148 }
32e6df36 2149
afdca0f2 2150 if ((GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
20fe49b9 2151 && rtld_multiple_ref)
e38c954b
UD
2152 {
2153 /* Mark the link map as not yet relocated again. */
2154 GL(dl_rtld_map).l_relocated = 0;
11bf311e 2155 _dl_relocate_object (&GL(dl_rtld_map),
3a62d00d 2156 main_map->l_scope, __RTLD_NOIFUNC, 0);
e38c954b 2157 }
3a56ea26 2158 }
b0982c4a 2159#define VERNEEDTAG (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED))
2bf9e641 2160 if (state.version_info)
fd26970f 2161 {
ce37fa88
UD
2162 /* Print more information. This means here, print information
2163 about the versions needed. */
2164 int first = 1;
c0f62c56 2165 struct link_map *map;
ce37fa88 2166
c0f62c56 2167 for (map = main_map; map != NULL; map = map->l_next)
fd26970f 2168 {
f41c8091 2169 const char *strtab;
ce37fa88 2170 ElfW(Dyn) *dyn = map->l_info[VERNEEDTAG];
f41c8091
UD
2171 ElfW(Verneed) *ent;
2172
2173 if (dyn == NULL)
2174 continue;
2175
a42195db 2176 strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
f41c8091 2177 ent = (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
ce37fa88 2178
f41c8091 2179 if (first)
ce37fa88 2180 {
35fc382a 2181 _dl_printf ("\n\tVersion information:\n");
f41c8091
UD
2182 first = 0;
2183 }
ce37fa88 2184
b9375348 2185 _dl_printf ("\t%s:\n", DSO_FILENAME (map->l_name));
f41c8091
UD
2186
2187 while (1)
2188 {
2189 ElfW(Vernaux) *aux;
2190 struct link_map *needed;
ce37fa88 2191
f41c8091
UD
2192 needed = find_needed (strtab + ent->vn_file);
2193 aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
ce37fa88
UD
2194
2195 while (1)
2196 {
f41c8091
UD
2197 const char *fname = NULL;
2198
f41c8091 2199 if (needed != NULL
ba9fcb3f
UD
2200 && match_version (strtab + aux->vna_name,
2201 needed))
f41c8091
UD
2202 fname = needed->l_name;
2203
35fc382a
UD
2204 _dl_printf ("\t\t%s (%s) %s=> %s\n",
2205 strtab + ent->vn_file,
2206 strtab + aux->vna_name,
2207 aux->vna_flags & VER_FLG_WEAK
2208 ? "[WEAK] " : "",
2209 fname ?: "not found");
ce37fa88 2210
f41c8091
UD
2211 if (aux->vna_next == 0)
2212 /* No more symbols. */
ce37fa88
UD
2213 break;
2214
f41c8091
UD
2215 /* Next symbol. */
2216 aux = (ElfW(Vernaux) *) ((char *) aux
2217 + aux->vna_next);
ce37fa88 2218 }
f41c8091
UD
2219
2220 if (ent->vn_next == 0)
2221 /* No more dependencies. */
2222 break;
2223
2224 /* Next dependency. */
2225 ent = (ElfW(Verneed) *) ((char *) ent + ent->vn_next);
ce37fa88 2226 }
fd26970f 2227 }
ce37fa88 2228 }
fd26970f 2229 }
d66e34cd 2230
0200214b
RM
2231 _exit (0);
2232 }
86d2c878 2233
c0f62c56 2234 if (main_map->l_info[ADDRIDX (DT_GNU_LIBLIST)]
768027a4
UD
2235 && ! __builtin_expect (GLRO(dl_profile) != NULL, 0)
2236 && ! __builtin_expect (GLRO(dl_dynamic_weak), 0))
32e6df36
UD
2237 {
2238 ElfW(Lib) *liblist, *liblistend;
2239 struct link_map **r_list, **r_listend, *l;
c0f62c56 2240 const char *strtab = (const void *) D_PTR (main_map, l_info[DT_STRTAB]);
32e6df36 2241
c0f62c56 2242 assert (main_map->l_info[VALIDX (DT_GNU_LIBLISTSZ)] != NULL);
32e6df36 2243 liblist = (ElfW(Lib) *)
c0f62c56 2244 main_map->l_info[ADDRIDX (DT_GNU_LIBLIST)]->d_un.d_ptr;
32e6df36 2245 liblistend = (ElfW(Lib) *)
34a5a146
JM
2246 ((char *) liblist
2247 + main_map->l_info[VALIDX (DT_GNU_LIBLISTSZ)]->d_un.d_val);
c0f62c56
UD
2248 r_list = main_map->l_searchlist.r_list;
2249 r_listend = r_list + main_map->l_searchlist.r_nlist;
32e6df36
UD
2250
2251 for (; r_list < r_listend && liblist < liblistend; r_list++)
2252 {
2253 l = *r_list;
2254
c0f62c56 2255 if (l == main_map)
32e6df36
UD
2256 continue;
2257
2258 /* If the library is not mapped where it should, fail. */
2259 if (l->l_addr)
2260 break;
2261
2262 /* Next, check if checksum matches. */
2263 if (l->l_info [VALIDX(DT_CHECKSUM)] == NULL
2264 || l->l_info [VALIDX(DT_CHECKSUM)]->d_un.d_val
2265 != liblist->l_checksum)
2266 break;
2267
2268 if (l->l_info [VALIDX(DT_GNU_PRELINKED)] == NULL
2269 || l->l_info [VALIDX(DT_GNU_PRELINKED)]->d_un.d_val
2270 != liblist->l_time_stamp)
2271 break;
2272
2273 if (! _dl_name_match_p (strtab + liblist->l_name, l))
2274 break;
2275
2276 ++liblist;
2277 }
2278
2279
2280 if (r_list == r_listend && liblist == liblistend)
164a7164 2281 prelinked = true;
32e6df36 2282
a1ffb40e 2283 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
b85a0f39
UD
2284 _dl_debug_printf ("\nprelink checking: %s\n",
2285 prelinked ? "ok" : "failed");
32e6df36
UD
2286 }
2287
ed20b3d9 2288
c31e278f 2289 /* Now set up the variable which helps the assembler startup code. */
c0f62c56 2290 GL(dl_ns)[LM_ID_BASE]._ns_main_searchlist = &main_map->l_searchlist;
c31e278f
UD
2291
2292 /* Save the information about the original global scope list since
2293 we need it in the memory handling later. */
c0f62c56 2294 GLRO(dl_initial_searchlist) = *GL(dl_ns)[LM_ID_BASE]._ns_main_searchlist;
c31e278f 2295
e23fe25b 2296 /* Remember the last search directory added at startup, now that
8e1472d2
FW
2297 malloc will no longer be the one from dl-minimal.c. As a side
2298 effect, this marks ld.so as initialized, so that the rtld_active
2299 function returns true from now on. */
e23fe25b
AS
2300 GLRO(dl_init_all_dirs) = GL(dl_all_dirs);
2301
73d7af4f 2302 /* Print scope information. */
a1ffb40e 2303 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
73d7af4f
UD
2304 {
2305 _dl_debug_printf ("\nInitial object scopes\n");
2306
2307 for (struct link_map *l = main_map; l != NULL; l = l->l_next)
174baab3 2308 _dl_show_scope (l, 0);
73d7af4f
UD
2309 }
2310
f753fa7d
L
2311 _rtld_main_check (main_map, _dl_argv[0]);
2312
32e6df36
UD
2313 if (prelinked)
2314 {
c0f62c56 2315 if (main_map->l_info [ADDRIDX (DT_GNU_CONFLICT)] != NULL)
32e6df36
UD
2316 {
2317 ElfW(Rela) *conflict, *conflictend;
32e6df36 2318
1e372ded
AZ
2319 RTLD_TIMING_VAR (start);
2320 rtld_timer_start (&start);
2321
c0f62c56 2322 assert (main_map->l_info [VALIDX (DT_GNU_CONFLICTSZ)] != NULL);
32e6df36 2323 conflict = (ElfW(Rela) *)
c0f62c56 2324 main_map->l_info [ADDRIDX (DT_GNU_CONFLICT)]->d_un.d_ptr;
32e6df36 2325 conflictend = (ElfW(Rela) *)
d89ae1d5 2326 ((char *) conflict
c0f62c56
UD
2327 + main_map->l_info [VALIDX (DT_GNU_CONFLICTSZ)]->d_un.d_val);
2328 _dl_resolve_conflicts (main_map, conflict, conflictend);
1e372ded
AZ
2329
2330 rtld_timer_stop (&relocate_time, start);
32e6df36
UD
2331 }
2332
3a0ecccb
FW
2333 /* The library defining malloc has already been relocated due to
2334 prelinking. Resolve the malloc symbols for the dynamic
2335 loader. */
2336 __rtld_malloc_init_real (main_map);
d89ae1d5 2337
d6163dfd
FW
2338 /* Likewise for the locking implementation. */
2339 __rtld_mutex_init ();
2340
d89ae1d5 2341 /* Mark all the objects so we know they have been already relocated. */
9dcafc55 2342 for (struct link_map *l = main_map; l != NULL; l = l->l_next)
e8648a5a
UD
2343 {
2344 l->l_relocated = 1;
2345 if (l->l_relro_size)
2346 _dl_protect_relro (l);
9dcafc55
UD
2347
2348 /* Add object to slot information data if necessasy. */
2349 if (l->l_tls_blocksize != 0 && tls_init_tp_called)
a509eb11 2350 _dl_add_to_slotinfo (l, true);
e8648a5a 2351 }
32e6df36
UD
2352 }
2353 else
164a7164
UD
2354 {
2355 /* Now we have all the objects loaded. Relocate them all except for
2356 the dynamic linker itself. We do this in reverse order so that copy
2357 relocs of earlier objects overwrite the data written by later
2358 objects. We do not re-relocate the dynamic linker itself in this
2359 loop because that could result in the GOT entries for functions we
2360 call being changed, and that would break us. It is safe to relocate
2361 the dynamic linker out of order because it has no copy relocs (we
2362 know that because it is self-contained). */
2363
afdca0f2 2364 int consider_profiling = GLRO(dl_profile) != NULL;
c0fb8a56 2365
164a7164 2366 /* If we are profiling we also must do lazy reloaction. */
afdca0f2 2367 GLRO(dl_lazy) |= consider_profiling;
c0fb8a56 2368
1e372ded
AZ
2369 RTLD_TIMING_VAR (start);
2370 rtld_timer_start (&start);
2bc17433
AS
2371 unsigned i = main_map->l_searchlist.r_nlist;
2372 while (i-- > 0)
164a7164 2373 {
2bc17433
AS
2374 struct link_map *l = main_map->l_initfini[i];
2375
164a7164
UD
2376 /* While we are at it, help the memory handling a bit. We have to
2377 mark some data structures as allocated with the fake malloc()
2378 implementation in ld.so. */
2379 struct libname_list *lnp = l->l_libname->next;
752a2a50 2380
164a7164
UD
2381 while (__builtin_expect (lnp != NULL, 0))
2382 {
2383 lnp->dont_free = 1;
2384 lnp = lnp->next;
2385 }
0479b305
AS
2386 /* Also allocated with the fake malloc(). */
2387 l->l_free_initfini = 0;
752a2a50 2388
164a7164 2389 if (l != &GL(dl_rtld_map))
2ca285b0 2390 _dl_relocate_object (l, l->l_scope, GLRO(dl_lazy) ? RTLD_LAZY : 0,
154d10bd 2391 consider_profiling);
be935610 2392
9dcafc55
UD
2393 /* Add object to slot information data if necessasy. */
2394 if (l->l_tls_blocksize != 0 && tls_init_tp_called)
a509eb11 2395 _dl_add_to_slotinfo (l, true);
164a7164 2396 }
1e372ded 2397 rtld_timer_stop (&relocate_time, start);
164a7164 2398
164a7164
UD
2399 /* Now enable profiling if needed. Like the previous call,
2400 this has to go here because the calls it makes should use the
2401 rtld versions of the functions (particularly calloc()), but it
2402 needs to have _dl_profile_map set up by the relocator. */
a1ffb40e 2403 if (__glibc_unlikely (GL(dl_profile_map) != NULL))
164a7164 2404 /* We must prepare the profiling. */
53bfdc1c 2405 _dl_start_profile ();
164a7164 2406 }
ac16e905 2407
d0503676
CD
2408 if ((!was_tls_init_tp_called && GL(dl_tls_max_dtv_idx) > 0)
2409 || count_modids != _dl_count_modids ())
35f1e827 2410 ++GL(dl_tls_generation);
9dcafc55 2411
35f1e827
UD
2412 /* Now that we have completed relocation, the initializer data
2413 for the TLS blocks has its final values and we can copy them
91ac3a7d
TMQMF
2414 into the main thread's TLS area, which we allocated above.
2415 Note: thread-local variables must only be accessed after completing
2416 the next step. */
35f1e827 2417 _dl_allocate_tls_init (tcbp);
a334319f 2418
3d8c8bff 2419 /* And finally install it for the main thread. */
35f1e827
UD
2420 if (! tls_init_tp_called)
2421 {
774f9285 2422 const char *lossage = TLS_INIT_TP (tcbp);
a1ffb40e 2423 if (__glibc_unlikely (lossage != NULL))
35f1e827
UD
2424 _dl_fatal_printf ("cannot set up thread-local storage: %s\n",
2425 lossage);
90d7e7e5 2426 __tls_init_tp ();
0ecb606c 2427 }
0ecb606c 2428
e23fe25b
AS
2429 /* Make sure no new search directories have been added. */
2430 assert (GLRO(dl_init_all_dirs) == GL(dl_all_dirs));
bc5fb037 2431
cafdfdb6
RM
2432 if (! prelinked && rtld_multiple_ref)
2433 {
2434 /* There was an explicit ref to the dynamic linker as a shared lib.
2435 Re-relocate ourselves with user-controlled symbol definitions.
2436
2437 We must do this after TLS initialization in case after this
2438 re-relocation, we might call a user-supplied function
2439 (e.g. calloc from _dl_relocate_object) that uses TLS data. */
2440
3a0ecccb
FW
2441 /* The malloc implementation has been relocated, so resolving
2442 its symbols (and potentially calling IFUNC resolvers) is safe
2443 at this point. */
2444 __rtld_malloc_init_real (main_map);
2445
d6163dfd
FW
2446 /* Likewise for the locking implementation. */
2447 __rtld_mutex_init ();
2448
1e372ded
AZ
2449 RTLD_TIMING_VAR (start);
2450 rtld_timer_start (&start);
cafdfdb6 2451
cafdfdb6
RM
2452 /* Mark the link map as not yet relocated again. */
2453 GL(dl_rtld_map).l_relocated = 0;
c0a777e8 2454 _dl_relocate_object (&GL(dl_rtld_map), main_map->l_scope, 0, 0);
1e372ded
AZ
2455
2456 rtld_timer_accum (&relocate_time, start);
cafdfdb6
RM
2457 }
2458
03e187a4
FW
2459 /* Relocation is complete. Perform early libc initialization. This
2460 is the initial libc, even if audit modules have been loaded with
2461 other libcs. */
2462 _dl_call_libc_early_init (GL(dl_ns)[LM_ID_BASE].libc_map, true);
ec935dea 2463
bf8523c8
RM
2464 /* Do any necessary cleanups for the startup OS interface code.
2465 We do these now so that no calls are made after rtld re-relocation
2466 which might be resolved to different functions than we expect.
2467 We cannot do this before relocating the other objects because
2468 _dl_relocate_object might need to call `mprotect' for DT_TEXTREL. */
2469 _dl_sysdep_start_cleanup ();
2470
9dcafc55
UD
2471#ifdef SHARED
2472 /* Auditing checkpoint: we have added all objects. */
a1ffb40e 2473 if (__glibc_unlikely (GLRO(dl_naudit) > 0))
9dcafc55
UD
2474 {
2475 struct link_map *head = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
2476 /* Do not call the functions for any auditing object. */
2477 if (head->l_auditing == 0)
2478 {
2479 struct audit_ifaces *afct = GLRO(dl_audit);
2480 for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
2481 {
2482 if (afct->activity != NULL)
e1d559f3
FW
2483 afct->activity (&link_map_audit_state (head, cnt)->cookie,
2484 LA_ACT_CONSISTENT);
9dcafc55
UD
2485
2486 afct = afct->next;
2487 }
2488 }
2489 }
2490#endif
2491
2492 /* Notify the debugger all new objects are now ready to go. We must re-get
2493 the address since by now the variable might be in another object. */
a93d9e03 2494 r = _dl_debug_update (LM_ID_BASE);
9dcafc55 2495 r->r_state = RT_CONSISTENT;
154d10bd 2496 _dl_debug_state ();
815e6fa3 2497 LIBC_PROBE (init_complete, 2, LM_ID_BASE, r);
0200214b 2498
f57f8055 2499#if defined USE_LDCONFIG && !defined MAP_COPY
08cac4ac 2500 /* We must munmap() the cache file. */
154d10bd 2501 _dl_unload_cache ();
08cac4ac
UD
2502#endif
2503
d66e34cd
RM
2504 /* Once we return, _dl_sysdep_start will invoke
2505 the DT_INIT functions and then *USER_ENTRY. */
2506}
fd26970f
UD
2507\f
2508/* This is a little helper function for resolving symbols while
2509 tracing the binary. */
2510static void
c84142e8
UD
2511print_unresolved (int errcode __attribute__ ((unused)), const char *objname,
2512 const char *errstring)
fd26970f 2513{
3996f34b 2514 if (objname[0] == '\0')
b9375348 2515 objname = RTLD_PROGNAME;
35fc382a 2516 _dl_error_printf ("%s (%s)\n", errstring, objname);
fd26970f 2517}
c84142e8
UD
2518\f
2519/* This is a little helper function for resolving symbols while
2520 tracing the binary. */
2521static void
2522print_missing_version (int errcode __attribute__ ((unused)),
2523 const char *objname, const char *errstring)
2524{
b9375348 2525 _dl_error_printf ("%s: %s: %s\n", RTLD_PROGNAME,
35fc382a 2526 objname, errstring);
c84142e8 2527}
ea278354 2528\f
b5efde2f
UD
2529/* Process the string given as the parameter which explains which debugging
2530 options are enabled. */
2531static void
2bf9e641 2532process_dl_debug (struct dl_main_state *state, const char *dl_debug)
b5efde2f 2533{
3e2040c8
UD
2534 /* When adding new entries make sure that the maximal length of a name
2535 is correctly handled in the LD_DEBUG_HELP code below. */
2536 static const struct
2537 {
379d4ec4
UD
2538 unsigned char len;
2539 const char name[10];
3e2040c8
UD
2540 const char helptext[41];
2541 unsigned short int mask;
2542 } debopts[] =
2543 {
379d4ec4
UD
2544#define LEN_AND_STR(str) sizeof (str) - 1, str
2545 { LEN_AND_STR ("libs"), "display library search paths",
3e2040c8 2546 DL_DEBUG_LIBS | DL_DEBUG_IMPCALLS },
379d4ec4 2547 { LEN_AND_STR ("reloc"), "display relocation processing",
3e2040c8 2548 DL_DEBUG_RELOC | DL_DEBUG_IMPCALLS },
379d4ec4 2549 { LEN_AND_STR ("files"), "display progress for input file",
3e2040c8 2550 DL_DEBUG_FILES | DL_DEBUG_IMPCALLS },
379d4ec4 2551 { LEN_AND_STR ("symbols"), "display symbol table processing",
3e2040c8 2552 DL_DEBUG_SYMBOLS | DL_DEBUG_IMPCALLS },
379d4ec4 2553 { LEN_AND_STR ("bindings"), "display information about symbol binding",
3e2040c8 2554 DL_DEBUG_BINDINGS | DL_DEBUG_IMPCALLS },
379d4ec4 2555 { LEN_AND_STR ("versions"), "display version dependencies",
3e2040c8 2556 DL_DEBUG_VERSIONS | DL_DEBUG_IMPCALLS },
73d7af4f
UD
2557 { LEN_AND_STR ("scopes"), "display scope information",
2558 DL_DEBUG_SCOPES },
379d4ec4 2559 { LEN_AND_STR ("all"), "all previous options combined",
3e2040c8 2560 DL_DEBUG_LIBS | DL_DEBUG_RELOC | DL_DEBUG_FILES | DL_DEBUG_SYMBOLS
73d7af4f
UD
2561 | DL_DEBUG_BINDINGS | DL_DEBUG_VERSIONS | DL_DEBUG_IMPCALLS
2562 | DL_DEBUG_SCOPES },
379d4ec4 2563 { LEN_AND_STR ("statistics"), "display relocation statistics",
3e2040c8 2564 DL_DEBUG_STATISTICS },
7a11603d
UD
2565 { LEN_AND_STR ("unused"), "determined unused DSOs",
2566 DL_DEBUG_UNUSED },
379d4ec4 2567 { LEN_AND_STR ("help"), "display this help message and exit",
3e2040c8
UD
2568 DL_DEBUG_HELP },
2569 };
2570#define ndebopts (sizeof (debopts) / sizeof (debopts[0]))
3e2040c8 2571
379d4ec4
UD
2572 /* Skip separating white spaces and commas. */
2573 while (*dl_debug != '\0')
b5efde2f 2574 {
379d4ec4 2575 if (*dl_debug != ' ' && *dl_debug != ',' && *dl_debug != ':')
b5efde2f 2576 {
3e2040c8 2577 size_t cnt;
379d4ec4 2578 size_t len = 1;
77aba05b 2579
379d4ec4
UD
2580 while (dl_debug[len] != '\0' && dl_debug[len] != ' '
2581 && dl_debug[len] != ',' && dl_debug[len] != ':')
2582 ++len;
14c44e2e 2583
3e2040c8 2584 for (cnt = 0; cnt < ndebopts; ++cnt)
379d4ec4
UD
2585 if (debopts[cnt].len == len
2586 && memcmp (dl_debug, debopts[cnt].name, len) == 0)
3e2040c8 2587 {
afdca0f2 2588 GLRO(dl_debug_mask) |= debopts[cnt].mask;
2bf9e641 2589 state->any_debug = true;
3e2040c8
UD
2590 break;
2591 }
77aba05b 2592
3e2040c8
UD
2593 if (cnt == ndebopts)
2594 {
2595 /* Display a warning and skip everything until next
2596 separator. */
2597 char *copy = strndupa (dl_debug, len);
2598 _dl_error_printf ("\
2599warning: debug option `%s' unknown; try LD_DEBUG=help\n", copy);
379d4ec4
UD
2600 }
2601
2602 dl_debug += len;
2603 continue;
3e2040c8 2604 }
379d4ec4
UD
2605
2606 ++dl_debug;
3e2040c8 2607 }
77aba05b 2608
ff9f1c5f
DM
2609 if (GLRO(dl_debug_mask) & DL_DEBUG_UNUSED)
2610 {
2611 /* In order to get an accurate picture of whether a particular
2612 DT_NEEDED entry is actually used we have to process both
2613 the PLT and non-PLT relocation entries. */
2614 GLRO(dl_lazy) = 0;
2615 }
2616
afdca0f2 2617 if (GLRO(dl_debug_mask) & DL_DEBUG_HELP)
3e2040c8
UD
2618 {
2619 size_t cnt;
14c44e2e 2620
3e2040c8
UD
2621 _dl_printf ("\
2622Valid options for the LD_DEBUG environment variable are:\n\n");
db276fa1 2623
3e2040c8 2624 for (cnt = 0; cnt < ndebopts; ++cnt)
37d8b778
UD
2625 _dl_printf (" %.*s%s%s\n", debopts[cnt].len, debopts[cnt].name,
2626 " " + debopts[cnt].len - 3,
3e2040c8 2627 debopts[cnt].helptext);
14c44e2e 2628
3e2040c8
UD
2629 _dl_printf ("\n\
2630To direct the debugging output into a file instead of standard output\n\
2631a filename can be specified using the LD_DEBUG_OUTPUT environment variable.\n");
2632 _exit (0);
b5efde2f 2633 }
b5efde2f
UD
2634}
2635\f
ea278354 2636static void
2bf9e641 2637process_envvars (struct dl_main_state *state)
ea278354 2638{
67c94753 2639 char **runp = _environ;
ea278354 2640 char *envline;
7dea968e 2641 char *debug_output = NULL;
ea278354
UD
2642
2643 /* This is the default place for profiling data file. */
afdca0f2 2644 GLRO(dl_profile_output)
6bc6bd3b 2645 = &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0];
ea278354
UD
2646
2647 while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
2648 {
379d4ec4
UD
2649 size_t len = 0;
2650
2651 while (envline[len] != '\0' && envline[len] != '=')
2652 ++len;
ea278354 2653
75e8d1f5
UD
2654 if (envline[len] != '=')
2655 /* This is a "LD_" variable at the end of the string without
2656 a '=' character. Ignore it since otherwise we will access
2657 invalid memory below. */
67c94753 2658 continue;
75e8d1f5 2659
67c94753 2660 switch (len)
ea278354 2661 {
14c44e2e
UD
2662 case 4:
2663 /* Warning level, verbose or not. */
67c94753 2664 if (memcmp (envline, "WARN", 4) == 0)
afdca0f2 2665 GLRO(dl_verbose) = envline[5] != '\0';
14c44e2e 2666 break;
ea278354 2667
14c44e2e
UD
2668 case 5:
2669 /* Debugging of the dynamic linker? */
67c94753 2670 if (memcmp (envline, "DEBUG", 5) == 0)
9dcafc55 2671 {
2bf9e641 2672 process_dl_debug (state, &envline[6]);
9dcafc55
UD
2673 break;
2674 }
2675 if (memcmp (envline, "AUDIT", 5) == 0)
2bf9e641 2676 audit_list_add_string (&state->audit_list, &envline[6]);
14c44e2e 2677 break;
b5efde2f 2678
14c44e2e
UD
2679 case 7:
2680 /* Print information about versions. */
67c94753 2681 if (memcmp (envline, "VERBOSE", 7) == 0)
14c44e2e 2682 {
2bf9e641 2683 state->version_info = envline[8] != '\0';
14c44e2e
UD
2684 break;
2685 }
7dea968e 2686
14c44e2e 2687 /* List of objects to be preloaded. */
67c94753 2688 if (memcmp (envline, "PRELOAD", 7) == 0)
14c44e2e 2689 {
2bf9e641 2690 state->preloadlist = &envline[8];
14c44e2e
UD
2691 break;
2692 }
120b4c49 2693
14c44e2e 2694 /* Which shared object shall be profiled. */
c95f3fd4 2695 if (memcmp (envline, "PROFILE", 7) == 0 && envline[8] != '\0')
afdca0f2 2696 GLRO(dl_profile) = &envline[8];
14c44e2e 2697 break;
120b4c49 2698
14c44e2e
UD
2699 case 8:
2700 /* Do we bind early? */
67c94753 2701 if (memcmp (envline, "BIND_NOW", 8) == 0)
f53c03c2 2702 {
afdca0f2 2703 GLRO(dl_lazy) = envline[9] == '\0';
f53c03c2
UD
2704 break;
2705 }
67c94753 2706 if (memcmp (envline, "BIND_NOT", 8) == 0)
afdca0f2 2707 GLRO(dl_bind_not) = envline[9] != '\0';
14c44e2e 2708 break;
ea278354 2709
14c44e2e
UD
2710 case 9:
2711 /* Test whether we want to see the content of the auxiliary
2712 array passed up from the kernel. */
6bc6bd3b 2713 if (!__libc_enable_secure
00a12162 2714 && memcmp (envline, "SHOW_AUXV", 9) == 0)
14c44e2e
UD
2715 _dl_show_auxv ();
2716 break;
ea278354 2717
ff08fc59 2718#if !HAVE_TUNABLES
12264bd7 2719 case 10:
3081378b 2720 /* Mask for the important hardware capabilities. */
1c1243b6
SP
2721 if (!__libc_enable_secure
2722 && memcmp (envline, "HWCAP_MASK", 10) == 0)
37b66c0b 2723 GLRO(dl_hwcap_mask) = _dl_strtoul (&envline[11], NULL);
12264bd7 2724 break;
ff08fc59 2725#endif
12264bd7 2726
f787edde
UD
2727 case 11:
2728 /* Path where the binary is found. */
6bc6bd3b 2729 if (!__libc_enable_secure
67c94753 2730 && memcmp (envline, "ORIGIN_PATH", 11) == 0)
afdca0f2 2731 GLRO(dl_origin_path) = &envline[12];
f787edde
UD
2732 break;
2733
14c44e2e 2734 case 12:
dec126b4 2735 /* The library search path. */
f6110a8f
FW
2736 if (!__libc_enable_secure
2737 && memcmp (envline, "LIBRARY_PATH", 12) == 0)
dec126b4 2738 {
2bf9e641 2739 state->library_path = &envline[13];
27316f4a 2740 state->library_path_source = "LD_LIBRARY_PATH";
dec126b4
UD
2741 break;
2742 }
2743
14c44e2e 2744 /* Where to place the profiling data file. */
67c94753 2745 if (memcmp (envline, "DEBUG_OUTPUT", 12) == 0)
14c44e2e 2746 {
67c94753 2747 debug_output = &envline[13];
14c44e2e
UD
2748 break;
2749 }
ea278354 2750
6bc6bd3b 2751 if (!__libc_enable_secure
00a12162 2752 && memcmp (envline, "DYNAMIC_WEAK", 12) == 0)
afdca0f2 2753 GLRO(dl_dynamic_weak) = 1;
14c44e2e 2754 break;
ea278354 2755
97fd3a30
UD
2756 case 13:
2757 /* We might have some extra environment variable with length 13
2758 to handle. */
2759#ifdef EXTRA_LD_ENVVARS_13
2760 EXTRA_LD_ENVVARS_13
2761#endif
6bc6bd3b 2762 if (!__libc_enable_secure
97fd3a30 2763 && memcmp (envline, "USE_LOAD_BIAS", 13) == 0)
827b7087
UD
2764 {
2765 GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0;
2766 break;
2767 }
97fd3a30
UD
2768 break;
2769
14c44e2e
UD
2770 case 14:
2771 /* Where to place the profiling data file. */
6bc6bd3b 2772 if (!__libc_enable_secure
3e2040c8
UD
2773 && memcmp (envline, "PROFILE_OUTPUT", 14) == 0
2774 && envline[15] != '\0')
afdca0f2 2775 GLRO(dl_profile_output) = &envline[15];
14c44e2e 2776 break;
120b4c49 2777
32e6df36
UD
2778 case 16:
2779 /* The mode of the dynamic linker can be set. */
2780 if (memcmp (envline, "TRACE_PRELINKING", 16) == 0)
2781 {
2bf9e641 2782 state->mode = rtld_mode_trace;
afdca0f2
UD
2783 GLRO(dl_verbose) = 1;
2784 GLRO(dl_debug_mask) |= DL_DEBUG_PRELINK;
2785 GLRO(dl_trace_prelink) = &envline[17];
32e6df36
UD
2786 }
2787 break;
2788
14c44e2e
UD
2789 case 20:
2790 /* The mode of the dynamic linker can be set. */
67c94753 2791 if (memcmp (envline, "TRACE_LOADED_OBJECTS", 20) == 0)
2bf9e641 2792 state->mode = rtld_mode_trace;
14c44e2e 2793 break;
e2102c14
UD
2794
2795 /* We might have some extra environment variable to handle. This
2796 is tricky due to the pre-processing of the length of the name
2797 in the switch statement here. The code here assumes that added
2798 environment variables have a different length. */
2799#ifdef EXTRA_LD_ENVVARS
2800 EXTRA_LD_ENVVARS
2801#endif
ea278354
UD
2802 }
2803 }
2804
4bae5567
UD
2805 /* Extra security for SUID binaries. Remove all dangerous environment
2806 variables. */
6bc6bd3b 2807 if (__builtin_expect (__libc_enable_secure, 0))
4bae5567 2808 {
c95f3fd4 2809 static const char unsecure_envvars[] =
4bae5567
UD
2810#ifdef EXTRA_UNSECURE_ENVVARS
2811 EXTRA_UNSECURE_ENVVARS
2812#endif
c95f3fd4
UD
2813 UNSECURE_ENVVARS;
2814 const char *nextp;
2815
2816 nextp = unsecure_envvars;
2817 do
2818 {
2819 unsetenv (nextp);
9710f75d
UD
2820 /* We could use rawmemchr but this need not be fast. */
2821 nextp = (char *) (strchr) (nextp, '\0') + 1;
c95f3fd4
UD
2822 }
2823 while (*nextp != '\0');
74955460
UD
2824
2825 if (__access ("/etc/suid-debug", F_OK) != 0)
3a56ea26 2826 {
67e58f39 2827#if !HAVE_TUNABLES
00a12162 2828 unsetenv ("MALLOC_CHECK_");
67e58f39 2829#endif
f57a3c94 2830 GLRO(dl_debug_mask) = 0;
3a56ea26 2831 }
f57a3c94 2832
2bf9e641 2833 if (state->mode != rtld_mode_normal)
f57a3c94 2834 _exit (5);
4bae5567 2835 }
7dea968e
UD
2836 /* If we have to run the dynamic linker in debugging mode and the
2837 LD_DEBUG_OUTPUT environment variable is given, we write the debug
2838 messages to this file. */
2bf9e641 2839 else if (state->any_debug && debug_output != NULL)
7dea968e 2840 {
5f2de337 2841 const int flags = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW;
7a2fd787
UD
2842 size_t name_len = strlen (debug_output);
2843 char buf[name_len + 12];
2844 char *startp;
2845
2846 buf[name_len + 11] = '\0';
9710f75d 2847 startp = _itoa (__getpid (), &buf[name_len + 11], 10, 0);
7a2fd787
UD
2848 *--startp = '.';
2849 startp = memcpy (startp - name_len, debug_output, name_len);
2850
329ea513 2851 GLRO(dl_debug_fd) = __open64_nocancel (startp, flags, DEFFILEMODE);
dd70526e 2852 if (GLRO(dl_debug_fd) == -1)
7dea968e 2853 /* We use standard output if opening the file failed. */
dd70526e 2854 GLRO(dl_debug_fd) = STDOUT_FILENO;
7dea968e 2855 }
ea278354 2856}
db276fa1 2857
1e372ded
AZ
2858#if HP_TIMING_INLINE
2859static void
2860print_statistics_item (const char *title, hp_timing_t time,
2861 hp_timing_t total)
2862{
2863 char cycles[HP_TIMING_PRINT_SIZE];
2864 HP_TIMING_PRINT (cycles, sizeof (cycles), time);
2865
2866 char relative[3 * sizeof (hp_timing_t) + 2];
2867 char *cp = _itoa ((1000ULL * time) / total, relative + sizeof (relative),
2868 10, 0);
2869 /* Sets the decimal point. */
2870 char *wp = relative;
2871 switch (relative + sizeof (relative) - cp)
2872 {
2873 case 3:
2874 *wp++ = *cp++;
2875 /* Fall through. */
2876 case 2:
2877 *wp++ = *cp++;
2878 /* Fall through. */
2879 case 1:
2880 *wp++ = '.';
2881 *wp++ = *cp++;
2882 }
2883 *wp = '\0';
2884 _dl_debug_printf ("%s: %s cycles (%s%%)\n", title, cycles, relative);
2885}
2886#endif
db276fa1
UD
2887
2888/* Print the various times we collected. */
2889static void
ee600e3f 2890__attribute ((noinline))
1e372ded 2891print_statistics (const hp_timing_t *rtld_total_timep)
db276fa1 2892{
1e372ded
AZ
2893#if HP_TIMING_INLINE
2894 {
2895 char cycles[HP_TIMING_PRINT_SIZE];
2896 HP_TIMING_PRINT (cycles, sizeof (cycles), *rtld_total_timep);
2897 _dl_debug_printf ("\nruntime linker statistics:\n"
2898 " total startup time in dynamic loader: %s cycles\n",
2899 cycles);
2900 print_statistics_item (" time needed for relocation",
2901 relocate_time, *rtld_total_timep);
2902 }
1531e094 2903#endif
a21a20a3
UD
2904
2905 unsigned long int num_relative_relocations = 0;
22c83193 2906 for (Lmid_t ns = 0; ns < GL(dl_nns); ++ns)
a21a20a3 2907 {
c120d94d
UD
2908 if (GL(dl_ns)[ns]._ns_loaded == NULL)
2909 continue;
2910
c0f62c56 2911 struct r_scope_elem *scope = &GL(dl_ns)[ns]._ns_loaded->l_searchlist;
a21a20a3 2912
c0f62c56
UD
2913 for (unsigned int i = 0; i < scope->r_nlist; i++)
2914 {
2915 struct link_map *l = scope->r_list [i];
2916
c120d94d 2917 if (l->l_addr != 0 && l->l_info[VERSYMIDX (DT_RELCOUNT)])
c0f62c56
UD
2918 num_relative_relocations
2919 += l->l_info[VERSYMIDX (DT_RELCOUNT)]->d_un.d_val;
c120d94d
UD
2920#ifndef ELF_MACHINE_REL_RELATIVE
2921 /* Relative relocations are processed on these architectures if
2922 library is loaded to different address than p_vaddr or
2923 if not prelinked. */
2924 if ((l->l_addr != 0 || !l->l_info[VALIDX(DT_GNU_PRELINKED)])
2925 && l->l_info[VERSYMIDX (DT_RELACOUNT)])
2926#else
2927 /* On e.g. IA-64 or Alpha, relative relocations are processed
2928 only if library is loaded to different address than p_vaddr. */
2929 if (l->l_addr != 0 && l->l_info[VERSYMIDX (DT_RELACOUNT)])
2930#endif
c0f62c56
UD
2931 num_relative_relocations
2932 += l->l_info[VERSYMIDX (DT_RELACOUNT)]->d_un.d_val;
2933 }
a21a20a3
UD
2934 }
2935
42af49f8
UD
2936 _dl_debug_printf (" number of relocations: %lu\n"
2937 " number of relocations from cache: %lu\n"
2938 " number of relative relocations: %lu\n",
2939 GL(dl_num_relocations),
2940 GL(dl_num_cache_relocations),
154d10bd 2941 num_relative_relocations);
db276fa1 2942
1e372ded
AZ
2943#if HP_TIMING_INLINE
2944 print_statistics_item (" time needed to load objects",
2945 load_time, *rtld_total_timep);
1531e094 2946#endif
db276fa1 2947}