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