]> git.ipfire.org Git - thirdparty/glibc.git/blame - elf/rtld.c
Update.
[thirdparty/glibc.git] / elf / rtld.c
CommitLineData
d66e34cd 1/* Run time dynamic linker.
49891c10 2 Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
afd4eb37 3 This file is part of the GNU C Library.
d66e34cd 4
afd4eb37
UD
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 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
13 Library General Public License for more details.
d66e34cd 14
afd4eb37
UD
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
d66e34cd 19
7dea968e 20#include <fcntl.h>
d66e34cd 21#include <stdlib.h>
f51d1dfd 22#include <string.h>
d66e34cd 23#include <unistd.h>
2064087b 24#include <sys/mman.h> /* Check if MAP_ANON is defined. */
a853022c 25#include <elf/ldsodefs.h>
ce37fa88 26#include <stdio-common/_itoa.h>
f21acc89 27#include <entry.h>
f5348425 28#include "dynamic-link.h"
e2102c14 29#include "dl-librecon.h"
f5348425 30
a853022c 31#include <assert.h>
f5348425 32
d66e34cd
RM
33/* System-specific function to do initial startup for the dynamic linker.
34 After this, file access calls and getenv must work. This is responsible
cddcfecf 35 for setting __libc_enable_secure if we need to be secure (e.g. setuid),
d66e34cd 36 and for setting _dl_argc and _dl_argv, and then calling _dl_main. */
266180eb
RM
37extern ElfW(Addr) _dl_sysdep_start (void **start_argptr,
38 void (*dl_main) (const ElfW(Phdr) *phdr,
39 ElfW(Half) phent,
40 ElfW(Addr) *user_entry));
4cb20290 41extern void _dl_sysdep_start_cleanup (void);
d66e34cd 42
14bab8de
UD
43/* System-dependent function to read a file's whole contents
44 in the most convenient manner available. */
45extern void *_dl_sysdep_read_whole_file (const char *filename,
46 size_t *filesize_ptr,
47 int mmap_prot);
48
fd26970f 49/* Helper function to handle errors while resolving symbols. */
c84142e8
UD
50static void print_unresolved (int errcode, const char *objname,
51 const char *errsting);
52
53/* Helper function to handle errors when a version is missing. */
54static void print_missing_version (int errcode, const char *objname,
55 const char *errsting);
fd26970f 56
ea278354
UD
57
58/* This is a list of all the modes the dynamic loader can be in. */
59enum mode { normal, list, verify, trace };
60
61/* Process all environments variables the dynamic linker must recognize.
62 Since all of them start with `LD_' we are a bit smarter while finding
63 all the entries. */
64static void process_envvars (enum mode *modep, int *lazyp);
65
d66e34cd
RM
66int _dl_argc;
67char **_dl_argv;
4cb20290 68const char *_dl_rpath;
cf29ffbe 69int _dl_verbose;
0a54e401
UD
70const char *_dl_platform;
71size_t _dl_platformlen;
f41c8091 72unsigned long _dl_hwcap;
0a54e401 73struct r_search_path *_dl_search_paths;
3996f34b
UD
74const char *_dl_profile;
75const char *_dl_profile_output;
76struct link_map *_dl_profile_map;
b5efde2f 77int _dl_debug_libs;
7dea968e 78int _dl_debug_impcalls;
0c367d92 79int _dl_debug_bindings;
de100ca7 80int _dl_debug_symbols;
8193034b
UD
81int _dl_debug_versions;
82int _dl_debug_reloc;
83int _dl_debug_files;
d66e34cd 84
39778c6c
UD
85/* Set nonzero during loading and initialization of executable and
86 libraries, cleared before the executable's entry point runs. This
87 must not be initialized to nonzero, because the unused dynamic
88 linker loaded in for libc.so's "ld.so.1" dep will provide the
89 definition seen by libc.so's initializer; that value must be zero,
90 and will be since that dynamic linker's _dl_start and dl_main will
91 never be called. */
92int _dl_starting_up;
93
266180eb
RM
94static void dl_main (const ElfW(Phdr) *phdr,
95 ElfW(Half) phent,
96 ElfW(Addr) *user_entry);
d66e34cd 97
ee188d55 98struct link_map _dl_rtld_map;
c84142e8 99struct libname_list _dl_rtld_libname;
f41c8091 100struct libname_list _dl_rtld_libname2;
86d2c878 101
b1dbbaa4
RM
102#ifdef RTLD_START
103RTLD_START
104#else
105#error "sysdeps/MACHINE/dl-machine.h fails to define RTLD_START"
106#endif
107
ceb2d9aa 108static ElfW(Addr)
d66e34cd
RM
109_dl_start (void *arg)
110{
86d2c878 111 struct link_map bootstrap_map;
d66e34cd 112
b1dbbaa4
RM
113 /* This #define produces dynamic linking inline functions for
114 bootstrap relocation instead of general-purpose relocation. */
115#define RTLD_BOOTSTRAP
c84142e8 116#define RESOLVE(sym, version, flags) bootstrap_map.l_addr
b1dbbaa4
RM
117#include "dynamic-link.h"
118
d66e34cd 119 /* Figure out the run-time load address of the dynamic linker itself. */
86d2c878 120 bootstrap_map.l_addr = elf_machine_load_address ();
d66e34cd 121
47707456
UD
122 /* Read our own dynamic section and fill in the info array. */
123 bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
86d2c878 124 elf_get_dynamic_info (bootstrap_map.l_ld, bootstrap_map.l_info);
d66e34cd
RM
125
126#ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
86d2c878 127 ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info);
d66e34cd
RM
128#endif
129
130 /* Relocate ourselves so we can do normal function calls and
131 data access using the global offset table. */
421f82e5 132
3996f34b 133 ELF_DYNAMIC_RELOCATE (&bootstrap_map, 0, 0);
ea7eb7e3
UD
134 /* Please note that we don't allow profiling of this object and
135 therefore need not test whether we have to allocate the array
136 for the relocation results (as done in dl-reloc.c). */
421f82e5 137
d66e34cd
RM
138 /* Now life is sane; we can call functions and access global data.
139 Set up to use the operating system facilities, and find out from
140 the operating system's program loader where to find the program
141 header table in core. */
142
86d2c878 143 /* Transfer data about ourselves to the permanent link_map structure. */
ee188d55
RM
144 _dl_rtld_map.l_addr = bootstrap_map.l_addr;
145 _dl_rtld_map.l_ld = bootstrap_map.l_ld;
f41c8091 146 _dl_rtld_map.l_opencount = 1;
ee188d55
RM
147 memcpy (_dl_rtld_map.l_info, bootstrap_map.l_info,
148 sizeof _dl_rtld_map.l_info);
149 _dl_setup_hash (&_dl_rtld_map);
86d2c878 150
4cb20290
RM
151 /* Cache the DT_RPATH stored in ld.so itself; this will be
152 the default search path. */
f41c8091
UD
153 if (_dl_rtld_map.l_info[DT_STRTAB] && _dl_rtld_map.l_info[DT_RPATH])
154 {
155 _dl_rpath = (void *) (_dl_rtld_map.l_addr +
156 _dl_rtld_map.l_info[DT_STRTAB]->d_un.d_ptr +
157 _dl_rtld_map.l_info[DT_RPATH]->d_un.d_val);
158 }
d66e34cd
RM
159
160 /* Call the OS-dependent function to set up life so we can do things like
161 file access. It will call `dl_main' (below) to do all the real work
162 of the dynamic linker, and then unwind our frame and run the user
163 entry point on the same stack we entered on. */
8d6468d0 164 return _dl_sysdep_start (arg, &dl_main);
d66e34cd
RM
165}
166
d66e34cd
RM
167/* Now life is peachy; we can do all normal operations.
168 On to the real work. */
169
f21acc89 170void ENTRY_POINT (void);
d66e34cd 171
993b3242
UD
172/* Some helper functions. */
173
174/* Arguments to relocate_doit. */
175struct relocate_args
176{
177 struct link_map *l;
178 int lazy;
179};
180
181struct map_args
182{
183 /* Argument to map_doit. */
184 char *str;
185 /* Return value of map_doit. */
186 struct link_map *main_map;
187};
188
189/* Arguments to version_check_doit. */
190struct version_check_args
191{
192 struct link_map *main_map;
193 int doexit;
194};
195
196static void
197relocate_doit (void *a)
198{
199 struct relocate_args *args = (struct relocate_args *) a;
200
201 _dl_relocate_object (args->l, _dl_object_relocation_scope (args->l),
202 args->lazy);
203}
204
205static void
206map_doit (void *a)
207{
208 struct map_args *args = (struct map_args *)a;
c6222ab9 209 args->main_map = _dl_map_object (NULL, args->str, 0, lt_library, 0);
993b3242
UD
210}
211
212static void
213version_check_doit (void *a)
214{
215 struct version_check_args *args = (struct version_check_args *)a;
216 if (_dl_check_all_versions (args->main_map, 1) && args->doexit)
217 /* We cannot start the application. Abort now. */
218 _exit (1);
219}
220
ce37fa88
UD
221
222static inline struct link_map *
223find_needed (const char *name)
224{
225 unsigned int n;
226
227 for (n = 0; n < _dl_loaded->l_nsearchlist; ++n)
228 if (_dl_name_match_p (name, _dl_loaded->l_searchlist[n]))
229 return _dl_loaded->l_searchlist[n];
230
231 /* Should never happen. */
232 return NULL;
233}
234
235static int
236match_version (const char *string, struct link_map *map)
237{
238 const char *strtab = (const char *) (map->l_addr
239 + map->l_info[DT_STRTAB]->d_un.d_ptr);
240 ElfW(Verdef) *def;
241
242#define VERDEFTAG (DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (DT_VERDEF))
243 if (map->l_info[VERDEFTAG] == NULL)
244 /* The file has no symbol versioning. */
245 return 0;
246
247 def = (ElfW(Verdef) *) ((char *) map->l_addr
248 + map->l_info[VERDEFTAG]->d_un.d_ptr);
249 while (1)
250 {
251 ElfW(Verdaux) *aux = (ElfW(Verdaux) *) ((char *) def + def->vd_aux);
252
253 /* Compare the version strings. */
254 if (strcmp (string, strtab + aux->vda_name) == 0)
255 /* Bingo! */
256 return 1;
257
258 /* If no more definitions we failed to find what we want. */
259 if (def->vd_next == 0)
260 break;
261
262 /* Next definition. */
263 def = (ElfW(Verdef) *) ((char *) def + def->vd_next);
264 }
265
266 return 0;
267}
268
120b4c49
UD
269static unsigned int _dl_skip_args; /* Nonzero if we were run directly. */
270static const char *library_path; /* The library search path. */
271static const char *preloadlist; /* The list preloaded objects. */
272static int version_info; /* Nonzero if information about
273 versions has to be printed. */
a1a9d215 274
d66e34cd 275static void
266180eb
RM
276dl_main (const ElfW(Phdr) *phdr,
277 ElfW(Half) phent,
278 ElfW(Addr) *user_entry)
d66e34cd 279{
266180eb 280 const ElfW(Phdr) *ph;
ceb2d9aa 281 struct link_map *main_map;
0200214b 282 int lazy;
ea278354 283 enum mode mode;
2064087b
RM
284 struct link_map **preloads;
285 unsigned int npreloads;
14bab8de
UD
286 size_t file_size;
287 char *file;
2f6d1f1b 288 int has_interp = 0;
77aba05b 289 unsigned int i;
d66e34cd 290
ea278354
UD
291 /* Process the environment variable which control the behaviour. */
292 process_envvars (&mode, &lazy);
3996f34b 293
46ec036d
UD
294 /* Set up a flag which tells we are just starting. */
295 _dl_starting_up = 1;
296
f21acc89 297 if (*user_entry == (ElfW(Addr)) &ENTRY_POINT)
0200214b
RM
298 {
299 /* Ho ho. We are not the program interpreter! We are the program
300 itself! This means someone ran ld.so as a command. Well, that
301 might be convenient to do sometimes. We support it by
302 interpreting the args like this:
303
304 ld.so PROGRAM ARGS...
305
306 The first argument is the name of a file containing an ELF
307 executable we will load and run with the following arguments.
308 To simplify life here, PROGRAM is searched for using the
309 normal rules for shared objects, rather than $PATH or anything
310 like that. We just load it and use its entry point; we don't
311 pay attention to its PT_INTERP command (we are the interpreter
312 ourselves). This is an easy way to test a new ld.so before
313 installing it. */
421f82e5 314
ffee1316
RM
315 /* Note the place where the dynamic linker actually came from. */
316 _dl_rtld_map.l_name = _dl_argv[0];
6a76c115 317
fd26970f
UD
318 while (_dl_argc > 1)
319 if (! strcmp (_dl_argv[1], "--list"))
320 {
321 mode = list;
322 lazy = -1; /* This means do no dependency analysis. */
61965e9b 323
fd26970f
UD
324 ++_dl_skip_args;
325 --_dl_argc;
326 ++_dl_argv;
327 }
328 else if (! strcmp (_dl_argv[1], "--verify"))
329 {
330 mode = verify;
6a76c115 331
fd26970f
UD
332 ++_dl_skip_args;
333 --_dl_argc;
334 ++_dl_argv;
335 }
880f421f
UD
336 else if (! strcmp (_dl_argv[1], "--library-path")
337 && _dl_argc > 2)
338 {
339 library_path = _dl_argv[2];
340
341 _dl_skip_args += 2;
342 _dl_argc -= 2;
343 _dl_argv += 2;
344 }
fd26970f
UD
345 else
346 break;
d66e34cd 347
61eb22d3
UD
348 /* If we have no further argument the program was called incorrectly.
349 Grant the user some education. */
350 if (_dl_argc < 2)
351 _dl_sysdep_fatal ("\
2bcf29ba 352Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]\n\
61eb22d3
UD
353You have invoked `ld.so', the helper program for shared library executables.\n\
354This program usually lives in the file `/lib/ld.so', and special directives\n\
355in executable files using ELF shared libraries tell the system's program\n\
356loader to load the helper program from this file. This helper program loads\n\
357the shared libraries needed by the program executable, prepares the program\n\
358to run, and runs it. You may invoke this helper program directly from the\n\
359command line to load and run an ELF executable file; this is like executing\n\
360that file itself, but always uses this helper program from the file you\n\
361specified, instead of the helper program file specified in the executable\n\
362file you run. This is mostly of use for maintainers to test new versions\n\
2bcf29ba
UD
363of this helper program; chances are you did not intend to run this program.\n\
364\n\
365 --list list all dependencies and how they are resolved\n\
366 --verify verify that given object really is a dynamically linked\n\
367 object we get handle\n\
368 --library-path PATH use given PATH instead of content of the environment\n\
369 variable LD_LIBRARY_PATH\n",
61eb22d3
UD
370 NULL);
371
0200214b
RM
372 ++_dl_skip_args;
373 --_dl_argc;
374 ++_dl_argv;
91f62ce6 375
da832465
UD
376 /* Initialize the data structures for the search paths for shared
377 objects. */
378 _dl_init_paths (library_path);
379
2de99474
UD
380 if (mode == verify)
381 {
dcf0671d 382 char *err_str = NULL;
993b3242 383 struct map_args args;
2de99474 384
993b3242 385 args.str = _dl_argv[0];
8d9618b7 386 (void) _dl_catch_error (&err_str, map_doit, &args);
993b3242 387 main_map = args.main_map;
2de99474 388 if (err_str != NULL)
dcf0671d
UD
389 {
390 free (err_str);
391 _exit (EXIT_FAILURE);
392 }
2de99474
UD
393 }
394 else
c6222ab9 395 main_map = _dl_map_object (NULL, _dl_argv[0], 0, lt_library, 0);
2de99474 396
ceb2d9aa
UD
397 phdr = main_map->l_phdr;
398 phent = main_map->l_phnum;
399 main_map->l_name = (char *) "";
400 *user_entry = main_map->l_entry;
0200214b
RM
401 }
402 else
403 {
404 /* Create a link_map for the executable itself.
405 This will be what dlopen on "" returns. */
1618c590 406 main_map = _dl_new_object ((char *) "", "", lt_executable);
ceb2d9aa 407 if (main_map == NULL)
762a2918 408 _dl_sysdep_fatal ("cannot allocate memory for link map\n", NULL);
ceb2d9aa
UD
409 main_map->l_phdr = phdr;
410 main_map->l_phnum = phent;
411 main_map->l_entry = *user_entry;
3e5f5557 412 main_map->l_opencount = 1;
da832465 413
97a51d8a
UD
414 /* We delay initializing the path structure until we got the dynamic
415 information for the program. */
0200214b
RM
416 }
417
418 /* Scan the program header table for the dynamic section. */
419 for (ph = phdr; ph < &phdr[phent]; ++ph)
420 switch (ph->p_type)
421 {
da832465
UD
422 case PT_PHDR:
423 /* Find out the load address. */
424 main_map->l_addr = (ElfW(Addr)) phdr - ph->p_vaddr;
425 break;
0200214b
RM
426 case PT_DYNAMIC:
427 /* This tells us where to find the dynamic section,
428 which tells us everything we need to do. */
ceb2d9aa 429 main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr;
0200214b
RM
430 break;
431 case PT_INTERP:
432 /* This "interpreter segment" was used by the program loader to
433 find the program interpreter, which is this program itself, the
434 dynamic linker. We note what name finds us, so that a future
435 dlopen call or DT_NEEDED entry, for something that wants to link
436 against the dynamic linker as a shared library, will know that
437 the shared object is already loaded. */
ceb2d9aa 438 _dl_rtld_libname.name = (const char *) main_map->l_addr + ph->p_vaddr;
c84142e8
UD
439 _dl_rtld_libname.next = NULL;
440 _dl_rtld_map.l_libname = &_dl_rtld_libname;
f41c8091
UD
441
442 /* Ordinarilly, we would get additional names for the loader from
443 our DT_SONAME. This can't happen if we were actually linked as
444 a static executable (detect this case when we have no DYNAMIC).
445 If so, assume the filename component of the interpreter path to
446 be our SONAME, and add it to our name list. */
447 if (_dl_rtld_map.l_ld == NULL)
448 {
449 char *p = strrchr (_dl_rtld_libname.name, '/');
450 if (p)
451 {
452 _dl_rtld_libname2.name = p+1;
453 _dl_rtld_libname2.next = NULL;
454 _dl_rtld_libname.next = &_dl_rtld_libname2;
455 }
456 }
457
2f6d1f1b 458 has_interp = 1;
0200214b
RM
459 break;
460 }
ffee1316 461 if (! _dl_rtld_map.l_libname && _dl_rtld_map.l_name)
c84142e8
UD
462 {
463 /* We were invoked directly, so the program might not have a
464 PT_INTERP. */
465 _dl_rtld_libname.name = _dl_rtld_map.l_name;
466 _dl_rtld_libname.next = NULL;
467 _dl_rtld_map.l_libname = &_dl_rtld_libname;
468 }
ffee1316
RM
469 else
470 assert (_dl_rtld_map.l_libname); /* How else did we get here? */
0200214b
RM
471
472 /* Extract the contents of the dynamic section for easy access. */
ceb2d9aa
UD
473 elf_get_dynamic_info (main_map->l_ld, main_map->l_info);
474 if (main_map->l_info[DT_HASH])
0200214b 475 /* Set up our cache of pointers into the hash table. */
ceb2d9aa 476 _dl_setup_hash (main_map);
0200214b 477
e2102c14
UD
478 if (mode == verify)
479 {
480 /* We were called just to verify that this is a dynamic
481 executable using us as the program interpreter. Exit with an
482 error if we were not able to load the binary or no interpreter
483 is specified (i.e., this is no dynamically linked binary. */
484 if (main_map->l_ld == NULL)
485 _exit (1);
486 if (!has_interp)
487 _exit (2);
488
489 /* We allow here some platform specific code. */
490#ifdef DISTINGUISH_LIB_VERSIONS
491 DISTINGUISH_LIB_VERSIONS;
492#endif
493 _exit (0);
494 }
495
97a51d8a
UD
496 if (*user_entry != (ElfW(Addr)) &ENTRY_POINT)
497 /* Initialize the data structures for the search paths for shared
498 objects. */
120b4c49 499 _dl_init_paths (library_path);
97a51d8a 500
0200214b 501 /* Put the link_map for ourselves on the chain so it can be found by
ceb2d9aa
UD
502 name. Note that at this point the global chain of link maps contains
503 exactly one element, which is pointed to by main_map. */
ffee1316
RM
504 if (! _dl_rtld_map.l_name)
505 /* If not invoked directly, the dynamic linker shared object file was
506 found by the PT_INTERP name. */
c84142e8 507 _dl_rtld_map.l_name = (char *) _dl_rtld_map.l_libname->name;
ba79d61b 508 _dl_rtld_map.l_type = lt_library;
ceb2d9aa
UD
509 main_map->l_next = &_dl_rtld_map;
510 _dl_rtld_map.l_prev = main_map;
0200214b 511
14bab8de
UD
512 /* We have two ways to specify objects to preload: via environment
513 variable and via the file /etc/ld.so.preload. The later can also
514 be used when security is enabled. */
2064087b
RM
515 preloads = NULL;
516 npreloads = 0;
14bab8de 517
fd26970f 518 if (preloadlist)
c4029823 519 {
566efee2
UD
520 /* The LD_PRELOAD environment variable gives list of libraries
521 separated by white space or colons that are loaded before the
fd26970f
UD
522 executable's dependencies and prepended to the global scope
523 list. If the binary is running setuid all elements
524 containing a '/' are ignored since it is insecure. */
525 char *list = strdupa (preloadlist);
526 char *p;
566efee2 527 while ((p = strsep (&list, " :")) != NULL)
e2102c14
UD
528 if (p[0] != '\0'
529 && (! __libc_enable_secure || strchr (p, '/') == NULL))
fd26970f 530 {
2bcf29ba 531 struct link_map *new_map = _dl_map_object (main_map, p, 1,
c6222ab9 532 lt_library, 0);
bd355af0
UD
533 if (new_map->l_opencount == 1)
534 /* It is no duplicate. */
535 ++npreloads;
fd26970f 536 }
c4029823
UD
537 }
538
14bab8de
UD
539 /* Read the contents of the file. */
540 file = _dl_sysdep_read_whole_file ("/etc/ld.so.preload", &file_size,
541 PROT_READ | PROT_WRITE);
542 if (file)
543 {
544 /* Parse the file. It contains names of libraries to be loaded,
545 separated by white spaces or `:'. It may also contain
546 comments introduced by `#'. */
547 char *problem;
548 char *runp;
549 size_t rest;
550
551 /* Eliminate comments. */
552 runp = file;
553 rest = file_size;
554 while (rest > 0)
555 {
556 char *comment = memchr (runp, '#', rest);
557 if (comment == NULL)
558 break;
559
560 rest -= comment - runp;
561 do
562 *comment = ' ';
563 while (--rest > 0 && *++comment != '\n');
564 }
565
566 /* We have one problematic case: if we have a name at the end of
567 the file without a trailing terminating characters, we cannot
568 place the \0. Handle the case separately. */
49891c10
UD
569 if (file[file_size - 1] != ' ' && file[file_size - 1] != '\t'
570 && file[file_size - 1] != '\n' && file[file_size - 1] != ':')
14bab8de
UD
571 {
572 problem = &file[file_size];
573 while (problem > file && problem[-1] != ' ' && problem[-1] != '\t'
49891c10 574 && problem[-1] != '\n' && problem[-1] != ':')
14bab8de
UD
575 --problem;
576
577 if (problem > file)
578 problem[-1] = '\0';
579 }
580 else
49891c10
UD
581 {
582 problem = NULL;
583 file[file_size - 1] = '\0';
584 }
14bab8de
UD
585
586 if (file != problem)
587 {
588 char *p;
e2102c14 589 runp = file;
14bab8de 590 while ((p = strsep (&runp, ": \t\n")) != NULL)
e2102c14
UD
591 if (p[0] != '\0')
592 {
593 struct link_map *new_map = _dl_map_object (main_map, p, 1,
594 lt_library, 0);
595 if (new_map->l_opencount == 1)
596 /* It is no duplicate. */
597 ++npreloads;
598 }
14bab8de
UD
599 }
600
601 if (problem != NULL)
602 {
603 char *p = strndupa (problem, file_size - (problem - file));
2bcf29ba 604 struct link_map *new_map = _dl_map_object (main_map, p, 1,
c6222ab9 605 lt_library, 0);
bd355af0
UD
606 if (new_map->l_opencount == 1)
607 /* It is no duplicate. */
608 ++npreloads;
14bab8de
UD
609 }
610
611 /* We don't need the file anymore. */
612 __munmap (file, file_size);
613 }
614
14bab8de
UD
615 if (npreloads != 0)
616 {
617 /* Set up PRELOADS with a vector of the preloaded libraries. */
618 struct link_map *l;
14bab8de
UD
619 preloads = __alloca (npreloads * sizeof preloads[0]);
620 l = _dl_rtld_map.l_next; /* End of the chain before preloads. */
621 i = 0;
622 do
623 {
624 preloads[i++] = l;
625 l = l->l_next;
626 } while (l);
627 assert (i == npreloads);
628 }
629
2064087b
RM
630 /* Load all the libraries specified by DT_NEEDED entries. If LD_PRELOAD
631 specified some libraries to load, these are inserted before the actual
632 dependencies in the executable's searchlist for symbol resolution. */
ceb2d9aa 633 _dl_map_object_deps (main_map, preloads, npreloads, mode == trace);
d66e34cd 634
2064087b 635#ifndef MAP_ANON
f332db02
RM
636 /* We are done mapping things, so close the zero-fill descriptor. */
637 __close (_dl_zerofd);
638 _dl_zerofd = -1;
2064087b 639#endif
f332db02 640
f9496a7b
RM
641 /* Remove _dl_rtld_map from the chain. */
642 _dl_rtld_map.l_prev->l_next = _dl_rtld_map.l_next;
643 if (_dl_rtld_map.l_next)
644 _dl_rtld_map.l_next->l_prev = _dl_rtld_map.l_prev;
645
646 if (_dl_rtld_map.l_opencount)
0200214b 647 {
f9496a7b
RM
648 /* Some DT_NEEDED entry referred to the interpreter object itself, so
649 put it back in the list of visible objects. We insert it into the
650 chain in symbol search order because gdb uses the chain's order as
651 its symbol search order. */
77aba05b 652 i = 1;
ceb2d9aa 653 while (main_map->l_searchlist[i] != &_dl_rtld_map)
f9496a7b 654 ++i;
ceb2d9aa
UD
655 _dl_rtld_map.l_prev = main_map->l_searchlist[i - 1];
656 _dl_rtld_map.l_next = (i + 1 < main_map->l_nsearchlist ?
657 main_map->l_searchlist[i + 1] : NULL);
f9496a7b
RM
658 assert (_dl_rtld_map.l_prev->l_next == _dl_rtld_map.l_next);
659 _dl_rtld_map.l_prev->l_next = &_dl_rtld_map;
4d02a5b1 660 if (_dl_rtld_map.l_next)
f9496a7b
RM
661 {
662 assert (_dl_rtld_map.l_next->l_prev == _dl_rtld_map.l_prev);
663 _dl_rtld_map.l_next->l_prev = &_dl_rtld_map;
664 }
0200214b 665 }
d66e34cd 666
c84142e8
UD
667 /* Now let us see whether all libraries are available in the
668 versions we need. */
669 {
993b3242
UD
670 struct version_check_args args;
671 args.doexit = mode == normal;
672 args.main_map = main_map;
673 _dl_receive_error (print_missing_version, version_check_doit, &args);
c84142e8
UD
674 }
675
2de99474 676 if (mode != normal)
0200214b
RM
677 {
678 /* We were run just to list the shared libraries. It is
679 important that we do this before real relocation, because the
680 functions we call below for output may no longer work properly
681 after relocation. */
0200214b
RM
682 if (! _dl_loaded->l_info[DT_NEEDED])
683 _dl_sysdep_message ("\t", "statically linked\n", NULL);
684 else
ceb2d9aa
UD
685 {
686 struct link_map *l;
687
688 for (l = _dl_loaded->l_next; l; l = l->l_next)
689 if (l->l_opencount == 0)
690 /* The library was not found. */
691 _dl_sysdep_message ("\t", l->l_libname->name, " => not found\n",
692 NULL);
693 else
694 {
695 char buf[20], *bp;
696 buf[sizeof buf - 1] = '\0';
af6f3906 697 bp = _itoa_word (l->l_addr, &buf[sizeof buf - 1], 16, 0);
ceb2d9aa
UD
698 while ((size_t) (&buf[sizeof buf - 1] - bp)
699 < sizeof l->l_addr * 2)
700 *--bp = '0';
701 _dl_sysdep_message ("\t", l->l_libname->name, " => ",
702 l->l_name, " (0x", bp, ")\n", NULL);
703 }
704 }
1a3a58fd 705
2de99474 706 if (mode != trace)
cddcfecf
RM
707 for (i = 1; i < _dl_argc; ++i)
708 {
709 const ElfW(Sym) *ref = NULL;
710 ElfW(Addr) loadbase = _dl_lookup_symbol (_dl_argv[i], &ref,
711 &_dl_default_scope[2],
dcf0671d 712 "argument",
a2b08ee5 713 ELF_MACHINE_JMP_SLOT);
cddcfecf
RM
714 char buf[20], *bp;
715 buf[sizeof buf - 1] = '\0';
af6f3906 716 bp = _itoa_word (ref->st_value, &buf[sizeof buf - 1], 16, 0);
14bab8de 717 while ((size_t) (&buf[sizeof buf - 1] - bp) < sizeof loadbase * 2)
cddcfecf
RM
718 *--bp = '0';
719 _dl_sysdep_message (_dl_argv[i], " found at 0x", bp, NULL);
720 buf[sizeof buf - 1] = '\0';
af6f3906 721 bp = _itoa_word (loadbase, &buf[sizeof buf - 1], 16, 0);
14bab8de 722 while ((size_t) (&buf[sizeof buf - 1] - bp) < sizeof loadbase * 2)
cddcfecf
RM
723 *--bp = '0';
724 _dl_sysdep_message (" in object at 0x", bp, "\n", NULL);
725 }
ce37fa88 726 else
fd26970f 727 {
ce37fa88
UD
728 if (lazy >= 0)
729 {
730 /* We have to do symbol dependency testing. */
731 struct relocate_args args;
732 struct link_map *l;
993b3242 733
ce37fa88 734 args.lazy = lazy;
fd26970f 735
ce37fa88
UD
736 l = _dl_loaded;
737 while (l->l_next)
738 l = l->l_next;
739 do
740 {
741 if (l != &_dl_rtld_map && l->l_opencount > 0)
742 {
743 args.l = l;
744 _dl_receive_error (print_unresolved, relocate_doit,
745 &args);
746 *_dl_global_scope_end = NULL;
747 }
748 l = l->l_prev;
749 } while (l);
750 }
751
752#define VERNEEDTAG (DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (DT_VERNEED))
120b4c49 753 if (version_info)
fd26970f 754 {
ce37fa88
UD
755 /* Print more information. This means here, print information
756 about the versions needed. */
757 int first = 1;
758 struct link_map *map = _dl_loaded;
759
760 for (map = _dl_loaded; map != NULL; map = map->l_next)
fd26970f 761 {
f41c8091 762 const char *strtab;
ce37fa88 763 ElfW(Dyn) *dyn = map->l_info[VERNEEDTAG];
f41c8091
UD
764 ElfW(Verneed) *ent;
765
766 if (dyn == NULL)
767 continue;
768
769 strtab = (const char *)
770 (map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
771 ent = (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
ce37fa88 772
f41c8091 773 if (first)
ce37fa88 774 {
f41c8091
UD
775 _dl_sysdep_message ("\n\tVersion information:\n", NULL);
776 first = 0;
777 }
ce37fa88 778
f41c8091
UD
779 _dl_sysdep_message ("\t", (map->l_name[0]
780 ? map->l_name : _dl_argv[0]),
781 ":\n", NULL);
782
783 while (1)
784 {
785 ElfW(Vernaux) *aux;
786 struct link_map *needed;
ce37fa88 787
f41c8091
UD
788 needed = find_needed (strtab + ent->vn_file);
789 aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
ce37fa88
UD
790
791 while (1)
792 {
f41c8091
UD
793 const char *fname = NULL;
794
795 _dl_sysdep_message ("\t\t",
796 strtab + ent->vn_file,
797 " (", strtab + aux->vna_name,
798 ") ",
799 (aux->vna_flags
800 & VER_FLG_WEAK
801 ? "[WEAK] " : ""),
802 "=> ", NULL);
803
804 if (needed != NULL
805 && match_version (strtab+aux->vna_name, needed))
806 fname = needed->l_name;
807
808 _dl_sysdep_message (fname ?: "not found", "\n",
809 NULL);
ce37fa88 810
f41c8091
UD
811 if (aux->vna_next == 0)
812 /* No more symbols. */
ce37fa88
UD
813 break;
814
f41c8091
UD
815 /* Next symbol. */
816 aux = (ElfW(Vernaux) *) ((char *) aux
817 + aux->vna_next);
ce37fa88 818 }
f41c8091
UD
819
820 if (ent->vn_next == 0)
821 /* No more dependencies. */
822 break;
823
824 /* Next dependency. */
825 ent = (ElfW(Verneed) *) ((char *) ent + ent->vn_next);
ce37fa88 826 }
fd26970f 827 }
ce37fa88 828 }
fd26970f 829 }
d66e34cd 830
0200214b
RM
831 _exit (0);
832 }
86d2c878 833
ba79d61b
RM
834 {
835 /* Now we have all the objects loaded. Relocate them all except for
836 the dynamic linker itself. We do this in reverse order so that copy
837 relocs of earlier objects overwrite the data written by later
838 objects. We do not re-relocate the dynamic linker itself in this
839 loop because that could result in the GOT entries for functions we
840 call being changed, and that would break us. It is safe to relocate
841 the dynamic linker out of order because it has no copy relocs (we
842 know that because it is self-contained). */
843
ceb2d9aa 844 struct link_map *l;
ba79d61b
RM
845 l = _dl_loaded;
846 while (l->l_next)
847 l = l->l_next;
848 do
849 {
850 if (l != &_dl_rtld_map)
851 {
852 _dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
853 *_dl_global_scope_end = NULL;
854 }
855 l = l->l_prev;
856 } while (l);
857
858 /* Do any necessary cleanups for the startup OS interface code.
859 We do these now so that no calls are made after rtld re-relocation
860 which might be resolved to different functions than we expect.
861 We cannot do this before relocating the other objects because
862 _dl_relocate_object might need to call `mprotect' for DT_TEXTREL. */
863 _dl_sysdep_start_cleanup ();
864
865 if (_dl_rtld_map.l_opencount > 0)
866 /* There was an explicit ref to the dynamic linker as a shared lib.
867 Re-relocate ourselves with user-controlled symbol definitions. */
868 _dl_relocate_object (&_dl_rtld_map, &_dl_default_scope[2], 0);
869 }
ac16e905 870
4d6acc61
RM
871 {
872 /* Initialize _r_debug. */
873 struct r_debug *r = _dl_debug_initialize (_dl_rtld_map.l_addr);
ceb2d9aa 874 struct link_map *l;
4d6acc61
RM
875
876 l = _dl_loaded;
ec42724d
RM
877
878#ifdef ELF_MACHINE_DEBUG_SETUP
879
880 /* Some machines (e.g. MIPS) don't use DT_DEBUG in this way. */
881
882 ELF_MACHINE_DEBUG_SETUP (l, r);
883 ELF_MACHINE_DEBUG_SETUP (&_dl_rtld_map, r);
884
885#else
886
4d6acc61
RM
887 if (l->l_info[DT_DEBUG])
888 /* There is a DT_DEBUG entry in the dynamic section. Fill it in
889 with the run-time address of the r_debug structure */
890 l->l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r;
891
d746b89c
RM
892 /* Fill in the pointer in the dynamic linker's own dynamic section, in
893 case you run gdb on the dynamic linker directly. */
894 if (_dl_rtld_map.l_info[DT_DEBUG])
895 _dl_rtld_map.l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r;
896
ec42724d
RM
897#endif
898
4d6acc61
RM
899 /* Notify the debugger that all objects are now mapped in. */
900 r->r_state = RT_ADD;
901 _dl_debug_state ();
902 }
0200214b 903
3996f34b
UD
904 /* Now enable profiling if needed. */
905 if (_dl_profile_map != NULL)
906 /* We must prepare the profiling. */
907 _dl_start_profile (_dl_profile_map, _dl_profile_output);
908
d66e34cd
RM
909 /* Once we return, _dl_sysdep_start will invoke
910 the DT_INIT functions and then *USER_ENTRY. */
911}
fd26970f
UD
912\f
913/* This is a little helper function for resolving symbols while
914 tracing the binary. */
915static void
c84142e8
UD
916print_unresolved (int errcode __attribute__ ((unused)), const char *objname,
917 const char *errstring)
fd26970f 918{
3996f34b
UD
919 if (objname[0] == '\0')
920 objname = _dl_argv[0] ?: "<main program>";
fd26970f
UD
921 _dl_sysdep_error (errstring, " (", objname, ")\n", NULL);
922}
c84142e8
UD
923\f
924/* This is a little helper function for resolving symbols while
925 tracing the binary. */
926static void
927print_missing_version (int errcode __attribute__ ((unused)),
928 const char *objname, const char *errstring)
929{
930 _dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>", ": ",
931 objname, ": ", errstring, "\n", NULL);
932}
ea278354 933\f
7dea968e
UD
934/* Nonzero if any of the debugging options is enabled. */
935static int any_debug;
936
b5efde2f
UD
937/* Process the string given as the parameter which explains which debugging
938 options are enabled. */
939static void
14c44e2e 940process_dl_debug (const char *dl_debug)
b5efde2f 941{
14c44e2e
UD
942 size_t len;
943#define separators " ,:"
b5efde2f
UD
944 do
945 {
14c44e2e 946 len = 0;
b5efde2f 947 /* Skip separating white spaces and commas. */
14c44e2e 948 dl_debug += strspn (dl_debug, separators);
b5efde2f
UD
949 if (*dl_debug != '\0')
950 {
14c44e2e
UD
951 len = strcspn (dl_debug, separators);
952
953 switch (len)
b5efde2f 954 {
14c44e2e
UD
955 case 4:
956 if (memcmp (dl_debug, "help", 4) == 0)
957 {
958 _dl_sysdep_message ("\
08b511e6 959Valid options for the LD_DEBUG environment variable are:\n\
b5efde2f 960\n\
0c367d92 961 bindings display information about symbol binding\n\
8193034b 962 files display processing of files and libraries\n\
0c367d92
UD
963 help display this help message and exit\n\
964 libs display library search paths\n\
8193034b 965 reloc display relocation processing\n\
de100ca7 966 symbols display symbol table processing\n\
8193034b 967 versions display version dependencies\n\
0c367d92
UD
968\n\
969To direct the debugging output into a file instead of standard output\n\
970a filename can be specified using the LD_DEBUG_OUTPUT environment variable.\n",
971 NULL);
14c44e2e
UD
972 _exit (0);
973 }
77aba05b 974
14c44e2e
UD
975 if (memcmp (dl_debug, "libs", 4) == 0)
976 {
977 _dl_debug_libs = 1;
978 _dl_debug_impcalls = 1;
979 any_debug = 1;
980 continue;
981 }
982 break;
983
984 case 5:
985 if (memcmp (dl_debug, "reloc", 5) == 0)
986 {
987 _dl_debug_reloc = 1;
988 _dl_debug_impcalls = 1;
989 any_debug = 1;
990 continue;
991 }
992
993 if (memcmp (dl_debug, "files", 5) == 0)
994 {
995 _dl_debug_files = 1;
996 _dl_debug_impcalls = 1;
997 any_debug = 1;
998 continue;
999 }
1000 break;
77aba05b 1001
14c44e2e
UD
1002 case 7:
1003 if (memcmp (dl_debug, "symbols", 7) == 0)
1004 {
1005 _dl_debug_symbols = 1;
1006 _dl_debug_impcalls = 1;
1007 any_debug = 1;
1008 continue;
1009 }
1010 break;
77aba05b 1011
14c44e2e
UD
1012 case 8:
1013 if (memcmp (dl_debug, "bindings", 8) == 0)
1014 {
1015 _dl_debug_bindings = 1;
1016 _dl_debug_impcalls = 1;
1017 any_debug = 1;
1018 continue;
1019 }
1020
1021 if (memcmp (dl_debug, "versions", 8) == 0)
1022 {
1023 _dl_debug_versions = 1;
1024 _dl_debug_impcalls = 1;
1025 any_debug = 1;
1026 continue;
1027 }
1028 break;
1029
1030 default:
1031 break;
77aba05b 1032 }
14c44e2e
UD
1033
1034 {
1035 /* Display a warning and skip everything until next separator. */
1036 char *startp = strndupa (dl_debug, len);
1037 _dl_sysdep_error ("warning: debug option `", startp,
1038 "' unknown; try LD_DEBUG=help\n", NULL);
1039 }
b5efde2f
UD
1040 }
1041 }
14c44e2e 1042 while (*(dl_debug += len) != '\0');
b5efde2f
UD
1043}
1044\f
ea278354
UD
1045/* Process all environments variables the dynamic linker must recognize.
1046 Since all of them start with `LD_' we are a bit smarter while finding
1047 all the entries. */
1048static void
1049process_envvars (enum mode *modep, int *lazyp)
1050{
1051 char **runp = NULL;
1052 char *envline;
1053 enum mode mode = normal;
1054 int bind_now = 0;
7dea968e 1055 char *debug_output = NULL;
ea278354
UD
1056
1057 /* This is the default place for profiling data file. */
1058 _dl_profile_output = "/var/tmp";
1059
1060 while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
1061 {
14c44e2e 1062 size_t len = strcspn (envline, "=") - 3;
ea278354 1063
14c44e2e 1064 switch (len)
ea278354 1065 {
14c44e2e
UD
1066 case 4:
1067 /* Warning level, verbose or not. */
1068 if (memcmp (&envline[3], "WARN", 4) == 0)
1069 _dl_verbose = envline[8] != '\0';
1070 break;
ea278354 1071
14c44e2e
UD
1072 case 5:
1073 /* Debugging of the dynamic linker? */
1074 if (memcmp (&envline[3], "DEBUG", 5) == 0)
1075 process_dl_debug (&envline[9]);
1076 break;
b5efde2f 1077
14c44e2e
UD
1078 case 7:
1079 /* Print information about versions. */
1080 if (memcmp (&envline[3], "VERBOSE", 7) == 0)
1081 {
1082 version_info = envline[11] != '\0';
1083 break;
1084 }
7dea968e 1085
14c44e2e
UD
1086 /* List of objects to be preloaded. */
1087 if (memcmp (&envline[3], "PRELOAD", 7) == 0)
1088 {
1089 preloadlist = &envline[11];
1090 break;
1091 }
120b4c49 1092
14c44e2e
UD
1093 /* Which shared object shall be profiled. */
1094 if (memcmp (&envline[3], "PROFILE", 7) == 0)
1095 {
1096 _dl_profile = &envline[11];
1097 if (*_dl_profile == '\0')
1098 _dl_profile = NULL;
1099 }
1100 break;
120b4c49 1101
14c44e2e
UD
1102 case 8:
1103 /* Do we bind early? */
1104 if (memcmp (&envline[3], "BIND_NOW", 8) == 0)
1105 bind_now = 1;
1106 break;
ea278354 1107
14c44e2e
UD
1108 case 9:
1109 /* Test whether we want to see the content of the auxiliary
1110 array passed up from the kernel. */
1111 if (memcmp (&envline[3], "SHOW_AUXV", 9) == 0)
1112 _dl_show_auxv ();
1113 break;
ea278354 1114
14c44e2e
UD
1115 case 12:
1116 /* Where to place the profiling data file. */
1117 if (memcmp (&envline[3], "DEBUG_OUTPUT", 12) == 0)
1118 {
1119 debug_output = &envline[16];
1120 break;
1121 }
ea278354 1122
14c44e2e
UD
1123 /* The library search path. */
1124 if (memcmp (&envline[3], "LIBRARY_PATH", 12) == 0)
1125 library_path = &envline[16];
1126 break;
ea278354 1127
14c44e2e
UD
1128 case 14:
1129 /* Where to place the profiling data file. */
1130 if (memcmp (&envline[3], "PROFILE_OUTPUT", 14) == 0)
1131 {
1132 _dl_profile_output = &envline[18];
1133 if (*_dl_profile_output == '\0')
1134 _dl_profile_output = "/var/tmp";
1135 }
1136 break;
120b4c49 1137
14c44e2e
UD
1138 case 20:
1139 /* The mode of the dynamic linker can be set. */
1140 if (memcmp (&envline[3], "TRACE_LOADED_OBJECTS", 20) == 0)
1141 mode = trace;
1142 break;
e2102c14
UD
1143
1144 /* We might have some extra environment variable to handle. This
1145 is tricky due to the pre-processing of the length of the name
1146 in the switch statement here. The code here assumes that added
1147 environment variables have a different length. */
1148#ifdef EXTRA_LD_ENVVARS
1149 EXTRA_LD_ENVVARS
1150#endif
ea278354
UD
1151 }
1152 }
1153
7dea968e
UD
1154 /* If we have to run the dynamic linker in debugging mode and the
1155 LD_DEBUG_OUTPUT environment variable is given, we write the debug
1156 messages to this file. */
14c44e2e 1157 if (any_debug && debug_output != NULL && !__libc_enable_secure)
7dea968e
UD
1158 {
1159 _dl_debug_fd = __open (debug_output, O_WRONLY | O_APPEND | O_CREAT,
1160 0666);
1161 if (_dl_debug_fd == -1)
1162 /* We use standard output if opening the file failed. */
1163 _dl_debug_fd = STDOUT_FILENO;
1164 }
1165
ea278354
UD
1166 /* LAZY is determined by the environment variable LD_WARN and
1167 LD_BIND_NOW if we trace the binary. */
1168 if (mode == trace)
1169 *lazyp = _dl_verbose ? !bind_now : -1;
1170 else
1171 *lazyp = !__libc_enable_secure && !bind_now;
1172
1173 *modep = mode;
1174}