]> sourceware.org Git - glibc.git/blame - elf/rtld.c
Update.
[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 <link.h>
d66e34cd
RM
22#include <stddef.h>
23#include <stdlib.h>
f51d1dfd 24#include <string.h>
d66e34cd 25#include <unistd.h>
2064087b 26#include <sys/mman.h> /* Check if MAP_ANON is defined. */
ce37fa88 27#include <stdio-common/_itoa.h>
b1dbbaa4 28#include <assert.h>
f21acc89 29#include <entry.h>
f5348425
RM
30#include "dynamic-link.h"
31
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 ("\
352Usage: ld.so [--list|--verify] EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]\n\
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\
363of this helper program; chances are you did not intend to run this program.\n",
364 NULL);
365
0200214b
RM
366 ++_dl_skip_args;
367 --_dl_argc;
368 ++_dl_argv;
91f62ce6 369
da832465
UD
370 /* Initialize the data structures for the search paths for shared
371 objects. */
372 _dl_init_paths (library_path);
373
2de99474
UD
374 if (mode == verify)
375 {
dcf0671d 376 char *err_str = NULL;
2de99474 377 const char *obj_name __attribute__ ((unused));
993b3242 378 struct map_args args;
2de99474 379
993b3242
UD
380 args.str = _dl_argv[0];
381 (void) _dl_catch_error (&err_str, &obj_name, map_doit, &args);
382 main_map = args.main_map;
2de99474 383 if (err_str != NULL)
dcf0671d
UD
384 {
385 free (err_str);
386 _exit (EXIT_FAILURE);
387 }
2de99474
UD
388 }
389 else
c6222ab9 390 main_map = _dl_map_object (NULL, _dl_argv[0], 0, lt_library, 0);
2de99474 391
ceb2d9aa
UD
392 phdr = main_map->l_phdr;
393 phent = main_map->l_phnum;
394 main_map->l_name = (char *) "";
395 *user_entry = main_map->l_entry;
0200214b
RM
396 }
397 else
398 {
399 /* Create a link_map for the executable itself.
400 This will be what dlopen on "" returns. */
1618c590 401 main_map = _dl_new_object ((char *) "", "", lt_executable);
ceb2d9aa 402 if (main_map == NULL)
762a2918 403 _dl_sysdep_fatal ("cannot allocate memory for link map\n", NULL);
ceb2d9aa
UD
404 main_map->l_phdr = phdr;
405 main_map->l_phnum = phent;
406 main_map->l_entry = *user_entry;
3e5f5557 407 main_map->l_opencount = 1;
da832465 408
97a51d8a
UD
409 /* We delay initializing the path structure until we got the dynamic
410 information for the program. */
0200214b
RM
411 }
412
413 /* Scan the program header table for the dynamic section. */
414 for (ph = phdr; ph < &phdr[phent]; ++ph)
415 switch (ph->p_type)
416 {
da832465
UD
417 case PT_PHDR:
418 /* Find out the load address. */
419 main_map->l_addr = (ElfW(Addr)) phdr - ph->p_vaddr;
420 break;
0200214b
RM
421 case PT_DYNAMIC:
422 /* This tells us where to find the dynamic section,
423 which tells us everything we need to do. */
ceb2d9aa 424 main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr;
0200214b
RM
425 break;
426 case PT_INTERP:
427 /* This "interpreter segment" was used by the program loader to
428 find the program interpreter, which is this program itself, the
429 dynamic linker. We note what name finds us, so that a future
430 dlopen call or DT_NEEDED entry, for something that wants to link
431 against the dynamic linker as a shared library, will know that
432 the shared object is already loaded. */
ceb2d9aa 433 _dl_rtld_libname.name = (const char *) main_map->l_addr + ph->p_vaddr;
c84142e8
UD
434 _dl_rtld_libname.next = NULL;
435 _dl_rtld_map.l_libname = &_dl_rtld_libname;
f41c8091
UD
436
437 /* Ordinarilly, we would get additional names for the loader from
438 our DT_SONAME. This can't happen if we were actually linked as
439 a static executable (detect this case when we have no DYNAMIC).
440 If so, assume the filename component of the interpreter path to
441 be our SONAME, and add it to our name list. */
442 if (_dl_rtld_map.l_ld == NULL)
443 {
444 char *p = strrchr (_dl_rtld_libname.name, '/');
445 if (p)
446 {
447 _dl_rtld_libname2.name = p+1;
448 _dl_rtld_libname2.next = NULL;
449 _dl_rtld_libname.next = &_dl_rtld_libname2;
450 }
451 }
452
2f6d1f1b 453 has_interp = 1;
0200214b
RM
454 break;
455 }
ffee1316 456 if (! _dl_rtld_map.l_libname && _dl_rtld_map.l_name)
c84142e8
UD
457 {
458 /* We were invoked directly, so the program might not have a
459 PT_INTERP. */
460 _dl_rtld_libname.name = _dl_rtld_map.l_name;
461 _dl_rtld_libname.next = NULL;
462 _dl_rtld_map.l_libname = &_dl_rtld_libname;
463 }
ffee1316
RM
464 else
465 assert (_dl_rtld_map.l_libname); /* How else did we get here? */
0200214b 466
61965e9b
RM
467 if (mode == verify)
468 /* We were called just to verify that this is a dynamic executable
469 using us as the program interpreter. */
ceb2d9aa 470 _exit (main_map->l_ld == NULL ? 1 : has_interp ? 0 : 2);
61965e9b 471
0200214b 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
97a51d8a
UD
478 if (*user_entry != (ElfW(Addr)) &ENTRY_POINT)
479 /* Initialize the data structures for the search paths for shared
480 objects. */
120b4c49 481 _dl_init_paths (library_path);
97a51d8a 482
0200214b 483 /* Put the link_map for ourselves on the chain so it can be found by
ceb2d9aa
UD
484 name. Note that at this point the global chain of link maps contains
485 exactly one element, which is pointed to by main_map. */
ffee1316
RM
486 if (! _dl_rtld_map.l_name)
487 /* If not invoked directly, the dynamic linker shared object file was
488 found by the PT_INTERP name. */
c84142e8 489 _dl_rtld_map.l_name = (char *) _dl_rtld_map.l_libname->name;
ba79d61b 490 _dl_rtld_map.l_type = lt_library;
ceb2d9aa
UD
491 main_map->l_next = &_dl_rtld_map;
492 _dl_rtld_map.l_prev = main_map;
0200214b 493
14bab8de
UD
494 /* We have two ways to specify objects to preload: via environment
495 variable and via the file /etc/ld.so.preload. The later can also
496 be used when security is enabled. */
2064087b
RM
497 preloads = NULL;
498 npreloads = 0;
14bab8de 499
fd26970f 500 if (preloadlist)
c4029823 501 {
566efee2
UD
502 /* The LD_PRELOAD environment variable gives list of libraries
503 separated by white space or colons that are loaded before the
fd26970f
UD
504 executable's dependencies and prepended to the global scope
505 list. If the binary is running setuid all elements
506 containing a '/' are ignored since it is insecure. */
507 char *list = strdupa (preloadlist);
508 char *p;
566efee2 509 while ((p = strsep (&list, " :")) != NULL)
fd26970f
UD
510 if (! __libc_enable_secure || strchr (p, '/') == NULL)
511 {
c6222ab9
UD
512 struct link_map *new_map = _dl_map_object (NULL, p, 1,
513 lt_library, 0);
bd355af0
UD
514 if (new_map->l_opencount == 1)
515 /* It is no duplicate. */
516 ++npreloads;
fd26970f 517 }
c4029823
UD
518 }
519
14bab8de
UD
520 /* Read the contents of the file. */
521 file = _dl_sysdep_read_whole_file ("/etc/ld.so.preload", &file_size,
522 PROT_READ | PROT_WRITE);
523 if (file)
524 {
525 /* Parse the file. It contains names of libraries to be loaded,
526 separated by white spaces or `:'. It may also contain
527 comments introduced by `#'. */
528 char *problem;
529 char *runp;
530 size_t rest;
531
532 /* Eliminate comments. */
533 runp = file;
534 rest = file_size;
535 while (rest > 0)
536 {
537 char *comment = memchr (runp, '#', rest);
538 if (comment == NULL)
539 break;
540
541 rest -= comment - runp;
542 do
543 *comment = ' ';
544 while (--rest > 0 && *++comment != '\n');
545 }
546
547 /* We have one problematic case: if we have a name at the end of
548 the file without a trailing terminating characters, we cannot
549 place the \0. Handle the case separately. */
49891c10
UD
550 if (file[file_size - 1] != ' ' && file[file_size - 1] != '\t'
551 && file[file_size - 1] != '\n' && file[file_size - 1] != ':')
14bab8de
UD
552 {
553 problem = &file[file_size];
554 while (problem > file && problem[-1] != ' ' && problem[-1] != '\t'
49891c10 555 && problem[-1] != '\n' && problem[-1] != ':')
14bab8de
UD
556 --problem;
557
558 if (problem > file)
559 problem[-1] = '\0';
560 }
561 else
49891c10
UD
562 {
563 problem = NULL;
564 file[file_size - 1] = '\0';
565 }
14bab8de
UD
566
567 if (file != problem)
568 {
569 char *p;
49891c10 570 runp = file + strspn (file, ": \t\n");
14bab8de
UD
571 while ((p = strsep (&runp, ": \t\n")) != NULL)
572 {
c6222ab9 573 struct link_map *new_map = _dl_map_object (NULL, p, 1,
bd355af0
UD
574 lt_library, 0);
575 if (new_map->l_opencount == 1)
576 /* It is no duplicate. */
577 ++npreloads;
49891c10
UD
578
579 if (runp != NULL)
580 runp += strspn (runp, ": \t\n");
14bab8de
UD
581 }
582 }
583
584 if (problem != NULL)
585 {
586 char *p = strndupa (problem, file_size - (problem - file));
c6222ab9
UD
587 struct link_map *new_map = _dl_map_object (NULL, p, 1,
588 lt_library, 0);
bd355af0
UD
589 if (new_map->l_opencount == 1)
590 /* It is no duplicate. */
591 ++npreloads;
14bab8de
UD
592 }
593
594 /* We don't need the file anymore. */
595 __munmap (file, file_size);
596 }
597
14bab8de
UD
598 if (npreloads != 0)
599 {
600 /* Set up PRELOADS with a vector of the preloaded libraries. */
601 struct link_map *l;
14bab8de
UD
602 preloads = __alloca (npreloads * sizeof preloads[0]);
603 l = _dl_rtld_map.l_next; /* End of the chain before preloads. */
604 i = 0;
605 do
606 {
607 preloads[i++] = l;
608 l = l->l_next;
609 } while (l);
610 assert (i == npreloads);
611 }
612
2064087b
RM
613 /* Load all the libraries specified by DT_NEEDED entries. If LD_PRELOAD
614 specified some libraries to load, these are inserted before the actual
615 dependencies in the executable's searchlist for symbol resolution. */
ceb2d9aa 616 _dl_map_object_deps (main_map, preloads, npreloads, mode == trace);
d66e34cd 617
2064087b 618#ifndef MAP_ANON
f332db02
RM
619 /* We are done mapping things, so close the zero-fill descriptor. */
620 __close (_dl_zerofd);
621 _dl_zerofd = -1;
2064087b 622#endif
f332db02 623
f9496a7b
RM
624 /* Remove _dl_rtld_map from the chain. */
625 _dl_rtld_map.l_prev->l_next = _dl_rtld_map.l_next;
626 if (_dl_rtld_map.l_next)
627 _dl_rtld_map.l_next->l_prev = _dl_rtld_map.l_prev;
628
629 if (_dl_rtld_map.l_opencount)
0200214b 630 {
f9496a7b
RM
631 /* Some DT_NEEDED entry referred to the interpreter object itself, so
632 put it back in the list of visible objects. We insert it into the
633 chain in symbol search order because gdb uses the chain's order as
634 its symbol search order. */
77aba05b 635 i = 1;
ceb2d9aa 636 while (main_map->l_searchlist[i] != &_dl_rtld_map)
f9496a7b 637 ++i;
ceb2d9aa
UD
638 _dl_rtld_map.l_prev = main_map->l_searchlist[i - 1];
639 _dl_rtld_map.l_next = (i + 1 < main_map->l_nsearchlist ?
640 main_map->l_searchlist[i + 1] : NULL);
f9496a7b
RM
641 assert (_dl_rtld_map.l_prev->l_next == _dl_rtld_map.l_next);
642 _dl_rtld_map.l_prev->l_next = &_dl_rtld_map;
4d02a5b1 643 if (_dl_rtld_map.l_next)
f9496a7b
RM
644 {
645 assert (_dl_rtld_map.l_next->l_prev == _dl_rtld_map.l_prev);
646 _dl_rtld_map.l_next->l_prev = &_dl_rtld_map;
647 }
0200214b 648 }
d66e34cd 649
c84142e8
UD
650 /* Now let us see whether all libraries are available in the
651 versions we need. */
652 {
993b3242
UD
653 struct version_check_args args;
654 args.doexit = mode == normal;
655 args.main_map = main_map;
656 _dl_receive_error (print_missing_version, version_check_doit, &args);
c84142e8
UD
657 }
658
2de99474 659 if (mode != normal)
0200214b
RM
660 {
661 /* We were run just to list the shared libraries. It is
662 important that we do this before real relocation, because the
663 functions we call below for output may no longer work properly
664 after relocation. */
0200214b
RM
665 if (! _dl_loaded->l_info[DT_NEEDED])
666 _dl_sysdep_message ("\t", "statically linked\n", NULL);
667 else
ceb2d9aa
UD
668 {
669 struct link_map *l;
670
671 for (l = _dl_loaded->l_next; l; l = l->l_next)
672 if (l->l_opencount == 0)
673 /* The library was not found. */
674 _dl_sysdep_message ("\t", l->l_libname->name, " => not found\n",
675 NULL);
676 else
677 {
678 char buf[20], *bp;
679 buf[sizeof buf - 1] = '\0';
af6f3906 680 bp = _itoa_word (l->l_addr, &buf[sizeof buf - 1], 16, 0);
ceb2d9aa
UD
681 while ((size_t) (&buf[sizeof buf - 1] - bp)
682 < sizeof l->l_addr * 2)
683 *--bp = '0';
684 _dl_sysdep_message ("\t", l->l_libname->name, " => ",
685 l->l_name, " (0x", bp, ")\n", NULL);
686 }
687 }
1a3a58fd 688
2de99474 689 if (mode != trace)
cddcfecf
RM
690 for (i = 1; i < _dl_argc; ++i)
691 {
692 const ElfW(Sym) *ref = NULL;
693 ElfW(Addr) loadbase = _dl_lookup_symbol (_dl_argv[i], &ref,
694 &_dl_default_scope[2],
dcf0671d 695 "argument",
a2b08ee5 696 ELF_MACHINE_JMP_SLOT);
cddcfecf
RM
697 char buf[20], *bp;
698 buf[sizeof buf - 1] = '\0';
af6f3906 699 bp = _itoa_word (ref->st_value, &buf[sizeof buf - 1], 16, 0);
14bab8de 700 while ((size_t) (&buf[sizeof buf - 1] - bp) < sizeof loadbase * 2)
cddcfecf
RM
701 *--bp = '0';
702 _dl_sysdep_message (_dl_argv[i], " found at 0x", bp, NULL);
703 buf[sizeof buf - 1] = '\0';
af6f3906 704 bp = _itoa_word (loadbase, &buf[sizeof buf - 1], 16, 0);
14bab8de 705 while ((size_t) (&buf[sizeof buf - 1] - bp) < sizeof loadbase * 2)
cddcfecf
RM
706 *--bp = '0';
707 _dl_sysdep_message (" in object at 0x", bp, "\n", NULL);
708 }
ce37fa88 709 else
fd26970f 710 {
ce37fa88
UD
711 if (lazy >= 0)
712 {
713 /* We have to do symbol dependency testing. */
714 struct relocate_args args;
715 struct link_map *l;
993b3242 716
ce37fa88 717 args.lazy = lazy;
fd26970f 718
ce37fa88
UD
719 l = _dl_loaded;
720 while (l->l_next)
721 l = l->l_next;
722 do
723 {
724 if (l != &_dl_rtld_map && l->l_opencount > 0)
725 {
726 args.l = l;
727 _dl_receive_error (print_unresolved, relocate_doit,
728 &args);
729 *_dl_global_scope_end = NULL;
730 }
731 l = l->l_prev;
732 } while (l);
733 }
734
735#define VERNEEDTAG (DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (DT_VERNEED))
120b4c49 736 if (version_info)
fd26970f 737 {
ce37fa88
UD
738 /* Print more information. This means here, print information
739 about the versions needed. */
740 int first = 1;
741 struct link_map *map = _dl_loaded;
742
743 for (map = _dl_loaded; map != NULL; map = map->l_next)
fd26970f 744 {
f41c8091 745 const char *strtab;
ce37fa88 746 ElfW(Dyn) *dyn = map->l_info[VERNEEDTAG];
f41c8091
UD
747 ElfW(Verneed) *ent;
748
749 if (dyn == NULL)
750 continue;
751
752 strtab = (const char *)
753 (map->l_addr + map->l_info[DT_STRTAB]->d_un.d_ptr);
754 ent = (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
ce37fa88 755
f41c8091 756 if (first)
ce37fa88 757 {
f41c8091
UD
758 _dl_sysdep_message ("\n\tVersion information:\n", NULL);
759 first = 0;
760 }
ce37fa88 761
f41c8091
UD
762 _dl_sysdep_message ("\t", (map->l_name[0]
763 ? map->l_name : _dl_argv[0]),
764 ":\n", NULL);
765
766 while (1)
767 {
768 ElfW(Vernaux) *aux;
769 struct link_map *needed;
ce37fa88 770
f41c8091
UD
771 needed = find_needed (strtab + ent->vn_file);
772 aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
ce37fa88
UD
773
774 while (1)
775 {
f41c8091
UD
776 const char *fname = NULL;
777
778 _dl_sysdep_message ("\t\t",
779 strtab + ent->vn_file,
780 " (", strtab + aux->vna_name,
781 ") ",
782 (aux->vna_flags
783 & VER_FLG_WEAK
784 ? "[WEAK] " : ""),
785 "=> ", NULL);
786
787 if (needed != NULL
788 && match_version (strtab+aux->vna_name, needed))
789 fname = needed->l_name;
790
791 _dl_sysdep_message (fname ?: "not found", "\n",
792 NULL);
ce37fa88 793
f41c8091
UD
794 if (aux->vna_next == 0)
795 /* No more symbols. */
ce37fa88
UD
796 break;
797
f41c8091
UD
798 /* Next symbol. */
799 aux = (ElfW(Vernaux) *) ((char *) aux
800 + aux->vna_next);
ce37fa88 801 }
f41c8091
UD
802
803 if (ent->vn_next == 0)
804 /* No more dependencies. */
805 break;
806
807 /* Next dependency. */
808 ent = (ElfW(Verneed) *) ((char *) ent + ent->vn_next);
ce37fa88 809 }
fd26970f 810 }
ce37fa88 811 }
fd26970f 812 }
d66e34cd 813
0200214b
RM
814 _exit (0);
815 }
86d2c878 816
ba79d61b
RM
817 {
818 /* Now we have all the objects loaded. Relocate them all except for
819 the dynamic linker itself. We do this in reverse order so that copy
820 relocs of earlier objects overwrite the data written by later
821 objects. We do not re-relocate the dynamic linker itself in this
822 loop because that could result in the GOT entries for functions we
823 call being changed, and that would break us. It is safe to relocate
824 the dynamic linker out of order because it has no copy relocs (we
825 know that because it is self-contained). */
826
ceb2d9aa 827 struct link_map *l;
ba79d61b
RM
828 l = _dl_loaded;
829 while (l->l_next)
830 l = l->l_next;
831 do
832 {
833 if (l != &_dl_rtld_map)
834 {
835 _dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
836 *_dl_global_scope_end = NULL;
837 }
838 l = l->l_prev;
839 } while (l);
840
841 /* Do any necessary cleanups for the startup OS interface code.
842 We do these now so that no calls are made after rtld re-relocation
843 which might be resolved to different functions than we expect.
844 We cannot do this before relocating the other objects because
845 _dl_relocate_object might need to call `mprotect' for DT_TEXTREL. */
846 _dl_sysdep_start_cleanup ();
847
848 if (_dl_rtld_map.l_opencount > 0)
849 /* There was an explicit ref to the dynamic linker as a shared lib.
850 Re-relocate ourselves with user-controlled symbol definitions. */
851 _dl_relocate_object (&_dl_rtld_map, &_dl_default_scope[2], 0);
852 }
ac16e905 853
4d6acc61
RM
854 {
855 /* Initialize _r_debug. */
856 struct r_debug *r = _dl_debug_initialize (_dl_rtld_map.l_addr);
ceb2d9aa 857 struct link_map *l;
4d6acc61
RM
858
859 l = _dl_loaded;
ec42724d
RM
860
861#ifdef ELF_MACHINE_DEBUG_SETUP
862
863 /* Some machines (e.g. MIPS) don't use DT_DEBUG in this way. */
864
865 ELF_MACHINE_DEBUG_SETUP (l, r);
866 ELF_MACHINE_DEBUG_SETUP (&_dl_rtld_map, r);
867
868#else
869
4d6acc61
RM
870 if (l->l_info[DT_DEBUG])
871 /* There is a DT_DEBUG entry in the dynamic section. Fill it in
872 with the run-time address of the r_debug structure */
873 l->l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r;
874
d746b89c
RM
875 /* Fill in the pointer in the dynamic linker's own dynamic section, in
876 case you run gdb on the dynamic linker directly. */
877 if (_dl_rtld_map.l_info[DT_DEBUG])
878 _dl_rtld_map.l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r;
879
ec42724d
RM
880#endif
881
4d6acc61
RM
882 /* Notify the debugger that all objects are now mapped in. */
883 r->r_state = RT_ADD;
884 _dl_debug_state ();
885 }
0200214b 886
3996f34b
UD
887 /* Now enable profiling if needed. */
888 if (_dl_profile_map != NULL)
889 /* We must prepare the profiling. */
890 _dl_start_profile (_dl_profile_map, _dl_profile_output);
891
d66e34cd
RM
892 /* Once we return, _dl_sysdep_start will invoke
893 the DT_INIT functions and then *USER_ENTRY. */
894}
fd26970f
UD
895\f
896/* This is a little helper function for resolving symbols while
897 tracing the binary. */
898static void
c84142e8
UD
899print_unresolved (int errcode __attribute__ ((unused)), const char *objname,
900 const char *errstring)
fd26970f 901{
3996f34b
UD
902 if (objname[0] == '\0')
903 objname = _dl_argv[0] ?: "<main program>";
fd26970f
UD
904 _dl_sysdep_error (errstring, " (", objname, ")\n", NULL);
905}
c84142e8
UD
906\f
907/* This is a little helper function for resolving symbols while
908 tracing the binary. */
909static void
910print_missing_version (int errcode __attribute__ ((unused)),
911 const char *objname, const char *errstring)
912{
913 _dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>", ": ",
914 objname, ": ", errstring, "\n", NULL);
915}
ea278354 916\f
7dea968e
UD
917/* Nonzero if any of the debugging options is enabled. */
918static int any_debug;
919
b5efde2f
UD
920/* Process the string given as the parameter which explains which debugging
921 options are enabled. */
922static void
923process_dl_debug (char *dl_debug)
924{
925 do
926 {
927#define issep(Ch) ((Ch) == ' ' || (Ch) == ',')
928 /* Skip separating white spaces and commas. */
929 while (issep (*dl_debug))
930 ++dl_debug;
931 if (*dl_debug != '\0')
932 {
8193034b
UD
933 if (strncmp (dl_debug, "files", 5) == 0
934 && (issep (dl_debug[5]) || dl_debug[5] == '\0'))
0c367d92 935 {
8193034b 936 _dl_debug_files = 1;
0c367d92
UD
937 _dl_debug_impcalls = 1;
938 any_debug = 1;
8193034b 939 dl_debug += 5;
0c367d92 940 }
8193034b
UD
941 else if (strncmp (dl_debug, "bindings", 8) == 0
942 && (issep (dl_debug[8]) || dl_debug[8] == '\0'))
b5efde2f 943 {
8193034b 944 _dl_debug_bindings = 1;
7dea968e
UD
945 _dl_debug_impcalls = 1;
946 any_debug = 1;
8193034b 947 dl_debug += 8;
b5efde2f
UD
948 }
949 else if (strncmp (dl_debug, "help", 4) == 0
950 && (issep (dl_debug[4]) || dl_debug[4] == '\0'))
951 {
952 _dl_sysdep_message ("\
08b511e6 953Valid options for the LD_DEBUG environment variable are:\n\
b5efde2f 954\n\
0c367d92 955 bindings display information about symbol binding\n\
8193034b 956 files display processing of files and libraries\n\
0c367d92
UD
957 help display this help message and exit\n\
958 libs display library search paths\n\
8193034b 959 reloc display relocation processing\n\
de100ca7 960 symbols display symbol table processing\n\
8193034b 961 versions display version dependencies\n\
0c367d92
UD
962\n\
963To direct the debugging output into a file instead of standard output\n\
964a filename can be specified using the LD_DEBUG_OUTPUT environment variable.\n",
965 NULL);
b5efde2f
UD
966 _exit (0);
967 }
8193034b
UD
968 else if (strncmp (dl_debug, "libs", 4) == 0
969 && (issep (dl_debug[4]) || dl_debug[4] == '\0'))
970 {
971 _dl_debug_libs = 1;
972 _dl_debug_impcalls = 1;
973 any_debug = 1;
974 dl_debug += 4;
975 }
976 else if (strncmp (dl_debug, "reloc", 4) == 0
977 && (issep (dl_debug[5]) || dl_debug[5] == '\0'))
978 {
979 _dl_debug_reloc = 1;
980 _dl_debug_impcalls = 1;
981 any_debug = 1;
982 dl_debug += 5;
983 }
de100ca7
UD
984 else if (strncmp (dl_debug, "symbols", 7) == 0
985 && (issep (dl_debug[7]) || dl_debug[7] == '\0'))
986 {
987 _dl_debug_symbols = 1;
988 _dl_debug_impcalls = 1;
989 any_debug = 1;
990 dl_debug += 7;
991 }
8193034b
UD
992 else if (strncmp (dl_debug, "versions", 8) == 0
993 && (issep (dl_debug[8]) || dl_debug[8] == '\0'))
994 {
995 _dl_debug_versions = 1;
996 _dl_debug_impcalls = 1;
997 any_debug = 1;
998 dl_debug += 8;
999 }
b5efde2f 1000 else
77aba05b
UD
1001 {
1002 /* Display a warning and skip everything until next
1003 separator. */
1004 char *startp = dl_debug;
1005
1006 do
1007 ++dl_debug;
1008 while (*dl_debug != '\0' && !issep (*dl_debug));
1009
1010 startp = strndupa (startp, dl_debug - startp);
1011 _dl_sysdep_error ("warning: debug option `", startp,
1012 "' unknown; try LD_DEBUG=help\n", NULL);
1013
1014 }
b5efde2f
UD
1015 }
1016 }
1017 while (*dl_debug != '\0');
1018}
1019\f
ea278354
UD
1020/* Process all environments variables the dynamic linker must recognize.
1021 Since all of them start with `LD_' we are a bit smarter while finding
1022 all the entries. */
1023static void
1024process_envvars (enum mode *modep, int *lazyp)
1025{
1026 char **runp = NULL;
1027 char *envline;
1028 enum mode mode = normal;
1029 int bind_now = 0;
7dea968e 1030 char *debug_output = NULL;
ea278354
UD
1031
1032 /* This is the default place for profiling data file. */
1033 _dl_profile_output = "/var/tmp";
1034
1035 while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
1036 {
1037 int result;
1038
1039 /* Do we bind early? */
1040 result = strncmp (&envline[3], "BIND_NOW=", 9);
1041 if (result == 0)
1042 {
1043 bind_now = 1;
1044 continue;
1045 }
1046 if (result < 0)
1047 continue;
1048
b5efde2f
UD
1049 /* Debugging of the dynamic linker? */
1050 result = strncmp (&envline[3], "DEBUG=", 6);
1051 if (result == 0)
1052 {
1053 process_dl_debug (&envline[9]);
1054 continue;
1055 }
1056 if (result < 0)
1057 continue;
1058
7dea968e
UD
1059 /* Where to place the profiling data file. */
1060 result = strncmp (&envline[3], "DEBUG_OUTPUT=", 13);
1061 if (result == 0)
1062 {
1063 debug_output = &envline[16];
1064 continue;
1065 }
1066 if (result < 0)
1067 continue;
1068
120b4c49
UD
1069 /* The library search path. */
1070 result = strncmp (&envline[3], "LIBRARY_PATH=", 13);
1071 if (result == 0)
1072 {
1073 library_path = &envline[16];
1074 continue;
1075 }
1076 if (result < 0)
1077 continue;
1078
1079 /* List of objects to be preloaded. */
1080 result = strncmp (&envline[3], "PRELOAD=", 8);
1081 if (result == 0)
1082 {
1083 preloadlist = &envline[11];
1084 continue;
1085 }
1086 if (result < 0)
1087 continue;
1088
ea278354
UD
1089 /* Which shared object shall be profiled. */
1090 result = strncmp (&envline[3], "PROFILE=", 8);
1091 if (result == 0)
1092 {
1093 _dl_profile = &envline[11];
1094 if (*_dl_profile == '\0')
1095 _dl_profile = NULL;
1096 continue;
1097 }
1098 if (result < 0)
1099 continue;
1100
1101 /* Where to place the profiling data file. */
1102 result = strncmp (&envline[3], "PROFILE_OUTPUT=", 15);
1103 if (result == 0)
1104 {
1105 _dl_profile_output = &envline[18];
1106 if (*_dl_profile_output == '\0')
1107 _dl_profile_output = "/var/tmp";
1108 continue;
1109 }
1110 if (result < 0)
1111 continue;
1112
1113 /* Test whether we want to see the content of the auxiliary
1114 array passed up from the kernel. */
1115 result = strncmp (&envline[3], "SHOW_AUXV=", 10);
1116 if (result == 0)
1117 {
1118 _dl_show_auxv ();
1119 continue;
1120 }
1121 if (result < 0)
1122 continue;
1123
1124 /* The mode of the dynamic linker can be set. */
1125 result = strncmp (&envline[3], "TRACE_LOADED_OBJECTS=", 21);
1126 if (result == 0)
1127 {
1128 mode = trace;
1129 continue;
1130 }
1131 if (result < 0)
1132 continue;
1133
120b4c49
UD
1134 /* Print information about versions. */
1135 result = strncmp (&envline[3], "VERBOSE=", 8);
1136 if (result == 0)
1137 {
1138 version_info = envline[11] != '\0';
1139 continue;
1140 }
1141 if (result < 0)
1142 continue;
1143
ea278354
UD
1144 /* Warning level, verbose or not. */
1145 result = strncmp (&envline[3], "WARN=", 5);
1146 if (result == 0)
1147 {
1148 _dl_verbose = envline[8] != '\0';
1149 continue;
1150 }
1151 }
1152
7dea968e
UD
1153 /* If we have to run the dynamic linker in debugging mode and the
1154 LD_DEBUG_OUTPUT environment variable is given, we write the debug
1155 messages to this file. */
1156 if (any_debug && debug_output != NULL)
1157 {
1158 _dl_debug_fd = __open (debug_output, O_WRONLY | O_APPEND | O_CREAT,
1159 0666);
1160 if (_dl_debug_fd == -1)
1161 /* We use standard output if opening the file failed. */
1162 _dl_debug_fd = STDOUT_FILENO;
1163 }
1164
ea278354
UD
1165 /* LAZY is determined by the environment variable LD_WARN and
1166 LD_BIND_NOW if we trace the binary. */
1167 if (mode == trace)
1168 *lazyp = _dl_verbose ? !bind_now : -1;
1169 else
1170 *lazyp = !__libc_enable_secure && !bind_now;
1171
1172 *modep = mode;
1173}
This page took 0.197772 seconds and 5 git commands to generate.