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