]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - libexec/rtld-elf/rtld.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / libexec / rtld-elf / rtld.c
1 /*-
2  * Copyright 1996, 1997, 1998, 1999, 2000 John D. Polstra.
3  * Copyright 2003 Alexander Kabaev <kan@FreeBSD.ORG>.
4  * Copyright 2009-2012 Konstantin Belousov <kib@FreeBSD.ORG>.
5  * Copyright 2012 John Marino <draco@marino.st>.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 /*
32  * Dynamic linker for ELF.
33  *
34  * John Polstra <jdp@polstra.com>.
35  */
36
37 #ifndef __GNUC__
38 #error "GCC is needed to compile this file"
39 #endif
40
41 #include <sys/param.h>
42 #include <sys/mount.h>
43 #include <sys/mman.h>
44 #include <sys/stat.h>
45 #include <sys/sysctl.h>
46 #include <sys/uio.h>
47 #include <sys/utsname.h>
48 #include <sys/ktrace.h>
49
50 #include <dlfcn.h>
51 #include <err.h>
52 #include <errno.h>
53 #include <fcntl.h>
54 #include <stdarg.h>
55 #include <stdio.h>
56 #include <stdlib.h>
57 #include <string.h>
58 #include <unistd.h>
59
60 #include "debug.h"
61 #include "rtld.h"
62 #include "libmap.h"
63 #include "rtld_tls.h"
64 #include "rtld_printf.h"
65 #include "notes.h"
66
67 #ifndef COMPAT_32BIT
68 #define PATH_RTLD       "/libexec/ld-elf.so.1"
69 #else
70 #define PATH_RTLD       "/libexec/ld-elf32.so.1"
71 #endif
72
73 /* Types. */
74 typedef void (*func_ptr_type)();
75 typedef void * (*path_enum_proc) (const char *path, size_t len, void *arg);
76
77 /*
78  * Function declarations.
79  */
80 static const char *basename(const char *);
81 static void die(void) __dead2;
82 static void digest_dynamic1(Obj_Entry *, int, const Elf_Dyn **,
83     const Elf_Dyn **, const Elf_Dyn **);
84 static void digest_dynamic2(Obj_Entry *, const Elf_Dyn *, const Elf_Dyn *,
85     const Elf_Dyn *);
86 static void digest_dynamic(Obj_Entry *, int);
87 static Obj_Entry *digest_phdr(const Elf_Phdr *, int, caddr_t, const char *);
88 static Obj_Entry *dlcheck(void *);
89 static Obj_Entry *dlopen_object(const char *name, int fd, Obj_Entry *refobj,
90     int lo_flags, int mode, RtldLockState *lockstate);
91 static Obj_Entry *do_load_object(int, const char *, char *, struct stat *, int);
92 static int do_search_info(const Obj_Entry *obj, int, struct dl_serinfo *);
93 static bool donelist_check(DoneList *, const Obj_Entry *);
94 static void errmsg_restore(char *);
95 static char *errmsg_save(void);
96 static void *fill_search_info(const char *, size_t, void *);
97 static char *find_library(const char *, const Obj_Entry *);
98 static const char *gethints(bool);
99 static void init_dag(Obj_Entry *);
100 static void init_rtld(caddr_t, Elf_Auxinfo **);
101 static void initlist_add_neededs(Needed_Entry *, Objlist *);
102 static void initlist_add_objects(Obj_Entry *, Obj_Entry **, Objlist *);
103 static void linkmap_add(Obj_Entry *);
104 static void linkmap_delete(Obj_Entry *);
105 static void load_filtees(Obj_Entry *, int flags, RtldLockState *);
106 static void unload_filtees(Obj_Entry *);
107 static int load_needed_objects(Obj_Entry *, int);
108 static int load_preload_objects(void);
109 static Obj_Entry *load_object(const char *, int fd, const Obj_Entry *, int);
110 static void map_stacks_exec(RtldLockState *);
111 static Obj_Entry *obj_from_addr(const void *);
112 static void objlist_call_fini(Objlist *, Obj_Entry *, RtldLockState *);
113 static void objlist_call_init(Objlist *, RtldLockState *);
114 static void objlist_clear(Objlist *);
115 static Objlist_Entry *objlist_find(Objlist *, const Obj_Entry *);
116 static void objlist_init(Objlist *);
117 static void objlist_push_head(Objlist *, Obj_Entry *);
118 static void objlist_push_tail(Objlist *, Obj_Entry *);
119 static void objlist_put_after(Objlist *, Obj_Entry *, Obj_Entry *);
120 static void objlist_remove(Objlist *, Obj_Entry *);
121 static void *path_enumerate(const char *, path_enum_proc, void *);
122 static int relocate_object_dag(Obj_Entry *root, bool bind_now,
123     Obj_Entry *rtldobj, int flags, RtldLockState *lockstate);
124 static int relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj,
125     int flags, RtldLockState *lockstate);
126 static int relocate_objects(Obj_Entry *, bool, Obj_Entry *, int,
127     RtldLockState *);
128 static int resolve_objects_ifunc(Obj_Entry *first, bool bind_now,
129     int flags, RtldLockState *lockstate);
130 static int rtld_dirname(const char *, char *);
131 static int rtld_dirname_abs(const char *, char *);
132 static void *rtld_dlopen(const char *name, int fd, int mode);
133 static void rtld_exit(void);
134 static char *search_library_path(const char *, const char *);
135 static const void **get_program_var_addr(const char *, RtldLockState *);
136 static void set_program_var(const char *, const void *);
137 static int symlook_default(SymLook *, const Obj_Entry *refobj);
138 static int symlook_global(SymLook *, DoneList *);
139 static void symlook_init_from_req(SymLook *, const SymLook *);
140 static int symlook_list(SymLook *, const Objlist *, DoneList *);
141 static int symlook_needed(SymLook *, const Needed_Entry *, DoneList *);
142 static int symlook_obj1_sysv(SymLook *, const Obj_Entry *);
143 static int symlook_obj1_gnu(SymLook *, const Obj_Entry *);
144 static void trace_loaded_objects(Obj_Entry *);
145 static void unlink_object(Obj_Entry *);
146 static void unload_object(Obj_Entry *);
147 static void unref_dag(Obj_Entry *);
148 static void ref_dag(Obj_Entry *);
149 static char *origin_subst_one(char *, const char *, const char *, bool);
150 static char *origin_subst(char *, const char *);
151 static void preinit_main(void);
152 static int  rtld_verify_versions(const Objlist *);
153 static int  rtld_verify_object_versions(Obj_Entry *);
154 static void object_add_name(Obj_Entry *, const char *);
155 static int  object_match_name(const Obj_Entry *, const char *);
156 static void ld_utrace_log(int, void *, void *, size_t, int, const char *);
157 static void rtld_fill_dl_phdr_info(const Obj_Entry *obj,
158     struct dl_phdr_info *phdr_info);
159 static uint32_t gnu_hash(const char *);
160 static bool matched_symbol(SymLook *, const Obj_Entry *, Sym_Match_Result *,
161     const unsigned long);
162
163 void r_debug_state(struct r_debug *, struct link_map *) __noinline;
164
165 /*
166  * Data declarations.
167  */
168 static char *error_message;     /* Message for dlerror(), or NULL */
169 struct r_debug r_debug;         /* for GDB; */
170 static bool libmap_disable;     /* Disable libmap */
171 static bool ld_loadfltr;        /* Immediate filters processing */
172 static char *libmap_override;   /* Maps to use in addition to libmap.conf */
173 static bool trust;              /* False for setuid and setgid programs */
174 static bool dangerous_ld_env;   /* True if environment variables have been
175                                    used to affect the libraries loaded */
176 static char *ld_bind_now;       /* Environment variable for immediate binding */
177 static char *ld_debug;          /* Environment variable for debugging */
178 static char *ld_library_path;   /* Environment variable for search path */
179 static char *ld_preload;        /* Environment variable for libraries to
180                                    load first */
181 static char *ld_elf_hints_path; /* Environment variable for alternative hints path */
182 static char *ld_tracing;        /* Called from ldd to print libs */
183 static char *ld_utrace;         /* Use utrace() to log events. */
184 static Obj_Entry *obj_list;     /* Head of linked list of shared objects */
185 static Obj_Entry **obj_tail;    /* Link field of last object in list */
186 static Obj_Entry *obj_main;     /* The main program shared object */
187 static Obj_Entry obj_rtld;      /* The dynamic linker shared object */
188 static unsigned int obj_count;  /* Number of objects in obj_list */
189 static unsigned int obj_loads;  /* Number of objects in obj_list */
190
191 static Objlist list_global =    /* Objects dlopened with RTLD_GLOBAL */
192   STAILQ_HEAD_INITIALIZER(list_global);
193 static Objlist list_main =      /* Objects loaded at program startup */
194   STAILQ_HEAD_INITIALIZER(list_main);
195 static Objlist list_fini =      /* Objects needing fini() calls */
196   STAILQ_HEAD_INITIALIZER(list_fini);
197
198 Elf_Sym sym_zero;               /* For resolving undefined weak refs. */
199
200 #define GDB_STATE(s,m)  r_debug.r_state = s; r_debug_state(&r_debug,m);
201
202 extern Elf_Dyn _DYNAMIC;
203 #pragma weak _DYNAMIC
204 #ifndef RTLD_IS_DYNAMIC
205 #define RTLD_IS_DYNAMIC()       (&_DYNAMIC != NULL)
206 #endif
207
208 int osreldate, pagesize;
209
210 long __stack_chk_guard[8] = {0, 0, 0, 0, 0, 0, 0, 0};
211
212 static int stack_prot = PROT_READ | PROT_WRITE | RTLD_DEFAULT_STACK_EXEC;
213 static int max_stack_flags;
214
215 /*
216  * Global declarations normally provided by crt1.  The dynamic linker is
217  * not built with crt1, so we have to provide them ourselves.
218  */
219 char *__progname;
220 char **environ;
221
222 /*
223  * Used to pass argc, argv to init functions.
224  */
225 int main_argc;
226 char **main_argv;
227
228 /*
229  * Globals to control TLS allocation.
230  */
231 size_t tls_last_offset;         /* Static TLS offset of last module */
232 size_t tls_last_size;           /* Static TLS size of last module */
233 size_t tls_static_space;        /* Static TLS space allocated */
234 int tls_dtv_generation = 1;     /* Used to detect when dtv size changes  */
235 int tls_max_index = 1;          /* Largest module index allocated */
236
237 bool ld_library_path_rpath = false;
238
239 /*
240  * Fill in a DoneList with an allocation large enough to hold all of
241  * the currently-loaded objects.  Keep this as a macro since it calls
242  * alloca and we want that to occur within the scope of the caller.
243  */
244 #define donelist_init(dlp)                                      \
245     ((dlp)->objs = alloca(obj_count * sizeof (dlp)->objs[0]),   \
246     assert((dlp)->objs != NULL),                                \
247     (dlp)->num_alloc = obj_count,                               \
248     (dlp)->num_used = 0)
249
250 #define UTRACE_DLOPEN_START             1
251 #define UTRACE_DLOPEN_STOP              2
252 #define UTRACE_DLCLOSE_START            3
253 #define UTRACE_DLCLOSE_STOP             4
254 #define UTRACE_LOAD_OBJECT              5
255 #define UTRACE_UNLOAD_OBJECT            6
256 #define UTRACE_ADD_RUNDEP               7
257 #define UTRACE_PRELOAD_FINISHED         8
258 #define UTRACE_INIT_CALL                9
259 #define UTRACE_FINI_CALL                10
260
261 struct utrace_rtld {
262         char sig[4];                    /* 'RTLD' */
263         int event;
264         void *handle;
265         void *mapbase;                  /* Used for 'parent' and 'init/fini' */
266         size_t mapsize;
267         int refcnt;                     /* Used for 'mode' */
268         char name[MAXPATHLEN];
269 };
270
271 #define LD_UTRACE(e, h, mb, ms, r, n) do {                      \
272         if (ld_utrace != NULL)                                  \
273                 ld_utrace_log(e, h, mb, ms, r, n);              \
274 } while (0)
275
276 static void
277 ld_utrace_log(int event, void *handle, void *mapbase, size_t mapsize,
278     int refcnt, const char *name)
279 {
280         struct utrace_rtld ut;
281
282         ut.sig[0] = 'R';
283         ut.sig[1] = 'T';
284         ut.sig[2] = 'L';
285         ut.sig[3] = 'D';
286         ut.event = event;
287         ut.handle = handle;
288         ut.mapbase = mapbase;
289         ut.mapsize = mapsize;
290         ut.refcnt = refcnt;
291         bzero(ut.name, sizeof(ut.name));
292         if (name)
293                 strlcpy(ut.name, name, sizeof(ut.name));
294         utrace(&ut, sizeof(ut));
295 }
296
297 /*
298  * Main entry point for dynamic linking.  The first argument is the
299  * stack pointer.  The stack is expected to be laid out as described
300  * in the SVR4 ABI specification, Intel 386 Processor Supplement.
301  * Specifically, the stack pointer points to a word containing
302  * ARGC.  Following that in the stack is a null-terminated sequence
303  * of pointers to argument strings.  Then comes a null-terminated
304  * sequence of pointers to environment strings.  Finally, there is a
305  * sequence of "auxiliary vector" entries.
306  *
307  * The second argument points to a place to store the dynamic linker's
308  * exit procedure pointer and the third to a place to store the main
309  * program's object.
310  *
311  * The return value is the main program's entry point.
312  */
313 func_ptr_type
314 _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
315 {
316     Elf_Auxinfo *aux_info[AT_COUNT];
317     int i;
318     int argc;
319     char **argv;
320     char **env;
321     Elf_Auxinfo *aux;
322     Elf_Auxinfo *auxp;
323     const char *argv0;
324     Objlist_Entry *entry;
325     Obj_Entry *obj;
326     Obj_Entry **preload_tail;
327     Obj_Entry *last_interposer;
328     Objlist initlist;
329     RtldLockState lockstate;
330     char *library_path_rpath;
331     int mib[2];
332     size_t len;
333
334     /*
335      * On entry, the dynamic linker itself has not been relocated yet.
336      * Be very careful not to reference any global data until after
337      * init_rtld has returned.  It is OK to reference file-scope statics
338      * and string constants, and to call static and global functions.
339      */
340
341     /* Find the auxiliary vector on the stack. */
342     argc = *sp++;
343     argv = (char **) sp;
344     sp += argc + 1;     /* Skip over arguments and NULL terminator */
345     env = (char **) sp;
346     while (*sp++ != 0)  /* Skip over environment, and NULL terminator */
347         ;
348     aux = (Elf_Auxinfo *) sp;
349
350     /* Digest the auxiliary vector. */
351     for (i = 0;  i < AT_COUNT;  i++)
352         aux_info[i] = NULL;
353     for (auxp = aux;  auxp->a_type != AT_NULL;  auxp++) {
354         if (auxp->a_type < AT_COUNT)
355             aux_info[auxp->a_type] = auxp;
356     }
357
358     /* Initialize and relocate ourselves. */
359     assert(aux_info[AT_BASE] != NULL);
360     init_rtld((caddr_t) aux_info[AT_BASE]->a_un.a_ptr, aux_info);
361
362     __progname = obj_rtld.path;
363     argv0 = argv[0] != NULL ? argv[0] : "(null)";
364     environ = env;
365     main_argc = argc;
366     main_argv = argv;
367
368     if (aux_info[AT_CANARY] != NULL &&
369         aux_info[AT_CANARY]->a_un.a_ptr != NULL) {
370             i = aux_info[AT_CANARYLEN]->a_un.a_val;
371             if (i > sizeof(__stack_chk_guard))
372                     i = sizeof(__stack_chk_guard);
373             memcpy(__stack_chk_guard, aux_info[AT_CANARY]->a_un.a_ptr, i);
374     } else {
375         mib[0] = CTL_KERN;
376         mib[1] = KERN_ARND;
377
378         len = sizeof(__stack_chk_guard);
379         if (sysctl(mib, 2, __stack_chk_guard, &len, NULL, 0) == -1 ||
380             len != sizeof(__stack_chk_guard)) {
381                 /* If sysctl was unsuccessful, use the "terminator canary". */
382                 ((unsigned char *)(void *)__stack_chk_guard)[0] = 0;
383                 ((unsigned char *)(void *)__stack_chk_guard)[1] = 0;
384                 ((unsigned char *)(void *)__stack_chk_guard)[2] = '\n';
385                 ((unsigned char *)(void *)__stack_chk_guard)[3] = 255;
386         }
387     }
388
389     trust = !issetugid();
390
391     ld_bind_now = getenv(LD_ "BIND_NOW");
392     /* 
393      * If the process is tainted, then we un-set the dangerous environment
394      * variables.  The process will be marked as tainted until setuid(2)
395      * is called.  If any child process calls setuid(2) we do not want any
396      * future processes to honor the potentially un-safe variables.
397      */
398     if (!trust) {
399         if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP") ||
400             unsetenv(LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||
401             unsetenv(LD_ "DEBUG") || unsetenv(LD_ "ELF_HINTS_PATH") ||
402             unsetenv(LD_ "LOADFLTR") || unsetenv(LD_ "LIBRARY_PATH_RPATH")) {
403                 _rtld_error("environment corrupt; aborting");
404                 die();
405         }
406     }
407     ld_debug = getenv(LD_ "DEBUG");
408     libmap_disable = getenv(LD_ "LIBMAP_DISABLE") != NULL;
409     libmap_override = getenv(LD_ "LIBMAP");
410     ld_library_path = getenv(LD_ "LIBRARY_PATH");
411     ld_preload = getenv(LD_ "PRELOAD");
412     ld_elf_hints_path = getenv(LD_ "ELF_HINTS_PATH");
413     ld_loadfltr = getenv(LD_ "LOADFLTR") != NULL;
414     library_path_rpath = getenv(LD_ "LIBRARY_PATH_RPATH");
415     if (library_path_rpath != NULL) {
416             if (library_path_rpath[0] == 'y' ||
417                 library_path_rpath[0] == 'Y' ||
418                 library_path_rpath[0] == '1')
419                     ld_library_path_rpath = true;
420             else
421                     ld_library_path_rpath = false;
422     }
423     dangerous_ld_env = libmap_disable || (libmap_override != NULL) ||
424         (ld_library_path != NULL) || (ld_preload != NULL) ||
425         (ld_elf_hints_path != NULL) || ld_loadfltr;
426     ld_tracing = getenv(LD_ "TRACE_LOADED_OBJECTS");
427     ld_utrace = getenv(LD_ "UTRACE");
428
429     if ((ld_elf_hints_path == NULL) || strlen(ld_elf_hints_path) == 0)
430         ld_elf_hints_path = _PATH_ELF_HINTS;
431
432     if (ld_debug != NULL && *ld_debug != '\0')
433         debug = 1;
434     dbg("%s is initialized, base address = %p", __progname,
435         (caddr_t) aux_info[AT_BASE]->a_un.a_ptr);
436     dbg("RTLD dynamic = %p", obj_rtld.dynamic);
437     dbg("RTLD pltgot  = %p", obj_rtld.pltgot);
438
439     dbg("initializing thread locks");
440     lockdflt_init();
441
442     /*
443      * Load the main program, or process its program header if it is
444      * already loaded.
445      */
446     if (aux_info[AT_EXECFD] != NULL) {  /* Load the main program. */
447         int fd = aux_info[AT_EXECFD]->a_un.a_val;
448         dbg("loading main program");
449         obj_main = map_object(fd, argv0, NULL);
450         close(fd);
451         if (obj_main == NULL)
452             die();
453         max_stack_flags = obj->stack_flags;
454     } else {                            /* Main program already loaded. */
455         const Elf_Phdr *phdr;
456         int phnum;
457         caddr_t entry;
458
459         dbg("processing main program's program header");
460         assert(aux_info[AT_PHDR] != NULL);
461         phdr = (const Elf_Phdr *) aux_info[AT_PHDR]->a_un.a_ptr;
462         assert(aux_info[AT_PHNUM] != NULL);
463         phnum = aux_info[AT_PHNUM]->a_un.a_val;
464         assert(aux_info[AT_PHENT] != NULL);
465         assert(aux_info[AT_PHENT]->a_un.a_val == sizeof(Elf_Phdr));
466         assert(aux_info[AT_ENTRY] != NULL);
467         entry = (caddr_t) aux_info[AT_ENTRY]->a_un.a_ptr;
468         if ((obj_main = digest_phdr(phdr, phnum, entry, argv0)) == NULL)
469             die();
470     }
471
472     if (aux_info[AT_EXECPATH] != 0) {
473             char *kexecpath;
474             char buf[MAXPATHLEN];
475
476             kexecpath = aux_info[AT_EXECPATH]->a_un.a_ptr;
477             dbg("AT_EXECPATH %p %s", kexecpath, kexecpath);
478             if (kexecpath[0] == '/')
479                     obj_main->path = kexecpath;
480             else if (getcwd(buf, sizeof(buf)) == NULL ||
481                      strlcat(buf, "/", sizeof(buf)) >= sizeof(buf) ||
482                      strlcat(buf, kexecpath, sizeof(buf)) >= sizeof(buf))
483                     obj_main->path = xstrdup(argv0);
484             else
485                     obj_main->path = xstrdup(buf);
486     } else {
487             dbg("No AT_EXECPATH");
488             obj_main->path = xstrdup(argv0);
489     }
490     dbg("obj_main path %s", obj_main->path);
491     obj_main->mainprog = true;
492
493     if (aux_info[AT_STACKPROT] != NULL &&
494       aux_info[AT_STACKPROT]->a_un.a_val != 0)
495             stack_prot = aux_info[AT_STACKPROT]->a_un.a_val;
496
497     /*
498      * Get the actual dynamic linker pathname from the executable if
499      * possible.  (It should always be possible.)  That ensures that
500      * gdb will find the right dynamic linker even if a non-standard
501      * one is being used.
502      */
503     if (obj_main->interp != NULL &&
504       strcmp(obj_main->interp, obj_rtld.path) != 0) {
505         free(obj_rtld.path);
506         obj_rtld.path = xstrdup(obj_main->interp);
507         __progname = obj_rtld.path;
508     }
509
510     digest_dynamic(obj_main, 0);
511     dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d",
512         obj_main->path, obj_main->valid_hash_sysv, obj_main->valid_hash_gnu,
513         obj_main->dynsymcount);
514
515     linkmap_add(obj_main);
516     linkmap_add(&obj_rtld);
517
518     /* Link the main program into the list of objects. */
519     *obj_tail = obj_main;
520     obj_tail = &obj_main->next;
521     obj_count++;
522     obj_loads++;
523
524     /* Initialize a fake symbol for resolving undefined weak references. */
525     sym_zero.st_info = ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE);
526     sym_zero.st_shndx = SHN_UNDEF;
527     sym_zero.st_value = -(uintptr_t)obj_main->relocbase;
528
529     if (!libmap_disable)
530         libmap_disable = (bool)lm_init(libmap_override);
531
532     dbg("loading LD_PRELOAD libraries");
533     if (load_preload_objects() == -1)
534         die();
535     preload_tail = obj_tail;
536
537     dbg("loading needed objects");
538     if (load_needed_objects(obj_main, 0) == -1)
539         die();
540
541     /* Make a list of all objects loaded at startup. */
542     last_interposer = obj_main;
543     for (obj = obj_list;  obj != NULL;  obj = obj->next) {
544         if (obj->z_interpose && obj != obj_main) {
545             objlist_put_after(&list_main, last_interposer, obj);
546             last_interposer = obj;
547         } else {
548             objlist_push_tail(&list_main, obj);
549         }
550         obj->refcount++;
551     }
552
553     dbg("checking for required versions");
554     if (rtld_verify_versions(&list_main) == -1 && !ld_tracing)
555         die();
556
557     if (ld_tracing) {           /* We're done */
558         trace_loaded_objects(obj_main);
559         exit(0);
560     }
561
562     if (getenv(LD_ "DUMP_REL_PRE") != NULL) {
563        dump_relocations(obj_main);
564        exit (0);
565     }
566
567     /*
568      * Processing tls relocations requires having the tls offsets
569      * initialized.  Prepare offsets before starting initial
570      * relocation processing.
571      */
572     dbg("initializing initial thread local storage offsets");
573     STAILQ_FOREACH(entry, &list_main, link) {
574         /*
575          * Allocate all the initial objects out of the static TLS
576          * block even if they didn't ask for it.
577          */
578         allocate_tls_offset(entry->obj);
579     }
580
581     if (relocate_objects(obj_main,
582       ld_bind_now != NULL && *ld_bind_now != '\0',
583       &obj_rtld, SYMLOOK_EARLY, NULL) == -1)
584         die();
585
586     dbg("doing copy relocations");
587     if (do_copy_relocations(obj_main) == -1)
588         die();
589
590     if (getenv(LD_ "DUMP_REL_POST") != NULL) {
591        dump_relocations(obj_main);
592        exit (0);
593     }
594
595     /*
596      * Setup TLS for main thread.  This must be done after the
597      * relocations are processed, since tls initialization section
598      * might be the subject for relocations.
599      */
600     dbg("initializing initial thread local storage");
601     allocate_initial_tls(obj_list);
602
603     dbg("initializing key program variables");
604     set_program_var("__progname", argv[0] != NULL ? basename(argv[0]) : "");
605     set_program_var("environ", env);
606     set_program_var("__elf_aux_vector", aux);
607
608     /* Make a list of init functions to call. */
609     objlist_init(&initlist);
610     initlist_add_objects(obj_list, preload_tail, &initlist);
611
612     r_debug_state(NULL, &obj_main->linkmap); /* say hello to gdb! */
613
614     map_stacks_exec(NULL);
615
616     dbg("resolving ifuncs");
617     if (resolve_objects_ifunc(obj_main,
618       ld_bind_now != NULL && *ld_bind_now != '\0', SYMLOOK_EARLY,
619       NULL) == -1)
620         die();
621
622     if (!obj_main->crt_no_init) {
623         /*
624          * Make sure we don't call the main program's init and fini
625          * functions for binaries linked with old crt1 which calls
626          * _init itself.
627          */
628         obj_main->init = obj_main->fini = (Elf_Addr)NULL;
629         obj_main->preinit_array = obj_main->init_array =
630             obj_main->fini_array = (Elf_Addr)NULL;
631     }
632
633     wlock_acquire(rtld_bind_lock, &lockstate);
634     if (obj_main->crt_no_init)
635         preinit_main();
636     objlist_call_init(&initlist, &lockstate);
637     objlist_clear(&initlist);
638     dbg("loading filtees");
639     for (obj = obj_list->next; obj != NULL; obj = obj->next) {
640         if (ld_loadfltr || obj->z_loadfltr)
641             load_filtees(obj, 0, &lockstate);
642     }
643     lock_release(rtld_bind_lock, &lockstate);
644
645     dbg("transferring control to program entry point = %p", obj_main->entry);
646
647     /* Return the exit procedure and the program entry point. */
648     *exit_proc = rtld_exit;
649     *objp = obj_main;
650     return (func_ptr_type) obj_main->entry;
651 }
652
653 void *
654 rtld_resolve_ifunc(const Obj_Entry *obj, const Elf_Sym *def)
655 {
656         void *ptr;
657         Elf_Addr target;
658
659         ptr = (void *)make_function_pointer(def, obj);
660         target = ((Elf_Addr (*)(void))ptr)();
661         return ((void *)target);
662 }
663
664 Elf_Addr
665 _rtld_bind(Obj_Entry *obj, Elf_Size reloff)
666 {
667     const Elf_Rel *rel;
668     const Elf_Sym *def;
669     const Obj_Entry *defobj;
670     Elf_Addr *where;
671     Elf_Addr target;
672     RtldLockState lockstate;
673
674     rlock_acquire(rtld_bind_lock, &lockstate);
675     if (sigsetjmp(lockstate.env, 0) != 0)
676             lock_upgrade(rtld_bind_lock, &lockstate);
677     if (obj->pltrel)
678         rel = (const Elf_Rel *) ((caddr_t) obj->pltrel + reloff);
679     else
680         rel = (const Elf_Rel *) ((caddr_t) obj->pltrela + reloff);
681
682     where = (Elf_Addr *) (obj->relocbase + rel->r_offset);
683     def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, true, NULL,
684         &lockstate);
685     if (def == NULL)
686         die();
687     if (ELF_ST_TYPE(def->st_info) == STT_GNU_IFUNC)
688         target = (Elf_Addr)rtld_resolve_ifunc(defobj, def);
689     else
690         target = (Elf_Addr)(defobj->relocbase + def->st_value);
691
692     dbg("\"%s\" in \"%s\" ==> %p in \"%s\"",
693       defobj->strtab + def->st_name, basename(obj->path),
694       (void *)target, basename(defobj->path));
695
696     /*
697      * Write the new contents for the jmpslot. Note that depending on
698      * architecture, the value which we need to return back to the
699      * lazy binding trampoline may or may not be the target
700      * address. The value returned from reloc_jmpslot() is the value
701      * that the trampoline needs.
702      */
703     target = reloc_jmpslot(where, target, defobj, obj, rel);
704     lock_release(rtld_bind_lock, &lockstate);
705     return target;
706 }
707
708 /*
709  * Error reporting function.  Use it like printf.  If formats the message
710  * into a buffer, and sets things up so that the next call to dlerror()
711  * will return the message.
712  */
713 void
714 _rtld_error(const char *fmt, ...)
715 {
716     static char buf[512];
717     va_list ap;
718
719     va_start(ap, fmt);
720     rtld_vsnprintf(buf, sizeof buf, fmt, ap);
721     error_message = buf;
722     va_end(ap);
723 }
724
725 /*
726  * Return a dynamically-allocated copy of the current error message, if any.
727  */
728 static char *
729 errmsg_save(void)
730 {
731     return error_message == NULL ? NULL : xstrdup(error_message);
732 }
733
734 /*
735  * Restore the current error message from a copy which was previously saved
736  * by errmsg_save().  The copy is freed.
737  */
738 static void
739 errmsg_restore(char *saved_msg)
740 {
741     if (saved_msg == NULL)
742         error_message = NULL;
743     else {
744         _rtld_error("%s", saved_msg);
745         free(saved_msg);
746     }
747 }
748
749 static const char *
750 basename(const char *name)
751 {
752     const char *p = strrchr(name, '/');
753     return p != NULL ? p + 1 : name;
754 }
755
756 static struct utsname uts;
757
758 static char *
759 origin_subst_one(char *real, const char *kw, const char *subst,
760     bool may_free)
761 {
762         char *p, *p1, *res, *resp;
763         int subst_len, kw_len, subst_count, old_len, new_len;
764
765         kw_len = strlen(kw);
766
767         /*
768          * First, count the number of the keyword occurences, to
769          * preallocate the final string.
770          */
771         for (p = real, subst_count = 0;; p = p1 + kw_len, subst_count++) {
772                 p1 = strstr(p, kw);
773                 if (p1 == NULL)
774                         break;
775         }
776
777         /*
778          * If the keyword is not found, just return.
779          */
780         if (subst_count == 0)
781                 return (may_free ? real : xstrdup(real));
782
783         /*
784          * There is indeed something to substitute.  Calculate the
785          * length of the resulting string, and allocate it.
786          */
787         subst_len = strlen(subst);
788         old_len = strlen(real);
789         new_len = old_len + (subst_len - kw_len) * subst_count;
790         res = xmalloc(new_len + 1);
791
792         /*
793          * Now, execute the substitution loop.
794          */
795         for (p = real, resp = res, *resp = '\0';;) {
796                 p1 = strstr(p, kw);
797                 if (p1 != NULL) {
798                         /* Copy the prefix before keyword. */
799                         memcpy(resp, p, p1 - p);
800                         resp += p1 - p;
801                         /* Keyword replacement. */
802                         memcpy(resp, subst, subst_len);
803                         resp += subst_len;
804                         *resp = '\0';
805                         p = p1 + kw_len;
806                 } else
807                         break;
808         }
809
810         /* Copy to the end of string and finish. */
811         strcat(resp, p);
812         if (may_free)
813                 free(real);
814         return (res);
815 }
816
817 static char *
818 origin_subst(char *real, const char *origin_path)
819 {
820         char *res1, *res2, *res3, *res4;
821
822         if (uts.sysname[0] == '\0') {
823                 if (uname(&uts) != 0) {
824                         _rtld_error("utsname failed: %d", errno);
825                         return (NULL);
826                 }
827         }
828         res1 = origin_subst_one(real, "$ORIGIN", origin_path, false);
829         res2 = origin_subst_one(res1, "$OSNAME", uts.sysname, true);
830         res3 = origin_subst_one(res2, "$OSREL", uts.release, true);
831         res4 = origin_subst_one(res3, "$PLATFORM", uts.machine, true);
832         return (res4);
833 }
834
835 static void
836 die(void)
837 {
838     const char *msg = dlerror();
839
840     if (msg == NULL)
841         msg = "Fatal error";
842     rtld_fdputstr(STDERR_FILENO, msg);
843     rtld_fdputchar(STDERR_FILENO, '\n');
844     _exit(1);
845 }
846
847 /*
848  * Process a shared object's DYNAMIC section, and save the important
849  * information in its Obj_Entry structure.
850  */
851 static void
852 digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
853     const Elf_Dyn **dyn_soname, const Elf_Dyn **dyn_runpath)
854 {
855     const Elf_Dyn *dynp;
856     Needed_Entry **needed_tail = &obj->needed;
857     Needed_Entry **needed_filtees_tail = &obj->needed_filtees;
858     Needed_Entry **needed_aux_filtees_tail = &obj->needed_aux_filtees;
859     const Elf_Hashelt *hashtab;
860     const Elf32_Word *hashval;
861     Elf32_Word bkt, nmaskwords;
862     int bloom_size32;
863     bool nmw_power2;
864     int plttype = DT_REL;
865
866     *dyn_rpath = NULL;
867     *dyn_soname = NULL;
868     *dyn_runpath = NULL;
869
870     obj->bind_now = false;
871     for (dynp = obj->dynamic;  dynp->d_tag != DT_NULL;  dynp++) {
872         switch (dynp->d_tag) {
873
874         case DT_REL:
875             obj->rel = (const Elf_Rel *) (obj->relocbase + dynp->d_un.d_ptr);
876             break;
877
878         case DT_RELSZ:
879             obj->relsize = dynp->d_un.d_val;
880             break;
881
882         case DT_RELENT:
883             assert(dynp->d_un.d_val == sizeof(Elf_Rel));
884             break;
885
886         case DT_JMPREL:
887             obj->pltrel = (const Elf_Rel *)
888               (obj->relocbase + dynp->d_un.d_ptr);
889             break;
890
891         case DT_PLTRELSZ:
892             obj->pltrelsize = dynp->d_un.d_val;
893             break;
894
895         case DT_RELA:
896             obj->rela = (const Elf_Rela *) (obj->relocbase + dynp->d_un.d_ptr);
897             break;
898
899         case DT_RELASZ:
900             obj->relasize = dynp->d_un.d_val;
901             break;
902
903         case DT_RELAENT:
904             assert(dynp->d_un.d_val == sizeof(Elf_Rela));
905             break;
906
907         case DT_PLTREL:
908             plttype = dynp->d_un.d_val;
909             assert(dynp->d_un.d_val == DT_REL || plttype == DT_RELA);
910             break;
911
912         case DT_SYMTAB:
913             obj->symtab = (const Elf_Sym *)
914               (obj->relocbase + dynp->d_un.d_ptr);
915             break;
916
917         case DT_SYMENT:
918             assert(dynp->d_un.d_val == sizeof(Elf_Sym));
919             break;
920
921         case DT_STRTAB:
922             obj->strtab = (const char *) (obj->relocbase + dynp->d_un.d_ptr);
923             break;
924
925         case DT_STRSZ:
926             obj->strsize = dynp->d_un.d_val;
927             break;
928
929         case DT_VERNEED:
930             obj->verneed = (const Elf_Verneed *) (obj->relocbase +
931                 dynp->d_un.d_val);
932             break;
933
934         case DT_VERNEEDNUM:
935             obj->verneednum = dynp->d_un.d_val;
936             break;
937
938         case DT_VERDEF:
939             obj->verdef = (const Elf_Verdef *) (obj->relocbase +
940                 dynp->d_un.d_val);
941             break;
942
943         case DT_VERDEFNUM:
944             obj->verdefnum = dynp->d_un.d_val;
945             break;
946
947         case DT_VERSYM:
948             obj->versyms = (const Elf_Versym *)(obj->relocbase +
949                 dynp->d_un.d_val);
950             break;
951
952         case DT_HASH:
953             {
954                 hashtab = (const Elf_Hashelt *)(obj->relocbase +
955                     dynp->d_un.d_ptr);
956                 obj->nbuckets = hashtab[0];
957                 obj->nchains = hashtab[1];
958                 obj->buckets = hashtab + 2;
959                 obj->chains = obj->buckets + obj->nbuckets;
960                 obj->valid_hash_sysv = obj->nbuckets > 0 && obj->nchains > 0 &&
961                   obj->buckets != NULL;
962             }
963             break;
964
965         case DT_GNU_HASH:
966             {
967                 hashtab = (const Elf_Hashelt *)(obj->relocbase +
968                     dynp->d_un.d_ptr);
969                 obj->nbuckets_gnu = hashtab[0];
970                 obj->symndx_gnu = hashtab[1];
971                 nmaskwords = hashtab[2];
972                 bloom_size32 = (__ELF_WORD_SIZE / 32) * nmaskwords;
973                 /* Number of bitmask words is required to be power of 2 */
974                 nmw_power2 = ((nmaskwords & (nmaskwords - 1)) == 0);
975                 obj->maskwords_bm_gnu = nmaskwords - 1;
976                 obj->shift2_gnu = hashtab[3];
977                 obj->bloom_gnu = (Elf_Addr *) (hashtab + 4);
978                 obj->buckets_gnu = hashtab + 4 + bloom_size32;
979                 obj->chain_zero_gnu = obj->buckets_gnu + obj->nbuckets_gnu -
980                   obj->symndx_gnu;
981                 obj->valid_hash_gnu = nmw_power2 && obj->nbuckets_gnu > 0 &&
982                   obj->buckets_gnu != NULL;
983             }
984             break;
985
986         case DT_NEEDED:
987             if (!obj->rtld) {
988                 Needed_Entry *nep = NEW(Needed_Entry);
989                 nep->name = dynp->d_un.d_val;
990                 nep->obj = NULL;
991                 nep->next = NULL;
992
993                 *needed_tail = nep;
994                 needed_tail = &nep->next;
995             }
996             break;
997
998         case DT_FILTER:
999             if (!obj->rtld) {
1000                 Needed_Entry *nep = NEW(Needed_Entry);
1001                 nep->name = dynp->d_un.d_val;
1002                 nep->obj = NULL;
1003                 nep->next = NULL;
1004
1005                 *needed_filtees_tail = nep;
1006                 needed_filtees_tail = &nep->next;
1007             }
1008             break;
1009
1010         case DT_AUXILIARY:
1011             if (!obj->rtld) {
1012                 Needed_Entry *nep = NEW(Needed_Entry);
1013                 nep->name = dynp->d_un.d_val;
1014                 nep->obj = NULL;
1015                 nep->next = NULL;
1016
1017                 *needed_aux_filtees_tail = nep;
1018                 needed_aux_filtees_tail = &nep->next;
1019             }
1020             break;
1021
1022         case DT_PLTGOT:
1023             obj->pltgot = (Elf_Addr *) (obj->relocbase + dynp->d_un.d_ptr);
1024             break;
1025
1026         case DT_TEXTREL:
1027             obj->textrel = true;
1028             break;
1029
1030         case DT_SYMBOLIC:
1031             obj->symbolic = true;
1032             break;
1033
1034         case DT_RPATH:
1035             /*
1036              * We have to wait until later to process this, because we
1037              * might not have gotten the address of the string table yet.
1038              */
1039             *dyn_rpath = dynp;
1040             break;
1041
1042         case DT_SONAME:
1043             *dyn_soname = dynp;
1044             break;
1045
1046         case DT_RUNPATH:
1047             *dyn_runpath = dynp;
1048             break;
1049
1050         case DT_INIT:
1051             obj->init = (Elf_Addr) (obj->relocbase + dynp->d_un.d_ptr);
1052             break;
1053
1054         case DT_PREINIT_ARRAY:
1055             obj->preinit_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr);
1056             break;
1057
1058         case DT_PREINIT_ARRAYSZ:
1059             obj->preinit_array_num = dynp->d_un.d_val / sizeof(Elf_Addr);
1060             break;
1061
1062         case DT_INIT_ARRAY:
1063             obj->init_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr);
1064             break;
1065
1066         case DT_INIT_ARRAYSZ:
1067             obj->init_array_num = dynp->d_un.d_val / sizeof(Elf_Addr);
1068             break;
1069
1070         case DT_FINI:
1071             obj->fini = (Elf_Addr) (obj->relocbase + dynp->d_un.d_ptr);
1072             break;
1073
1074         case DT_FINI_ARRAY:
1075             obj->fini_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr);
1076             break;
1077
1078         case DT_FINI_ARRAYSZ:
1079             obj->fini_array_num = dynp->d_un.d_val / sizeof(Elf_Addr);
1080             break;
1081
1082         /*
1083          * Don't process DT_DEBUG on MIPS as the dynamic section
1084          * is mapped read-only. DT_MIPS_RLD_MAP is used instead.
1085          */
1086
1087 #ifndef __mips__
1088         case DT_DEBUG:
1089             /* XXX - not implemented yet */
1090             if (!early)
1091                 dbg("Filling in DT_DEBUG entry");
1092             ((Elf_Dyn*)dynp)->d_un.d_ptr = (Elf_Addr) &r_debug;
1093             break;
1094 #endif
1095
1096         case DT_FLAGS:
1097                 if ((dynp->d_un.d_val & DF_ORIGIN) && trust)
1098                     obj->z_origin = true;
1099                 if (dynp->d_un.d_val & DF_SYMBOLIC)
1100                     obj->symbolic = true;
1101                 if (dynp->d_un.d_val & DF_TEXTREL)
1102                     obj->textrel = true;
1103                 if (dynp->d_un.d_val & DF_BIND_NOW)
1104                     obj->bind_now = true;
1105                 /*if (dynp->d_un.d_val & DF_STATIC_TLS)
1106                     ;*/
1107             break;
1108 #ifdef __mips__
1109         case DT_MIPS_LOCAL_GOTNO:
1110                 obj->local_gotno = dynp->d_un.d_val;
1111             break;
1112
1113         case DT_MIPS_SYMTABNO:
1114                 obj->symtabno = dynp->d_un.d_val;
1115                 break;
1116
1117         case DT_MIPS_GOTSYM:
1118                 obj->gotsym = dynp->d_un.d_val;
1119                 break;
1120
1121         case DT_MIPS_RLD_MAP:
1122                 *((Elf_Addr *)(dynp->d_un.d_ptr)) = (Elf_Addr) &r_debug;
1123                 break;
1124 #endif
1125
1126         case DT_FLAGS_1:
1127                 if (dynp->d_un.d_val & DF_1_NOOPEN)
1128                     obj->z_noopen = true;
1129                 if ((dynp->d_un.d_val & DF_1_ORIGIN) && trust)
1130                     obj->z_origin = true;
1131                 /*if (dynp->d_un.d_val & DF_1_GLOBAL)
1132                     XXX ;*/
1133                 if (dynp->d_un.d_val & DF_1_BIND_NOW)
1134                     obj->bind_now = true;
1135                 if (dynp->d_un.d_val & DF_1_NODELETE)
1136                     obj->z_nodelete = true;
1137                 if (dynp->d_un.d_val & DF_1_LOADFLTR)
1138                     obj->z_loadfltr = true;
1139                 if (dynp->d_un.d_val & DF_1_INTERPOSE)
1140                     obj->z_interpose = true;
1141                 if (dynp->d_un.d_val & DF_1_NODEFLIB)
1142                     obj->z_nodeflib = true;
1143             break;
1144
1145         default:
1146             if (!early) {
1147                 dbg("Ignoring d_tag %ld = %#lx", (long)dynp->d_tag,
1148                     (long)dynp->d_tag);
1149             }
1150             break;
1151         }
1152     }
1153
1154     obj->traced = false;
1155
1156     if (plttype == DT_RELA) {
1157         obj->pltrela = (const Elf_Rela *) obj->pltrel;
1158         obj->pltrel = NULL;
1159         obj->pltrelasize = obj->pltrelsize;
1160         obj->pltrelsize = 0;
1161     }
1162
1163     /* Determine size of dynsym table (equal to nchains of sysv hash) */
1164     if (obj->valid_hash_sysv)
1165         obj->dynsymcount = obj->nchains;
1166     else if (obj->valid_hash_gnu) {
1167         obj->dynsymcount = 0;
1168         for (bkt = 0; bkt < obj->nbuckets_gnu; bkt++) {
1169             if (obj->buckets_gnu[bkt] == 0)
1170                 continue;
1171             hashval = &obj->chain_zero_gnu[obj->buckets_gnu[bkt]];
1172             do
1173                 obj->dynsymcount++;
1174             while ((*hashval++ & 1u) == 0);
1175         }
1176         obj->dynsymcount += obj->symndx_gnu;
1177     }
1178 }
1179
1180 static void
1181 digest_dynamic2(Obj_Entry *obj, const Elf_Dyn *dyn_rpath,
1182     const Elf_Dyn *dyn_soname, const Elf_Dyn *dyn_runpath)
1183 {
1184
1185     if (obj->z_origin && obj->origin_path == NULL) {
1186         obj->origin_path = xmalloc(PATH_MAX);
1187         if (rtld_dirname_abs(obj->path, obj->origin_path) == -1)
1188             die();
1189     }
1190
1191     if (dyn_runpath != NULL) {
1192         obj->runpath = (char *)obj->strtab + dyn_runpath->d_un.d_val;
1193         if (obj->z_origin)
1194             obj->runpath = origin_subst(obj->runpath, obj->origin_path);
1195     }
1196     else if (dyn_rpath != NULL) {
1197         obj->rpath = (char *)obj->strtab + dyn_rpath->d_un.d_val;
1198         if (obj->z_origin)
1199             obj->rpath = origin_subst(obj->rpath, obj->origin_path);
1200     }
1201
1202     if (dyn_soname != NULL)
1203         object_add_name(obj, obj->strtab + dyn_soname->d_un.d_val);
1204 }
1205
1206 static void
1207 digest_dynamic(Obj_Entry *obj, int early)
1208 {
1209         const Elf_Dyn *dyn_rpath;
1210         const Elf_Dyn *dyn_soname;
1211         const Elf_Dyn *dyn_runpath;
1212
1213         digest_dynamic1(obj, early, &dyn_rpath, &dyn_soname, &dyn_runpath);
1214         digest_dynamic2(obj, dyn_rpath, dyn_soname, dyn_runpath);
1215 }
1216
1217 /*
1218  * Process a shared object's program header.  This is used only for the
1219  * main program, when the kernel has already loaded the main program
1220  * into memory before calling the dynamic linker.  It creates and
1221  * returns an Obj_Entry structure.
1222  */
1223 static Obj_Entry *
1224 digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
1225 {
1226     Obj_Entry *obj;
1227     const Elf_Phdr *phlimit = phdr + phnum;
1228     const Elf_Phdr *ph;
1229     Elf_Addr note_start, note_end;
1230     int nsegs = 0;
1231
1232     obj = obj_new();
1233     for (ph = phdr;  ph < phlimit;  ph++) {
1234         if (ph->p_type != PT_PHDR)
1235             continue;
1236
1237         obj->phdr = phdr;
1238         obj->phsize = ph->p_memsz;
1239         obj->relocbase = (caddr_t)phdr - ph->p_vaddr;
1240         break;
1241     }
1242
1243     obj->stack_flags = PF_X | PF_R | PF_W;
1244
1245     for (ph = phdr;  ph < phlimit;  ph++) {
1246         switch (ph->p_type) {
1247
1248         case PT_INTERP:
1249             obj->interp = (const char *)(ph->p_vaddr + obj->relocbase);
1250             break;
1251
1252         case PT_LOAD:
1253             if (nsegs == 0) {   /* First load segment */
1254                 obj->vaddrbase = trunc_page(ph->p_vaddr);
1255                 obj->mapbase = obj->vaddrbase + obj->relocbase;
1256                 obj->textsize = round_page(ph->p_vaddr + ph->p_memsz) -
1257                   obj->vaddrbase;
1258             } else {            /* Last load segment */
1259                 obj->mapsize = round_page(ph->p_vaddr + ph->p_memsz) -
1260                   obj->vaddrbase;
1261             }
1262             nsegs++;
1263             break;
1264
1265         case PT_DYNAMIC:
1266             obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase);
1267             break;
1268
1269         case PT_TLS:
1270             obj->tlsindex = 1;
1271             obj->tlssize = ph->p_memsz;
1272             obj->tlsalign = ph->p_align;
1273             obj->tlsinitsize = ph->p_filesz;
1274             obj->tlsinit = (void*)(ph->p_vaddr + obj->relocbase);
1275             break;
1276
1277         case PT_GNU_STACK:
1278             obj->stack_flags = ph->p_flags;
1279             break;
1280
1281         case PT_GNU_RELRO:
1282             obj->relro_page = obj->relocbase + trunc_page(ph->p_vaddr);
1283             obj->relro_size = round_page(ph->p_memsz);
1284             break;
1285
1286         case PT_NOTE:
1287             note_start = (Elf_Addr)obj->relocbase + ph->p_vaddr;
1288             note_end = note_start + ph->p_filesz;
1289             digest_notes(obj, note_start, note_end);
1290             break;
1291         }
1292     }
1293     if (nsegs < 1) {
1294         _rtld_error("%s: too few PT_LOAD segments", path);
1295         return NULL;
1296     }
1297
1298     obj->entry = entry;
1299     return obj;
1300 }
1301
1302 void
1303 digest_notes(Obj_Entry *obj, Elf_Addr note_start, Elf_Addr note_end)
1304 {
1305         const Elf_Note *note;
1306         const char *note_name;
1307         uintptr_t p;
1308
1309         for (note = (const Elf_Note *)note_start; (Elf_Addr)note < note_end;
1310             note = (const Elf_Note *)((const char *)(note + 1) +
1311               roundup2(note->n_namesz, sizeof(Elf32_Addr)) +
1312               roundup2(note->n_descsz, sizeof(Elf32_Addr)))) {
1313                 if (note->n_namesz != sizeof(NOTE_FREEBSD_VENDOR) ||
1314                     note->n_descsz != sizeof(int32_t))
1315                         continue;
1316                 if (note->n_type != ABI_NOTETYPE &&
1317                     note->n_type != CRT_NOINIT_NOTETYPE)
1318                         continue;
1319                 note_name = (const char *)(note + 1);
1320                 if (strncmp(NOTE_FREEBSD_VENDOR, note_name,
1321                     sizeof(NOTE_FREEBSD_VENDOR)) != 0)
1322                         continue;
1323                 switch (note->n_type) {
1324                 case ABI_NOTETYPE:
1325                         /* FreeBSD osrel note */
1326                         p = (uintptr_t)(note + 1);
1327                         p += roundup2(note->n_namesz, sizeof(Elf32_Addr));
1328                         obj->osrel = *(const int32_t *)(p);
1329                         dbg("note osrel %d", obj->osrel);
1330                         break;
1331                 case CRT_NOINIT_NOTETYPE:
1332                         /* FreeBSD 'crt does not call init' note */
1333                         obj->crt_no_init = true;
1334                         dbg("note crt_no_init");
1335                         break;
1336                 }
1337         }
1338 }
1339
1340 static Obj_Entry *
1341 dlcheck(void *handle)
1342 {
1343     Obj_Entry *obj;
1344
1345     for (obj = obj_list;  obj != NULL;  obj = obj->next)
1346         if (obj == (Obj_Entry *) handle)
1347             break;
1348
1349     if (obj == NULL || obj->refcount == 0 || obj->dl_refcount == 0) {
1350         _rtld_error("Invalid shared object handle %p", handle);
1351         return NULL;
1352     }
1353     return obj;
1354 }
1355
1356 /*
1357  * If the given object is already in the donelist, return true.  Otherwise
1358  * add the object to the list and return false.
1359  */
1360 static bool
1361 donelist_check(DoneList *dlp, const Obj_Entry *obj)
1362 {
1363     unsigned int i;
1364
1365     for (i = 0;  i < dlp->num_used;  i++)
1366         if (dlp->objs[i] == obj)
1367             return true;
1368     /*
1369      * Our donelist allocation should always be sufficient.  But if
1370      * our threads locking isn't working properly, more shared objects
1371      * could have been loaded since we allocated the list.  That should
1372      * never happen, but we'll handle it properly just in case it does.
1373      */
1374     if (dlp->num_used < dlp->num_alloc)
1375         dlp->objs[dlp->num_used++] = obj;
1376     return false;
1377 }
1378
1379 /*
1380  * Hash function for symbol table lookup.  Don't even think about changing
1381  * this.  It is specified by the System V ABI.
1382  */
1383 unsigned long
1384 elf_hash(const char *name)
1385 {
1386     const unsigned char *p = (const unsigned char *) name;
1387     unsigned long h = 0;
1388     unsigned long g;
1389
1390     while (*p != '\0') {
1391         h = (h << 4) + *p++;
1392         if ((g = h & 0xf0000000) != 0)
1393             h ^= g >> 24;
1394         h &= ~g;
1395     }
1396     return h;
1397 }
1398
1399 /*
1400  * The GNU hash function is the Daniel J. Bernstein hash clipped to 32 bits
1401  * unsigned in case it's implemented with a wider type.
1402  */
1403 static uint32_t
1404 gnu_hash(const char *s)
1405 {
1406         uint32_t h;
1407         unsigned char c;
1408
1409         h = 5381;
1410         for (c = *s; c != '\0'; c = *++s)
1411                 h = h * 33 + c;
1412         return (h & 0xffffffff);
1413 }
1414
1415 /*
1416  * Find the library with the given name, and return its full pathname.
1417  * The returned string is dynamically allocated.  Generates an error
1418  * message and returns NULL if the library cannot be found.
1419  *
1420  * If the second argument is non-NULL, then it refers to an already-
1421  * loaded shared object, whose library search path will be searched.
1422  *
1423  * The search order is:
1424  *   DT_RPATH in the referencing file _unless_ DT_RUNPATH is present (1)
1425  *   DT_RPATH of the main object if DSO without defined DT_RUNPATH (1)
1426  *   LD_LIBRARY_PATH
1427  *   DT_RUNPATH in the referencing file
1428  *   ldconfig hints (if -z nodefaultlib, filter out default library directories
1429  *       from list)
1430  *   /lib:/usr/lib _unless_ the referencing file is linked with -z nodefaultlib
1431  *
1432  * (1) Handled in digest_dynamic2 - rpath left NULL if runpath defined.
1433  */
1434 static char *
1435 find_library(const char *xname, const Obj_Entry *refobj)
1436 {
1437     char *pathname;
1438     char *name;
1439     bool nodeflib, objgiven;
1440
1441     objgiven = refobj != NULL;
1442     if (strchr(xname, '/') != NULL) {   /* Hard coded pathname */
1443         if (xname[0] != '/' && !trust) {
1444             _rtld_error("Absolute pathname required for shared object \"%s\"",
1445               xname);
1446             return NULL;
1447         }
1448         if (objgiven && refobj->z_origin) {
1449                 return (origin_subst(__DECONST(char *, xname),
1450                     refobj->origin_path));
1451         } else {
1452                 return (xstrdup(xname));
1453         }
1454     }
1455
1456     if (libmap_disable || !objgiven ||
1457         (name = lm_find(refobj->path, xname)) == NULL)
1458         name = (char *)xname;
1459
1460     dbg(" Searching for \"%s\"", name);
1461
1462     /*
1463      * If refobj->rpath != NULL, then refobj->runpath is NULL.  Fall
1464      * back to pre-conforming behaviour if user requested so with
1465      * LD_LIBRARY_PATH_RPATH environment variable and ignore -z
1466      * nodeflib.
1467      */
1468     if (objgiven && refobj->rpath != NULL && ld_library_path_rpath) {
1469         if ((pathname = search_library_path(name, ld_library_path)) != NULL ||
1470           (refobj != NULL &&
1471           (pathname = search_library_path(name, refobj->rpath)) != NULL) ||
1472           (pathname = search_library_path(name, gethints(false))) != NULL ||
1473           (pathname = search_library_path(name, STANDARD_LIBRARY_PATH)) != NULL)
1474             return (pathname);
1475     } else {
1476         nodeflib = objgiven ? refobj->z_nodeflib : false;
1477         if ((objgiven &&
1478           (pathname = search_library_path(name, refobj->rpath)) != NULL) ||
1479           (objgiven && refobj->runpath == NULL && refobj != obj_main &&
1480           (pathname = search_library_path(name, obj_main->rpath)) != NULL) ||
1481           (pathname = search_library_path(name, ld_library_path)) != NULL ||
1482           (objgiven &&
1483           (pathname = search_library_path(name, refobj->runpath)) != NULL) ||
1484           (pathname = search_library_path(name, gethints(nodeflib))) != NULL ||
1485           (objgiven && !nodeflib &&
1486           (pathname = search_library_path(name, STANDARD_LIBRARY_PATH)) != NULL))
1487             return (pathname);
1488     }
1489
1490     if (objgiven && refobj->path != NULL) {
1491         _rtld_error("Shared object \"%s\" not found, required by \"%s\"",
1492           name, basename(refobj->path));
1493     } else {
1494         _rtld_error("Shared object \"%s\" not found", name);
1495     }
1496     return NULL;
1497 }
1498
1499 /*
1500  * Given a symbol number in a referencing object, find the corresponding
1501  * definition of the symbol.  Returns a pointer to the symbol, or NULL if
1502  * no definition was found.  Returns a pointer to the Obj_Entry of the
1503  * defining object via the reference parameter DEFOBJ_OUT.
1504  */
1505 const Elf_Sym *
1506 find_symdef(unsigned long symnum, const Obj_Entry *refobj,
1507     const Obj_Entry **defobj_out, int flags, SymCache *cache,
1508     RtldLockState *lockstate)
1509 {
1510     const Elf_Sym *ref;
1511     const Elf_Sym *def;
1512     const Obj_Entry *defobj;
1513     SymLook req;
1514     const char *name;
1515     int res;
1516
1517     /*
1518      * If we have already found this symbol, get the information from
1519      * the cache.
1520      */
1521     if (symnum >= refobj->dynsymcount)
1522         return NULL;    /* Bad object */
1523     if (cache != NULL && cache[symnum].sym != NULL) {
1524         *defobj_out = cache[symnum].obj;
1525         return cache[symnum].sym;
1526     }
1527
1528     ref = refobj->symtab + symnum;
1529     name = refobj->strtab + ref->st_name;
1530     def = NULL;
1531     defobj = NULL;
1532
1533     /*
1534      * We don't have to do a full scale lookup if the symbol is local.
1535      * We know it will bind to the instance in this load module; to
1536      * which we already have a pointer (ie ref). By not doing a lookup,
1537      * we not only improve performance, but it also avoids unresolvable
1538      * symbols when local symbols are not in the hash table. This has
1539      * been seen with the ia64 toolchain.
1540      */
1541     if (ELF_ST_BIND(ref->st_info) != STB_LOCAL) {
1542         if (ELF_ST_TYPE(ref->st_info) == STT_SECTION) {
1543             _rtld_error("%s: Bogus symbol table entry %lu", refobj->path,
1544                 symnum);
1545         }
1546         symlook_init(&req, name);
1547         req.flags = flags;
1548         req.ventry = fetch_ventry(refobj, symnum);
1549         req.lockstate = lockstate;
1550         res = symlook_default(&req, refobj);
1551         if (res == 0) {
1552             def = req.sym_out;
1553             defobj = req.defobj_out;
1554         }
1555     } else {
1556         def = ref;
1557         defobj = refobj;
1558     }
1559
1560     /*
1561      * If we found no definition and the reference is weak, treat the
1562      * symbol as having the value zero.
1563      */
1564     if (def == NULL && ELF_ST_BIND(ref->st_info) == STB_WEAK) {
1565         def = &sym_zero;
1566         defobj = obj_main;
1567     }
1568
1569     if (def != NULL) {
1570         *defobj_out = defobj;
1571         /* Record the information in the cache to avoid subsequent lookups. */
1572         if (cache != NULL) {
1573             cache[symnum].sym = def;
1574             cache[symnum].obj = defobj;
1575         }
1576     } else {
1577         if (refobj != &obj_rtld)
1578             _rtld_error("%s: Undefined symbol \"%s\"", refobj->path, name);
1579     }
1580     return def;
1581 }
1582
1583 /*
1584  * Return the search path from the ldconfig hints file, reading it if
1585  * necessary.  If nostdlib is true, then the default search paths are
1586  * not added to result.
1587  *
1588  * Returns NULL if there are problems with the hints file,
1589  * or if the search path there is empty.
1590  */
1591 static const char *
1592 gethints(bool nostdlib)
1593 {
1594         static char *hints, *filtered_path;
1595         struct elfhints_hdr hdr;
1596         struct fill_search_info_args sargs, hargs;
1597         struct dl_serinfo smeta, hmeta, *SLPinfo, *hintinfo;
1598         struct dl_serpath *SLPpath, *hintpath;
1599         char *p;
1600         unsigned int SLPndx, hintndx, fndx, fcount;
1601         int fd;
1602         size_t flen;
1603         bool skip;
1604
1605         /* First call, read the hints file */
1606         if (hints == NULL) {
1607                 /* Keep from trying again in case the hints file is bad. */
1608                 hints = "";
1609
1610                 if ((fd = open(ld_elf_hints_path, O_RDONLY | O_CLOEXEC)) == -1)
1611                         return (NULL);
1612                 if (read(fd, &hdr, sizeof hdr) != sizeof hdr ||
1613                     hdr.magic != ELFHINTS_MAGIC ||
1614                     hdr.version != 1) {
1615                         close(fd);
1616                         return (NULL);
1617                 }
1618                 p = xmalloc(hdr.dirlistlen + 1);
1619                 if (lseek(fd, hdr.strtab + hdr.dirlist, SEEK_SET) == -1 ||
1620                     read(fd, p, hdr.dirlistlen + 1) !=
1621                     (ssize_t)hdr.dirlistlen + 1) {
1622                         free(p);
1623                         close(fd);
1624                         return (NULL);
1625                 }
1626                 hints = p;
1627                 close(fd);
1628         }
1629
1630         /*
1631          * If caller agreed to receive list which includes the default
1632          * paths, we are done. Otherwise, if we still did not
1633          * calculated filtered result, do it now.
1634          */
1635         if (!nostdlib)
1636                 return (hints[0] != '\0' ? hints : NULL);
1637         if (filtered_path != NULL)
1638                 goto filt_ret;
1639
1640         /*
1641          * Obtain the list of all configured search paths, and the
1642          * list of the default paths.
1643          *
1644          * First estimate the size of the results.
1645          */
1646         smeta.dls_size = __offsetof(struct dl_serinfo, dls_serpath);
1647         smeta.dls_cnt = 0;
1648         hmeta.dls_size = __offsetof(struct dl_serinfo, dls_serpath);
1649         hmeta.dls_cnt = 0;
1650
1651         sargs.request = RTLD_DI_SERINFOSIZE;
1652         sargs.serinfo = &smeta;
1653         hargs.request = RTLD_DI_SERINFOSIZE;
1654         hargs.serinfo = &hmeta;
1655
1656         path_enumerate(STANDARD_LIBRARY_PATH, fill_search_info, &sargs);
1657         path_enumerate(p, fill_search_info, &hargs);
1658
1659         SLPinfo = xmalloc(smeta.dls_size);
1660         hintinfo = xmalloc(hmeta.dls_size);
1661
1662         /*
1663          * Next fetch both sets of paths.
1664          */
1665         sargs.request = RTLD_DI_SERINFO;
1666         sargs.serinfo = SLPinfo;
1667         sargs.serpath = &SLPinfo->dls_serpath[0];
1668         sargs.strspace = (char *)&SLPinfo->dls_serpath[smeta.dls_cnt];
1669
1670         hargs.request = RTLD_DI_SERINFO;
1671         hargs.serinfo = hintinfo;
1672         hargs.serpath = &hintinfo->dls_serpath[0];
1673         hargs.strspace = (char *)&hintinfo->dls_serpath[hmeta.dls_cnt];
1674
1675         path_enumerate(STANDARD_LIBRARY_PATH, fill_search_info, &sargs);
1676         path_enumerate(p, fill_search_info, &hargs);
1677
1678         /*
1679          * Now calculate the difference between two sets, by excluding
1680          * standard paths from the full set.
1681          */
1682         fndx = 0;
1683         fcount = 0;
1684         filtered_path = xmalloc(hdr.dirlistlen + 1);
1685         hintpath = &hintinfo->dls_serpath[0];
1686         for (hintndx = 0; hintndx < hmeta.dls_cnt; hintndx++, hintpath++) {
1687                 skip = false;
1688                 SLPpath = &SLPinfo->dls_serpath[0];
1689                 /*
1690                  * Check each standard path against current.
1691                  */
1692                 for (SLPndx = 0; SLPndx < smeta.dls_cnt; SLPndx++, SLPpath++) {
1693                         /* matched, skip the path */
1694                         if (!strcmp(hintpath->dls_name, SLPpath->dls_name)) {
1695                                 skip = true;
1696                                 break;
1697                         }
1698                 }
1699                 if (skip)
1700                         continue;
1701                 /*
1702                  * Not matched against any standard path, add the path
1703                  * to result. Separate consequtive paths with ':'.
1704                  */
1705                 if (fcount > 0) {
1706                         filtered_path[fndx] = ':';
1707                         fndx++;
1708                 }
1709                 fcount++;
1710                 flen = strlen(hintpath->dls_name);
1711                 strncpy((filtered_path + fndx), hintpath->dls_name, flen);
1712                 fndx += flen;
1713         }
1714         filtered_path[fndx] = '\0';
1715
1716         free(SLPinfo);
1717         free(hintinfo);
1718
1719 filt_ret:
1720         return (filtered_path[0] != '\0' ? filtered_path : NULL);
1721 }
1722
1723 static void
1724 init_dag(Obj_Entry *root)
1725 {
1726     const Needed_Entry *needed;
1727     const Objlist_Entry *elm;
1728     DoneList donelist;
1729
1730     if (root->dag_inited)
1731         return;
1732     donelist_init(&donelist);
1733
1734     /* Root object belongs to own DAG. */
1735     objlist_push_tail(&root->dldags, root);
1736     objlist_push_tail(&root->dagmembers, root);
1737     donelist_check(&donelist, root);
1738
1739     /*
1740      * Add dependencies of root object to DAG in breadth order
1741      * by exploiting the fact that each new object get added
1742      * to the tail of the dagmembers list.
1743      */
1744     STAILQ_FOREACH(elm, &root->dagmembers, link) {
1745         for (needed = elm->obj->needed; needed != NULL; needed = needed->next) {
1746             if (needed->obj == NULL || donelist_check(&donelist, needed->obj))
1747                 continue;
1748             objlist_push_tail(&needed->obj->dldags, root);
1749             objlist_push_tail(&root->dagmembers, needed->obj);
1750         }
1751     }
1752     root->dag_inited = true;
1753 }
1754
1755 static void
1756 process_nodelete(Obj_Entry *root)
1757 {
1758         const Objlist_Entry *elm;
1759
1760         /*
1761          * Walk over object DAG and process every dependent object that
1762          * is marked as DF_1_NODELETE. They need to grow their own DAG,
1763          * which then should have its reference upped separately.
1764          */
1765         STAILQ_FOREACH(elm, &root->dagmembers, link) {
1766                 if (elm->obj != NULL && elm->obj->z_nodelete &&
1767                     !elm->obj->ref_nodel) {
1768                         dbg("obj %s nodelete", elm->obj->path);
1769                         init_dag(elm->obj);
1770                         ref_dag(elm->obj);
1771                         elm->obj->ref_nodel = true;
1772                 }
1773         }
1774 }
1775 /*
1776  * Initialize the dynamic linker.  The argument is the address at which
1777  * the dynamic linker has been mapped into memory.  The primary task of
1778  * this function is to relocate the dynamic linker.
1779  */
1780 static void
1781 init_rtld(caddr_t mapbase, Elf_Auxinfo **aux_info)
1782 {
1783     Obj_Entry objtmp;   /* Temporary rtld object */
1784     const Elf_Dyn *dyn_rpath;
1785     const Elf_Dyn *dyn_soname;
1786     const Elf_Dyn *dyn_runpath;
1787
1788     /*
1789      * Conjure up an Obj_Entry structure for the dynamic linker.
1790      *
1791      * The "path" member can't be initialized yet because string constants
1792      * cannot yet be accessed. Below we will set it correctly.
1793      */
1794     memset(&objtmp, 0, sizeof(objtmp));
1795     objtmp.path = NULL;
1796     objtmp.rtld = true;
1797     objtmp.mapbase = mapbase;
1798 #ifdef PIC
1799     objtmp.relocbase = mapbase;
1800 #endif
1801     if (RTLD_IS_DYNAMIC()) {
1802         objtmp.dynamic = rtld_dynamic(&objtmp);
1803         digest_dynamic1(&objtmp, 1, &dyn_rpath, &dyn_soname, &dyn_runpath);
1804         assert(objtmp.needed == NULL);
1805 #if !defined(__mips__)
1806         /* MIPS has a bogus DT_TEXTREL. */
1807         assert(!objtmp.textrel);
1808 #endif
1809
1810         /*
1811          * Temporarily put the dynamic linker entry into the object list, so
1812          * that symbols can be found.
1813          */
1814
1815         relocate_objects(&objtmp, true, &objtmp, 0, NULL);
1816     }
1817
1818     /* Initialize the object list. */
1819     obj_tail = &obj_list;
1820
1821     /* Now that non-local variables can be accesses, copy out obj_rtld. */
1822     memcpy(&obj_rtld, &objtmp, sizeof(obj_rtld));
1823
1824     if (aux_info[AT_PAGESZ] != NULL)
1825             pagesize = aux_info[AT_PAGESZ]->a_un.a_val;
1826     if (aux_info[AT_OSRELDATE] != NULL)
1827             osreldate = aux_info[AT_OSRELDATE]->a_un.a_val;
1828
1829     digest_dynamic2(&obj_rtld, dyn_rpath, dyn_soname, dyn_runpath);
1830
1831     /* Replace the path with a dynamically allocated copy. */
1832     obj_rtld.path = xstrdup(PATH_RTLD);
1833
1834     r_debug.r_brk = r_debug_state;
1835     r_debug.r_state = RT_CONSISTENT;
1836 }
1837
1838 /*
1839  * Add the init functions from a needed object list (and its recursive
1840  * needed objects) to "list".  This is not used directly; it is a helper
1841  * function for initlist_add_objects().  The write lock must be held
1842  * when this function is called.
1843  */
1844 static void
1845 initlist_add_neededs(Needed_Entry *needed, Objlist *list)
1846 {
1847     /* Recursively process the successor needed objects. */
1848     if (needed->next != NULL)
1849         initlist_add_neededs(needed->next, list);
1850
1851     /* Process the current needed object. */
1852     if (needed->obj != NULL)
1853         initlist_add_objects(needed->obj, &needed->obj->next, list);
1854 }
1855
1856 /*
1857  * Scan all of the DAGs rooted in the range of objects from "obj" to
1858  * "tail" and add their init functions to "list".  This recurses over
1859  * the DAGs and ensure the proper init ordering such that each object's
1860  * needed libraries are initialized before the object itself.  At the
1861  * same time, this function adds the objects to the global finalization
1862  * list "list_fini" in the opposite order.  The write lock must be
1863  * held when this function is called.
1864  */
1865 static void
1866 initlist_add_objects(Obj_Entry *obj, Obj_Entry **tail, Objlist *list)
1867 {
1868
1869     if (obj->init_scanned || obj->init_done)
1870         return;
1871     obj->init_scanned = true;
1872
1873     /* Recursively process the successor objects. */
1874     if (&obj->next != tail)
1875         initlist_add_objects(obj->next, tail, list);
1876
1877     /* Recursively process the needed objects. */
1878     if (obj->needed != NULL)
1879         initlist_add_neededs(obj->needed, list);
1880     if (obj->needed_filtees != NULL)
1881         initlist_add_neededs(obj->needed_filtees, list);
1882     if (obj->needed_aux_filtees != NULL)
1883         initlist_add_neededs(obj->needed_aux_filtees, list);
1884
1885     /* Add the object to the init list. */
1886     if (obj->preinit_array != (Elf_Addr)NULL || obj->init != (Elf_Addr)NULL ||
1887       obj->init_array != (Elf_Addr)NULL)
1888         objlist_push_tail(list, obj);
1889
1890     /* Add the object to the global fini list in the reverse order. */
1891     if ((obj->fini != (Elf_Addr)NULL || obj->fini_array != (Elf_Addr)NULL)
1892       && !obj->on_fini_list) {
1893         objlist_push_head(&list_fini, obj);
1894         obj->on_fini_list = true;
1895     }
1896 }
1897
1898 #ifndef FPTR_TARGET
1899 #define FPTR_TARGET(f)  ((Elf_Addr) (f))
1900 #endif
1901
1902 static void
1903 free_needed_filtees(Needed_Entry *n)
1904 {
1905     Needed_Entry *needed, *needed1;
1906
1907     for (needed = n; needed != NULL; needed = needed->next) {
1908         if (needed->obj != NULL) {
1909             dlclose(needed->obj);
1910             needed->obj = NULL;
1911         }
1912     }
1913     for (needed = n; needed != NULL; needed = needed1) {
1914         needed1 = needed->next;
1915         free(needed);
1916     }
1917 }
1918
1919 static void
1920 unload_filtees(Obj_Entry *obj)
1921 {
1922
1923     free_needed_filtees(obj->needed_filtees);
1924     obj->needed_filtees = NULL;
1925     free_needed_filtees(obj->needed_aux_filtees);
1926     obj->needed_aux_filtees = NULL;
1927     obj->filtees_loaded = false;
1928 }
1929
1930 static void
1931 load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags,
1932     RtldLockState *lockstate)
1933 {
1934
1935     for (; needed != NULL; needed = needed->next) {
1936         needed->obj = dlopen_object(obj->strtab + needed->name, -1, obj,
1937           flags, ((ld_loadfltr || obj->z_loadfltr) ? RTLD_NOW : RTLD_LAZY) |
1938           RTLD_LOCAL, lockstate);
1939     }
1940 }
1941
1942 static void
1943 load_filtees(Obj_Entry *obj, int flags, RtldLockState *lockstate)
1944 {
1945
1946     lock_restart_for_upgrade(lockstate);
1947     if (!obj->filtees_loaded) {
1948         load_filtee1(obj, obj->needed_filtees, flags, lockstate);
1949         load_filtee1(obj, obj->needed_aux_filtees, flags, lockstate);
1950         obj->filtees_loaded = true;
1951     }
1952 }
1953
1954 static int
1955 process_needed(Obj_Entry *obj, Needed_Entry *needed, int flags)
1956 {
1957     Obj_Entry *obj1;
1958
1959     for (; needed != NULL; needed = needed->next) {
1960         obj1 = needed->obj = load_object(obj->strtab + needed->name, -1, obj,
1961           flags & ~RTLD_LO_NOLOAD);
1962         if (obj1 == NULL && !ld_tracing && (flags & RTLD_LO_FILTEES) == 0)
1963             return (-1);
1964     }
1965     return (0);
1966 }
1967
1968 /*
1969  * Given a shared object, traverse its list of needed objects, and load
1970  * each of them.  Returns 0 on success.  Generates an error message and
1971  * returns -1 on failure.
1972  */
1973 static int
1974 load_needed_objects(Obj_Entry *first, int flags)
1975 {
1976     Obj_Entry *obj;
1977
1978     for (obj = first;  obj != NULL;  obj = obj->next) {
1979         if (process_needed(obj, obj->needed, flags) == -1)
1980             return (-1);
1981     }
1982     return (0);
1983 }
1984
1985 static int
1986 load_preload_objects(void)
1987 {
1988     char *p = ld_preload;
1989     Obj_Entry *obj;
1990     static const char delim[] = " \t:;";
1991
1992     if (p == NULL)
1993         return 0;
1994
1995     p += strspn(p, delim);
1996     while (*p != '\0') {
1997         size_t len = strcspn(p, delim);
1998         char savech;
1999
2000         savech = p[len];
2001         p[len] = '\0';
2002         obj = load_object(p, -1, NULL, 0);
2003         if (obj == NULL)
2004             return -1;  /* XXX - cleanup */
2005         obj->z_interpose = true;
2006         p[len] = savech;
2007         p += len;
2008         p += strspn(p, delim);
2009     }
2010     LD_UTRACE(UTRACE_PRELOAD_FINISHED, NULL, NULL, 0, 0, NULL);
2011     return 0;
2012 }
2013
2014 static const char *
2015 printable_path(const char *path)
2016 {
2017
2018         return (path == NULL ? "<unknown>" : path);
2019 }
2020
2021 /*
2022  * Load a shared object into memory, if it is not already loaded.  The
2023  * object may be specified by name or by user-supplied file descriptor
2024  * fd_u. In the later case, the fd_u descriptor is not closed, but its
2025  * duplicate is.
2026  *
2027  * Returns a pointer to the Obj_Entry for the object.  Returns NULL
2028  * on failure.
2029  */
2030 static Obj_Entry *
2031 load_object(const char *name, int fd_u, const Obj_Entry *refobj, int flags)
2032 {
2033     Obj_Entry *obj;
2034     int fd;
2035     struct stat sb;
2036     char *path;
2037
2038     if (name != NULL) {
2039         for (obj = obj_list->next;  obj != NULL;  obj = obj->next) {
2040             if (object_match_name(obj, name))
2041                 return (obj);
2042         }
2043
2044         path = find_library(name, refobj);
2045         if (path == NULL)
2046             return (NULL);
2047     } else
2048         path = NULL;
2049
2050     /*
2051      * If we didn't find a match by pathname, or the name is not
2052      * supplied, open the file and check again by device and inode.
2053      * This avoids false mismatches caused by multiple links or ".."
2054      * in pathnames.
2055      *
2056      * To avoid a race, we open the file and use fstat() rather than
2057      * using stat().
2058      */
2059     fd = -1;
2060     if (fd_u == -1) {
2061         if ((fd = open(path, O_RDONLY | O_CLOEXEC)) == -1) {
2062             _rtld_error("Cannot open \"%s\"", path);
2063             free(path);
2064             return (NULL);
2065         }
2066     } else {
2067         fd = fcntl(fd_u, F_DUPFD_CLOEXEC, 0);
2068         if (fd == -1) {
2069             _rtld_error("Cannot dup fd");
2070             free(path);
2071             return (NULL);
2072         }
2073     }
2074     if (fstat(fd, &sb) == -1) {
2075         _rtld_error("Cannot fstat \"%s\"", printable_path(path));
2076         close(fd);
2077         free(path);
2078         return NULL;
2079     }
2080     for (obj = obj_list->next;  obj != NULL;  obj = obj->next)
2081         if (obj->ino == sb.st_ino && obj->dev == sb.st_dev)
2082             break;
2083     if (obj != NULL && name != NULL) {
2084         object_add_name(obj, name);
2085         free(path);
2086         close(fd);
2087         return obj;
2088     }
2089     if (flags & RTLD_LO_NOLOAD) {
2090         free(path);
2091         close(fd);
2092         return (NULL);
2093     }
2094
2095     /* First use of this object, so we must map it in */
2096     obj = do_load_object(fd, name, path, &sb, flags);
2097     if (obj == NULL)
2098         free(path);
2099     close(fd);
2100
2101     return obj;
2102 }
2103
2104 static Obj_Entry *
2105 do_load_object(int fd, const char *name, char *path, struct stat *sbp,
2106   int flags)
2107 {
2108     Obj_Entry *obj;
2109     struct statfs fs;
2110
2111     /*
2112      * but first, make sure that environment variables haven't been
2113      * used to circumvent the noexec flag on a filesystem.
2114      */
2115     if (dangerous_ld_env) {
2116         if (fstatfs(fd, &fs) != 0) {
2117             _rtld_error("Cannot fstatfs \"%s\"", printable_path(path));
2118             return NULL;
2119         }
2120         if (fs.f_flags & MNT_NOEXEC) {
2121             _rtld_error("Cannot execute objects on %s\n", fs.f_mntonname);
2122             return NULL;
2123         }
2124     }
2125     dbg("loading \"%s\"", printable_path(path));
2126     obj = map_object(fd, printable_path(path), sbp);
2127     if (obj == NULL)
2128         return NULL;
2129
2130     /*
2131      * If DT_SONAME is present in the object, digest_dynamic2 already
2132      * added it to the object names.
2133      */
2134     if (name != NULL)
2135         object_add_name(obj, name);
2136     obj->path = path;
2137     digest_dynamic(obj, 0);
2138     dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", obj->path,
2139         obj->valid_hash_sysv, obj->valid_hash_gnu, obj->dynsymcount);
2140     if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) ==
2141       RTLD_LO_DLOPEN) {
2142         dbg("refusing to load non-loadable \"%s\"", obj->path);
2143         _rtld_error("Cannot dlopen non-loadable %s", obj->path);
2144         munmap(obj->mapbase, obj->mapsize);
2145         obj_free(obj);
2146         return (NULL);
2147     }
2148
2149     *obj_tail = obj;
2150     obj_tail = &obj->next;
2151     obj_count++;
2152     obj_loads++;
2153     linkmap_add(obj);   /* for GDB & dlinfo() */
2154     max_stack_flags |= obj->stack_flags;
2155
2156     dbg("  %p .. %p: %s", obj->mapbase,
2157          obj->mapbase + obj->mapsize - 1, obj->path);
2158     if (obj->textrel)
2159         dbg("  WARNING: %s has impure text", obj->path);
2160     LD_UTRACE(UTRACE_LOAD_OBJECT, obj, obj->mapbase, obj->mapsize, 0,
2161         obj->path);    
2162
2163     return obj;
2164 }
2165
2166 static Obj_Entry *
2167 obj_from_addr(const void *addr)
2168 {
2169     Obj_Entry *obj;
2170
2171     for (obj = obj_list;  obj != NULL;  obj = obj->next) {
2172         if (addr < (void *) obj->mapbase)
2173             continue;
2174         if (addr < (void *) (obj->mapbase + obj->mapsize))
2175             return obj;
2176     }
2177     return NULL;
2178 }
2179
2180 static void
2181 preinit_main(void)
2182 {
2183     Elf_Addr *preinit_addr;
2184     int index;
2185
2186     preinit_addr = (Elf_Addr *)obj_main->preinit_array;
2187     if (preinit_addr == NULL)
2188         return;
2189
2190     for (index = 0; index < obj_main->preinit_array_num; index++) {
2191         if (preinit_addr[index] != 0 && preinit_addr[index] != 1) {
2192             dbg("calling preinit function for %s at %p", obj_main->path,
2193               (void *)preinit_addr[index]);
2194             LD_UTRACE(UTRACE_INIT_CALL, obj_main, (void *)preinit_addr[index],
2195               0, 0, obj_main->path);
2196             call_init_pointer(obj_main, preinit_addr[index]);
2197         }
2198     }
2199 }
2200
2201 /*
2202  * Call the finalization functions for each of the objects in "list"
2203  * belonging to the DAG of "root" and referenced once. If NULL "root"
2204  * is specified, every finalization function will be called regardless
2205  * of the reference count and the list elements won't be freed. All of
2206  * the objects are expected to have non-NULL fini functions.
2207  */
2208 static void
2209 objlist_call_fini(Objlist *list, Obj_Entry *root, RtldLockState *lockstate)
2210 {
2211     Objlist_Entry *elm;
2212     char *saved_msg;
2213     Elf_Addr *fini_addr;
2214     int index;
2215
2216     assert(root == NULL || root->refcount == 1);
2217
2218     /*
2219      * Preserve the current error message since a fini function might
2220      * call into the dynamic linker and overwrite it.
2221      */
2222     saved_msg = errmsg_save();
2223     do {
2224         STAILQ_FOREACH(elm, list, link) {
2225             if (root != NULL && (elm->obj->refcount != 1 ||
2226               objlist_find(&root->dagmembers, elm->obj) == NULL))
2227                 continue;
2228             /* Remove object from fini list to prevent recursive invocation. */
2229             STAILQ_REMOVE(list, elm, Struct_Objlist_Entry, link);
2230             /*
2231              * XXX: If a dlopen() call references an object while the
2232              * fini function is in progress, we might end up trying to
2233              * unload the referenced object in dlclose() or the object
2234              * won't be unloaded although its fini function has been
2235              * called.
2236              */
2237             lock_release(rtld_bind_lock, lockstate);
2238
2239             /*
2240              * It is legal to have both DT_FINI and DT_FINI_ARRAY defined.
2241              * When this happens, DT_FINI_ARRAY is processed first.
2242              */
2243             fini_addr = (Elf_Addr *)elm->obj->fini_array;
2244             if (fini_addr != NULL && elm->obj->fini_array_num > 0) {
2245                 for (index = elm->obj->fini_array_num - 1; index >= 0;
2246                   index--) {
2247                     if (fini_addr[index] != 0 && fini_addr[index] != 1) {
2248                         dbg("calling fini function for %s at %p",
2249                             elm->obj->path, (void *)fini_addr[index]);
2250                         LD_UTRACE(UTRACE_FINI_CALL, elm->obj,
2251                             (void *)fini_addr[index], 0, 0, elm->obj->path);
2252                         call_initfini_pointer(elm->obj, fini_addr[index]);
2253                     }
2254                 }
2255             }
2256             if (elm->obj->fini != (Elf_Addr)NULL) {
2257                 dbg("calling fini function for %s at %p", elm->obj->path,
2258                     (void *)elm->obj->fini);
2259                 LD_UTRACE(UTRACE_FINI_CALL, elm->obj, (void *)elm->obj->fini,
2260                     0, 0, elm->obj->path);
2261                 call_initfini_pointer(elm->obj, elm->obj->fini);
2262             }
2263             wlock_acquire(rtld_bind_lock, lockstate);
2264             /* No need to free anything if process is going down. */
2265             if (root != NULL)
2266                 free(elm);
2267             /*
2268              * We must restart the list traversal after every fini call
2269              * because a dlclose() call from the fini function or from
2270              * another thread might have modified the reference counts.
2271              */
2272             break;
2273         }
2274     } while (elm != NULL);
2275     errmsg_restore(saved_msg);
2276 }
2277
2278 /*
2279  * Call the initialization functions for each of the objects in
2280  * "list".  All of the objects are expected to have non-NULL init
2281  * functions.
2282  */
2283 static void
2284 objlist_call_init(Objlist *list, RtldLockState *lockstate)
2285 {
2286     Objlist_Entry *elm;
2287     Obj_Entry *obj;
2288     char *saved_msg;
2289     Elf_Addr *init_addr;
2290     int index;
2291
2292     /*
2293      * Clean init_scanned flag so that objects can be rechecked and
2294      * possibly initialized earlier if any of vectors called below
2295      * cause the change by using dlopen.
2296      */
2297     for (obj = obj_list;  obj != NULL;  obj = obj->next)
2298         obj->init_scanned = false;
2299
2300     /*
2301      * Preserve the current error message since an init function might
2302      * call into the dynamic linker and overwrite it.
2303      */
2304     saved_msg = errmsg_save();
2305     STAILQ_FOREACH(elm, list, link) {
2306         if (elm->obj->init_done) /* Initialized early. */
2307             continue;
2308         /*
2309          * Race: other thread might try to use this object before current
2310          * one completes the initilization. Not much can be done here
2311          * without better locking.
2312          */
2313         elm->obj->init_done = true;
2314         lock_release(rtld_bind_lock, lockstate);
2315
2316         /*
2317          * It is legal to have both DT_INIT and DT_INIT_ARRAY defined.
2318          * When this happens, DT_INIT is processed first.
2319          */
2320         if (elm->obj->init != (Elf_Addr)NULL) {
2321             dbg("calling init function for %s at %p", elm->obj->path,
2322                 (void *)elm->obj->init);
2323             LD_UTRACE(UTRACE_INIT_CALL, elm->obj, (void *)elm->obj->init,
2324                 0, 0, elm->obj->path);
2325             call_initfini_pointer(elm->obj, elm->obj->init);
2326         }
2327         init_addr = (Elf_Addr *)elm->obj->init_array;
2328         if (init_addr != NULL) {
2329             for (index = 0; index < elm->obj->init_array_num; index++) {
2330                 if (init_addr[index] != 0 && init_addr[index] != 1) {
2331                     dbg("calling init function for %s at %p", elm->obj->path,
2332                         (void *)init_addr[index]);
2333                     LD_UTRACE(UTRACE_INIT_CALL, elm->obj,
2334                         (void *)init_addr[index], 0, 0, elm->obj->path);
2335                     call_init_pointer(elm->obj, init_addr[index]);
2336                 }
2337             }
2338         }
2339         wlock_acquire(rtld_bind_lock, lockstate);
2340     }
2341     errmsg_restore(saved_msg);
2342 }
2343
2344 static void
2345 objlist_clear(Objlist *list)
2346 {
2347     Objlist_Entry *elm;
2348
2349     while (!STAILQ_EMPTY(list)) {
2350         elm = STAILQ_FIRST(list);
2351         STAILQ_REMOVE_HEAD(list, link);
2352         free(elm);
2353     }
2354 }
2355
2356 static Objlist_Entry *
2357 objlist_find(Objlist *list, const Obj_Entry *obj)
2358 {
2359     Objlist_Entry *elm;
2360
2361     STAILQ_FOREACH(elm, list, link)
2362         if (elm->obj == obj)
2363             return elm;
2364     return NULL;
2365 }
2366
2367 static void
2368 objlist_init(Objlist *list)
2369 {
2370     STAILQ_INIT(list);
2371 }
2372
2373 static void
2374 objlist_push_head(Objlist *list, Obj_Entry *obj)
2375 {
2376     Objlist_Entry *elm;
2377
2378     elm = NEW(Objlist_Entry);
2379     elm->obj = obj;
2380     STAILQ_INSERT_HEAD(list, elm, link);
2381 }
2382
2383 static void
2384 objlist_push_tail(Objlist *list, Obj_Entry *obj)
2385 {
2386     Objlist_Entry *elm;
2387
2388     elm = NEW(Objlist_Entry);
2389     elm->obj = obj;
2390     STAILQ_INSERT_TAIL(list, elm, link);
2391 }
2392
2393 static void
2394 objlist_put_after(Objlist *list, Obj_Entry *listobj, Obj_Entry *obj)
2395 {
2396         Objlist_Entry *elm, *listelm;
2397
2398         STAILQ_FOREACH(listelm, list, link) {
2399                 if (listelm->obj == listobj)
2400                         break;
2401         }
2402         elm = NEW(Objlist_Entry);
2403         elm->obj = obj;
2404         if (listelm != NULL)
2405                 STAILQ_INSERT_AFTER(list, listelm, elm, link);
2406         else
2407                 STAILQ_INSERT_TAIL(list, elm, link);
2408 }
2409
2410 static void
2411 objlist_remove(Objlist *list, Obj_Entry *obj)
2412 {
2413     Objlist_Entry *elm;
2414
2415     if ((elm = objlist_find(list, obj)) != NULL) {
2416         STAILQ_REMOVE(list, elm, Struct_Objlist_Entry, link);
2417         free(elm);
2418     }
2419 }
2420
2421 /*
2422  * Relocate dag rooted in the specified object.
2423  * Returns 0 on success, or -1 on failure.
2424  */
2425
2426 static int
2427 relocate_object_dag(Obj_Entry *root, bool bind_now, Obj_Entry *rtldobj,
2428     int flags, RtldLockState *lockstate)
2429 {
2430         Objlist_Entry *elm;
2431         int error;
2432
2433         error = 0;
2434         STAILQ_FOREACH(elm, &root->dagmembers, link) {
2435                 error = relocate_object(elm->obj, bind_now, rtldobj, flags,
2436                     lockstate);
2437                 if (error == -1)
2438                         break;
2439         }
2440         return (error);
2441 }
2442
2443 /*
2444  * Relocate single object.
2445  * Returns 0 on success, or -1 on failure.
2446  */
2447 static int
2448 relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj,
2449     int flags, RtldLockState *lockstate)
2450 {
2451
2452         if (obj->relocated)
2453                 return (0);
2454         obj->relocated = true;
2455         if (obj != rtldobj)
2456                 dbg("relocating \"%s\"", obj->path);
2457
2458         if (obj->symtab == NULL || obj->strtab == NULL ||
2459             !(obj->valid_hash_sysv || obj->valid_hash_gnu)) {
2460                 _rtld_error("%s: Shared object has no run-time symbol table",
2461                             obj->path);
2462                 return (-1);
2463         }
2464
2465         if (obj->textrel) {
2466                 /* There are relocations to the write-protected text segment. */
2467                 if (mprotect(obj->mapbase, obj->textsize,
2468                     PROT_READ|PROT_WRITE|PROT_EXEC) == -1) {
2469                         _rtld_error("%s: Cannot write-enable text segment: %s",
2470                             obj->path, rtld_strerror(errno));
2471                         return (-1);
2472                 }
2473         }
2474
2475         /* Process the non-PLT relocations. */
2476         if (reloc_non_plt(obj, rtldobj, flags, lockstate))
2477                 return (-1);
2478
2479         if (obj->textrel) {     /* Re-protected the text segment. */
2480                 if (mprotect(obj->mapbase, obj->textsize,
2481                     PROT_READ|PROT_EXEC) == -1) {
2482                         _rtld_error("%s: Cannot write-protect text segment: %s",
2483                             obj->path, rtld_strerror(errno));
2484                         return (-1);
2485                 }
2486         }
2487
2488
2489         /* Set the special PLT or GOT entries. */
2490         init_pltgot(obj);
2491
2492         /* Process the PLT relocations. */
2493         if (reloc_plt(obj) == -1)
2494                 return (-1);
2495         /* Relocate the jump slots if we are doing immediate binding. */
2496         if (obj->bind_now || bind_now)
2497                 if (reloc_jmpslots(obj, flags, lockstate) == -1)
2498                         return (-1);
2499
2500         if (obj->relro_size > 0) {
2501                 if (mprotect(obj->relro_page, obj->relro_size,
2502                     PROT_READ) == -1) {
2503                         _rtld_error("%s: Cannot enforce relro protection: %s",
2504                             obj->path, rtld_strerror(errno));
2505                         return (-1);
2506                 }
2507         }
2508
2509         /*
2510          * Set up the magic number and version in the Obj_Entry.  These
2511          * were checked in the crt1.o from the original ElfKit, so we
2512          * set them for backward compatibility.
2513          */
2514         obj->magic = RTLD_MAGIC;
2515         obj->version = RTLD_VERSION;
2516
2517         return (0);
2518 }
2519
2520 /*
2521  * Relocate newly-loaded shared objects.  The argument is a pointer to
2522  * the Obj_Entry for the first such object.  All objects from the first
2523  * to the end of the list of objects are relocated.  Returns 0 on success,
2524  * or -1 on failure.
2525  */
2526 static int
2527 relocate_objects(Obj_Entry *first, bool bind_now, Obj_Entry *rtldobj,
2528     int flags, RtldLockState *lockstate)
2529 {
2530         Obj_Entry *obj;
2531         int error;
2532
2533         for (error = 0, obj = first;  obj != NULL;  obj = obj->next) {
2534                 error = relocate_object(obj, bind_now, rtldobj, flags,
2535                     lockstate);
2536                 if (error == -1)
2537                         break;
2538         }
2539         return (error);
2540 }
2541
2542 /*
2543  * The handling of R_MACHINE_IRELATIVE relocations and jumpslots
2544  * referencing STT_GNU_IFUNC symbols is postponed till the other
2545  * relocations are done.  The indirect functions specified as
2546  * ifunc are allowed to call other symbols, so we need to have
2547  * objects relocated before asking for resolution from indirects.
2548  *
2549  * The R_MACHINE_IRELATIVE slots are resolved in greedy fashion,
2550  * instead of the usual lazy handling of PLT slots.  It is
2551  * consistent with how GNU does it.
2552  */
2553 static int
2554 resolve_object_ifunc(Obj_Entry *obj, bool bind_now, int flags,
2555     RtldLockState *lockstate)
2556 {
2557         if (obj->irelative && reloc_iresolve(obj, lockstate) == -1)
2558                 return (-1);
2559         if ((obj->bind_now || bind_now) && obj->gnu_ifunc &&
2560             reloc_gnu_ifunc(obj, flags, lockstate) == -1)
2561                 return (-1);
2562         return (0);
2563 }
2564
2565 static int
2566 resolve_objects_ifunc(Obj_Entry *first, bool bind_now, int flags,
2567     RtldLockState *lockstate)
2568 {
2569         Obj_Entry *obj;
2570
2571         for (obj = first;  obj != NULL;  obj = obj->next) {
2572                 if (resolve_object_ifunc(obj, bind_now, flags, lockstate) == -1)
2573                         return (-1);
2574         }
2575         return (0);
2576 }
2577
2578 static int
2579 initlist_objects_ifunc(Objlist *list, bool bind_now, int flags,
2580     RtldLockState *lockstate)
2581 {
2582         Objlist_Entry *elm;
2583
2584         STAILQ_FOREACH(elm, list, link) {
2585                 if (resolve_object_ifunc(elm->obj, bind_now, flags,
2586                     lockstate) == -1)
2587                         return (-1);
2588         }
2589         return (0);
2590 }
2591
2592 /*
2593  * Cleanup procedure.  It will be called (by the atexit mechanism) just
2594  * before the process exits.
2595  */
2596 static void
2597 rtld_exit(void)
2598 {
2599     RtldLockState lockstate;
2600
2601     wlock_acquire(rtld_bind_lock, &lockstate);
2602     dbg("rtld_exit()");
2603     objlist_call_fini(&list_fini, NULL, &lockstate);
2604     /* No need to remove the items from the list, since we are exiting. */
2605     if (!libmap_disable)
2606         lm_fini();
2607     lock_release(rtld_bind_lock, &lockstate);
2608 }
2609
2610 /*
2611  * Iterate over a search path, translate each element, and invoke the
2612  * callback on the result.
2613  */
2614 static void *
2615 path_enumerate(const char *path, path_enum_proc callback, void *arg)
2616 {
2617     const char *trans;
2618     if (path == NULL)
2619         return (NULL);
2620
2621     path += strspn(path, ":;");
2622     while (*path != '\0') {
2623         size_t len;
2624         char  *res;
2625
2626         len = strcspn(path, ":;");
2627         trans = lm_findn(NULL, path, len);
2628         if (trans)
2629             res = callback(trans, strlen(trans), arg);
2630         else
2631             res = callback(path, len, arg);
2632
2633         if (res != NULL)
2634             return (res);
2635
2636         path += len;
2637         path += strspn(path, ":;");
2638     }
2639
2640     return (NULL);
2641 }
2642
2643 struct try_library_args {
2644     const char  *name;
2645     size_t       namelen;
2646     char        *buffer;
2647     size_t       buflen;
2648 };
2649
2650 static void *
2651 try_library_path(const char *dir, size_t dirlen, void *param)
2652 {
2653     struct try_library_args *arg;
2654
2655     arg = param;
2656     if (*dir == '/' || trust) {
2657         char *pathname;
2658
2659         if (dirlen + 1 + arg->namelen + 1 > arg->buflen)
2660                 return (NULL);
2661
2662         pathname = arg->buffer;
2663         strncpy(pathname, dir, dirlen);
2664         pathname[dirlen] = '/';
2665         strcpy(pathname + dirlen + 1, arg->name);
2666
2667         dbg("  Trying \"%s\"", pathname);
2668         if (access(pathname, F_OK) == 0) {              /* We found it */
2669             pathname = xmalloc(dirlen + 1 + arg->namelen + 1);
2670             strcpy(pathname, arg->buffer);
2671             return (pathname);
2672         }
2673     }
2674     return (NULL);
2675 }
2676
2677 static char *
2678 search_library_path(const char *name, const char *path)
2679 {
2680     char *p;
2681     struct try_library_args arg;
2682
2683     if (path == NULL)
2684         return NULL;
2685
2686     arg.name = name;
2687     arg.namelen = strlen(name);
2688     arg.buffer = xmalloc(PATH_MAX);
2689     arg.buflen = PATH_MAX;
2690
2691     p = path_enumerate(path, try_library_path, &arg);
2692
2693     free(arg.buffer);
2694
2695     return (p);
2696 }
2697
2698 int
2699 dlclose(void *handle)
2700 {
2701     Obj_Entry *root;
2702     RtldLockState lockstate;
2703
2704     wlock_acquire(rtld_bind_lock, &lockstate);
2705     root = dlcheck(handle);
2706     if (root == NULL) {
2707         lock_release(rtld_bind_lock, &lockstate);
2708         return -1;
2709     }
2710     LD_UTRACE(UTRACE_DLCLOSE_START, handle, NULL, 0, root->dl_refcount,
2711         root->path);
2712
2713     /* Unreference the object and its dependencies. */
2714     root->dl_refcount--;
2715
2716     if (root->refcount == 1) {
2717         /*
2718          * The object will be no longer referenced, so we must unload it.
2719          * First, call the fini functions.
2720          */
2721         objlist_call_fini(&list_fini, root, &lockstate);
2722
2723         unref_dag(root);
2724
2725         /* Finish cleaning up the newly-unreferenced objects. */
2726         GDB_STATE(RT_DELETE,&root->linkmap);
2727         unload_object(root);
2728         GDB_STATE(RT_CONSISTENT,NULL);
2729     } else
2730         unref_dag(root);
2731
2732     LD_UTRACE(UTRACE_DLCLOSE_STOP, handle, NULL, 0, 0, NULL);
2733     lock_release(rtld_bind_lock, &lockstate);
2734     return 0;
2735 }
2736
2737 char *
2738 dlerror(void)
2739 {
2740     char *msg = error_message;
2741     error_message = NULL;
2742     return msg;
2743 }
2744
2745 /*
2746  * This function is deprecated and has no effect.
2747  */
2748 void
2749 dllockinit(void *context,
2750            void *(*lock_create)(void *context),
2751            void (*rlock_acquire)(void *lock),
2752            void (*wlock_acquire)(void *lock),
2753            void (*lock_release)(void *lock),
2754            void (*lock_destroy)(void *lock),
2755            void (*context_destroy)(void *context))
2756 {
2757     static void *cur_context;
2758     static void (*cur_context_destroy)(void *);
2759
2760     /* Just destroy the context from the previous call, if necessary. */
2761     if (cur_context_destroy != NULL)
2762         cur_context_destroy(cur_context);
2763     cur_context = context;
2764     cur_context_destroy = context_destroy;
2765 }
2766
2767 void *
2768 dlopen(const char *name, int mode)
2769 {
2770
2771         return (rtld_dlopen(name, -1, mode));
2772 }
2773
2774 void *
2775 fdlopen(int fd, int mode)
2776 {
2777
2778         return (rtld_dlopen(NULL, fd, mode));
2779 }
2780
2781 static void *
2782 rtld_dlopen(const char *name, int fd, int mode)
2783 {
2784     RtldLockState lockstate;
2785     int lo_flags;
2786
2787     LD_UTRACE(UTRACE_DLOPEN_START, NULL, NULL, 0, mode, name);
2788     ld_tracing = (mode & RTLD_TRACE) == 0 ? NULL : "1";
2789     if (ld_tracing != NULL) {
2790         rlock_acquire(rtld_bind_lock, &lockstate);
2791         if (sigsetjmp(lockstate.env, 0) != 0)
2792             lock_upgrade(rtld_bind_lock, &lockstate);
2793         environ = (char **)*get_program_var_addr("environ", &lockstate);
2794         lock_release(rtld_bind_lock, &lockstate);
2795     }
2796     lo_flags = RTLD_LO_DLOPEN;
2797     if (mode & RTLD_NODELETE)
2798             lo_flags |= RTLD_LO_NODELETE;
2799     if (mode & RTLD_NOLOAD)
2800             lo_flags |= RTLD_LO_NOLOAD;
2801     if (ld_tracing != NULL)
2802             lo_flags |= RTLD_LO_TRACE;
2803
2804     return (dlopen_object(name, fd, obj_main, lo_flags,
2805       mode & (RTLD_MODEMASK | RTLD_GLOBAL), NULL));
2806 }
2807
2808 static void
2809 dlopen_cleanup(Obj_Entry *obj)
2810 {
2811
2812         obj->dl_refcount--;
2813         unref_dag(obj);
2814         if (obj->refcount == 0)
2815                 unload_object(obj);
2816 }
2817
2818 static Obj_Entry *
2819 dlopen_object(const char *name, int fd, Obj_Entry *refobj, int lo_flags,
2820     int mode, RtldLockState *lockstate)
2821 {
2822     Obj_Entry **old_obj_tail;
2823     Obj_Entry *obj;
2824     Objlist initlist;
2825     RtldLockState mlockstate;
2826     int result;
2827
2828     objlist_init(&initlist);
2829
2830     if (lockstate == NULL && !(lo_flags & RTLD_LO_EARLY)) {
2831         wlock_acquire(rtld_bind_lock, &mlockstate);
2832         lockstate = &mlockstate;
2833     }
2834     GDB_STATE(RT_ADD,NULL);
2835
2836     old_obj_tail = obj_tail;
2837     obj = NULL;
2838     if (name == NULL && fd == -1) {
2839         obj = obj_main;
2840         obj->refcount++;
2841     } else {
2842         obj = load_object(name, fd, refobj, lo_flags);
2843     }
2844
2845     if (obj) {
2846         obj->dl_refcount++;
2847         if (mode & RTLD_GLOBAL && objlist_find(&list_global, obj) == NULL)
2848             objlist_push_tail(&list_global, obj);
2849         if (*old_obj_tail != NULL) {            /* We loaded something new. */
2850             assert(*old_obj_tail == obj);
2851             result = load_needed_objects(obj,
2852                 lo_flags & (RTLD_LO_DLOPEN | RTLD_LO_EARLY));
2853             init_dag(obj);
2854             ref_dag(obj);
2855             if (result != -1)
2856                 result = rtld_verify_versions(&obj->dagmembers);
2857             if (result != -1 && ld_tracing)
2858                 goto trace;
2859             if (result == -1 || relocate_object_dag(obj,
2860               (mode & RTLD_MODEMASK) == RTLD_NOW, &obj_rtld,
2861               (lo_flags & RTLD_LO_EARLY) ? SYMLOOK_EARLY : 0,
2862               lockstate) == -1) {
2863                 dlopen_cleanup(obj);
2864                 obj = NULL;
2865             } else if (lo_flags & RTLD_LO_EARLY) {
2866                 /*
2867                  * Do not call the init functions for early loaded
2868                  * filtees.  The image is still not initialized enough
2869                  * for them to work.
2870                  *
2871                  * Our object is found by the global object list and
2872                  * will be ordered among all init calls done right
2873                  * before transferring control to main.
2874                  */
2875             } else {
2876                 /* Make list of init functions to call. */
2877                 initlist_add_objects(obj, &obj->next, &initlist);
2878             }
2879             /*
2880              * Process all no_delete objects here, given them own
2881              * DAGs to prevent their dependencies from being unloaded.
2882              * This has to be done after we have loaded all of the
2883              * dependencies, so that we do not miss any.
2884              */
2885             if (obj != NULL)
2886                 process_nodelete(obj);
2887         } else {
2888             /*
2889              * Bump the reference counts for objects on this DAG.  If
2890              * this is the first dlopen() call for the object that was
2891              * already loaded as a dependency, initialize the dag
2892              * starting at it.
2893              */
2894             init_dag(obj);
2895             ref_dag(obj);
2896
2897             if ((lo_flags & RTLD_LO_TRACE) != 0)
2898                 goto trace;
2899         }
2900         if (obj != NULL && ((lo_flags & RTLD_LO_NODELETE) != 0 ||
2901           obj->z_nodelete) && !obj->ref_nodel) {
2902             dbg("obj %s nodelete", obj->path);
2903             ref_dag(obj);
2904             obj->z_nodelete = obj->ref_nodel = true;
2905         }
2906     }
2907
2908     LD_UTRACE(UTRACE_DLOPEN_STOP, obj, NULL, 0, obj ? obj->dl_refcount : 0,
2909         name);
2910     GDB_STATE(RT_CONSISTENT,obj ? &obj->linkmap : NULL);
2911
2912     if (!(lo_flags & RTLD_LO_EARLY)) {
2913         map_stacks_exec(lockstate);
2914     }
2915
2916     if (initlist_objects_ifunc(&initlist, (mode & RTLD_MODEMASK) == RTLD_NOW,
2917       (lo_flags & RTLD_LO_EARLY) ? SYMLOOK_EARLY : 0,
2918       lockstate) == -1) {
2919         objlist_clear(&initlist);
2920         dlopen_cleanup(obj);
2921         if (lockstate == &mlockstate)
2922             lock_release(rtld_bind_lock, lockstate);
2923         return (NULL);
2924     }
2925
2926     if (!(lo_flags & RTLD_LO_EARLY)) {
2927         /* Call the init functions. */
2928         objlist_call_init(&initlist, lockstate);
2929     }
2930     objlist_clear(&initlist);
2931     if (lockstate == &mlockstate)
2932         lock_release(rtld_bind_lock, lockstate);
2933     return obj;
2934 trace:
2935     trace_loaded_objects(obj);
2936     if (lockstate == &mlockstate)
2937         lock_release(rtld_bind_lock, lockstate);
2938     exit(0);
2939 }
2940
2941 static void *
2942 do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
2943     int flags)
2944 {
2945     DoneList donelist;
2946     const Obj_Entry *obj, *defobj;
2947     const Elf_Sym *def;
2948     SymLook req;
2949     RtldLockState lockstate;
2950 #ifndef __ia64__
2951     tls_index ti;
2952 #endif
2953     int res;
2954
2955     def = NULL;
2956     defobj = NULL;
2957     symlook_init(&req, name);
2958     req.ventry = ve;
2959     req.flags = flags | SYMLOOK_IN_PLT;
2960     req.lockstate = &lockstate;
2961
2962     rlock_acquire(rtld_bind_lock, &lockstate);
2963     if (sigsetjmp(lockstate.env, 0) != 0)
2964             lock_upgrade(rtld_bind_lock, &lockstate);
2965     if (handle == NULL || handle == RTLD_NEXT ||
2966         handle == RTLD_DEFAULT || handle == RTLD_SELF) {
2967
2968         if ((obj = obj_from_addr(retaddr)) == NULL) {
2969             _rtld_error("Cannot determine caller's shared object");
2970             lock_release(rtld_bind_lock, &lockstate);
2971             return NULL;
2972         }
2973         if (handle == NULL) {   /* Just the caller's shared object. */
2974             res = symlook_obj(&req, obj);
2975             if (res == 0) {
2976                 def = req.sym_out;
2977                 defobj = req.defobj_out;
2978             }
2979         } else if (handle == RTLD_NEXT || /* Objects after caller's */
2980                    handle == RTLD_SELF) { /* ... caller included */
2981             if (handle == RTLD_NEXT)
2982                 obj = obj->next;
2983             for (; obj != NULL; obj = obj->next) {
2984                 res = symlook_obj(&req, obj);
2985                 if (res == 0) {
2986                     if (def == NULL ||
2987                       ELF_ST_BIND(req.sym_out->st_info) != STB_WEAK) {
2988                         def = req.sym_out;
2989                         defobj = req.defobj_out;
2990                         if (ELF_ST_BIND(def->st_info) != STB_WEAK)
2991                             break;
2992                     }
2993                 }
2994             }
2995             /*
2996              * Search the dynamic linker itself, and possibly resolve the
2997              * symbol from there.  This is how the application links to
2998              * dynamic linker services such as dlopen.
2999              */
3000             if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) {
3001                 res = symlook_obj(&req, &obj_rtld);
3002                 if (res == 0) {
3003                     def = req.sym_out;
3004                     defobj = req.defobj_out;
3005                 }
3006             }
3007         } else {
3008             assert(handle == RTLD_DEFAULT);
3009             res = symlook_default(&req, obj);
3010             if (res == 0) {
3011                 defobj = req.defobj_out;
3012                 def = req.sym_out;
3013             }
3014         }
3015     } else {
3016         if ((obj = dlcheck(handle)) == NULL) {
3017             lock_release(rtld_bind_lock, &lockstate);
3018             return NULL;
3019         }
3020
3021         donelist_init(&donelist);
3022         if (obj->mainprog) {
3023             /* Handle obtained by dlopen(NULL, ...) implies global scope. */
3024             res = symlook_global(&req, &donelist);
3025             if (res == 0) {
3026                 def = req.sym_out;
3027                 defobj = req.defobj_out;
3028             }
3029             /*
3030              * Search the dynamic linker itself, and possibly resolve the
3031              * symbol from there.  This is how the application links to
3032              * dynamic linker services such as dlopen.
3033              */
3034             if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) {
3035                 res = symlook_obj(&req, &obj_rtld);
3036                 if (res == 0) {
3037                     def = req.sym_out;
3038                     defobj = req.defobj_out;
3039                 }
3040             }
3041         }
3042         else {
3043             /* Search the whole DAG rooted at the given object. */
3044             res = symlook_list(&req, &obj->dagmembers, &donelist);
3045             if (res == 0) {
3046                 def = req.sym_out;
3047                 defobj = req.defobj_out;
3048             }
3049         }
3050     }
3051
3052     if (def != NULL) {
3053         lock_release(rtld_bind_lock, &lockstate);
3054
3055         /*
3056          * The value required by the caller is derived from the value
3057          * of the symbol. For the ia64 architecture, we need to
3058          * construct a function descriptor which the caller can use to
3059          * call the function with the right 'gp' value. For other
3060          * architectures and for non-functions, the value is simply
3061          * the relocated value of the symbol.
3062          */
3063         if (ELF_ST_TYPE(def->st_info) == STT_FUNC)
3064             return (make_function_pointer(def, defobj));
3065         else if (ELF_ST_TYPE(def->st_info) == STT_GNU_IFUNC)
3066             return (rtld_resolve_ifunc(defobj, def));
3067         else if (ELF_ST_TYPE(def->st_info) == STT_TLS) {
3068 #ifdef __ia64__
3069             return (__tls_get_addr(defobj->tlsindex, def->st_value));
3070 #else
3071             ti.ti_module = defobj->tlsindex;
3072             ti.ti_offset = def->st_value;
3073             return (__tls_get_addr(&ti));
3074 #endif
3075         } else
3076             return (defobj->relocbase + def->st_value);
3077     }
3078
3079     _rtld_error("Undefined symbol \"%s\"", name);
3080     lock_release(rtld_bind_lock, &lockstate);
3081     return NULL;
3082 }
3083
3084 void *
3085 dlsym(void *handle, const char *name)
3086 {
3087         return do_dlsym(handle, name, __builtin_return_address(0), NULL,
3088             SYMLOOK_DLSYM);
3089 }
3090
3091 dlfunc_t
3092 dlfunc(void *handle, const char *name)
3093 {
3094         union {
3095                 void *d;
3096                 dlfunc_t f;
3097         } rv;
3098
3099         rv.d = do_dlsym(handle, name, __builtin_return_address(0), NULL,
3100             SYMLOOK_DLSYM);
3101         return (rv.f);
3102 }
3103
3104 void *
3105 dlvsym(void *handle, const char *name, const char *version)
3106 {
3107         Ver_Entry ventry;
3108
3109         ventry.name = version;
3110         ventry.file = NULL;
3111         ventry.hash = elf_hash(version);
3112         ventry.flags= 0;
3113         return do_dlsym(handle, name, __builtin_return_address(0), &ventry,
3114             SYMLOOK_DLSYM);
3115 }
3116
3117 int
3118 _rtld_addr_phdr(const void *addr, struct dl_phdr_info *phdr_info)
3119 {
3120     const Obj_Entry *obj;
3121     RtldLockState lockstate;
3122
3123     rlock_acquire(rtld_bind_lock, &lockstate);
3124     obj = obj_from_addr(addr);
3125     if (obj == NULL) {
3126         _rtld_error("No shared object contains address");
3127         lock_release(rtld_bind_lock, &lockstate);
3128         return (0);
3129     }
3130     rtld_fill_dl_phdr_info(obj, phdr_info);
3131     lock_release(rtld_bind_lock, &lockstate);
3132     return (1);
3133 }
3134
3135 int
3136 dladdr(const void *addr, Dl_info *info)
3137 {
3138     const Obj_Entry *obj;
3139     const Elf_Sym *def;
3140     void *symbol_addr;
3141     unsigned long symoffset;
3142     RtldLockState lockstate;
3143
3144     rlock_acquire(rtld_bind_lock, &lockstate);
3145     obj = obj_from_addr(addr);
3146     if (obj == NULL) {
3147         _rtld_error("No shared object contains address");
3148         lock_release(rtld_bind_lock, &lockstate);
3149         return 0;
3150     }
3151     info->dli_fname = obj->path;
3152     info->dli_fbase = obj->mapbase;
3153     info->dli_saddr = (void *)0;
3154     info->dli_sname = NULL;
3155
3156     /*
3157      * Walk the symbol list looking for the symbol whose address is
3158      * closest to the address sent in.
3159      */
3160     for (symoffset = 0; symoffset < obj->dynsymcount; symoffset++) {
3161         def = obj->symtab + symoffset;
3162
3163         /*
3164          * For skip the symbol if st_shndx is either SHN_UNDEF or
3165          * SHN_COMMON.
3166          */
3167         if (def->st_shndx == SHN_UNDEF || def->st_shndx == SHN_COMMON)
3168             continue;
3169
3170         /*
3171          * If the symbol is greater than the specified address, or if it
3172          * is further away from addr than the current nearest symbol,
3173          * then reject it.
3174          */
3175         symbol_addr = obj->relocbase + def->st_value;
3176         if (symbol_addr > addr || symbol_addr < info->dli_saddr)
3177             continue;
3178
3179         /* Update our idea of the nearest symbol. */
3180         info->dli_sname = obj->strtab + def->st_name;
3181         info->dli_saddr = symbol_addr;
3182
3183         /* Exact match? */
3184         if (info->dli_saddr == addr)
3185             break;
3186     }
3187     lock_release(rtld_bind_lock, &lockstate);
3188     return 1;
3189 }
3190
3191 int
3192 dlinfo(void *handle, int request, void *p)
3193 {
3194     const Obj_Entry *obj;
3195     RtldLockState lockstate;
3196     int error;
3197
3198     rlock_acquire(rtld_bind_lock, &lockstate);
3199
3200     if (handle == NULL || handle == RTLD_SELF) {
3201         void *retaddr;
3202
3203         retaddr = __builtin_return_address(0);  /* __GNUC__ only */
3204         if ((obj = obj_from_addr(retaddr)) == NULL)
3205             _rtld_error("Cannot determine caller's shared object");
3206     } else
3207         obj = dlcheck(handle);
3208
3209     if (obj == NULL) {
3210         lock_release(rtld_bind_lock, &lockstate);
3211         return (-1);
3212     }
3213
3214     error = 0;
3215     switch (request) {
3216     case RTLD_DI_LINKMAP:
3217         *((struct link_map const **)p) = &obj->linkmap;
3218         break;
3219     case RTLD_DI_ORIGIN:
3220         error = rtld_dirname(obj->path, p);
3221         break;
3222
3223     case RTLD_DI_SERINFOSIZE:
3224     case RTLD_DI_SERINFO:
3225         error = do_search_info(obj, request, (struct dl_serinfo *)p);
3226         break;
3227
3228     default:
3229         _rtld_error("Invalid request %d passed to dlinfo()", request);
3230         error = -1;
3231     }
3232
3233     lock_release(rtld_bind_lock, &lockstate);
3234
3235     return (error);
3236 }
3237
3238 static void
3239 rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info)
3240 {
3241
3242         phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase;
3243         phdr_info->dlpi_name = STAILQ_FIRST(&obj->names) ?
3244             STAILQ_FIRST(&obj->names)->name : obj->path;
3245         phdr_info->dlpi_phdr = obj->phdr;
3246         phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]);
3247         phdr_info->dlpi_tls_modid = obj->tlsindex;
3248         phdr_info->dlpi_tls_data = obj->tlsinit;
3249         phdr_info->dlpi_adds = obj_loads;
3250         phdr_info->dlpi_subs = obj_loads - obj_count;
3251 }
3252
3253 int
3254 dl_iterate_phdr(__dl_iterate_hdr_callback callback, void *param)
3255 {
3256     struct dl_phdr_info phdr_info;
3257     const Obj_Entry *obj;
3258     RtldLockState bind_lockstate, phdr_lockstate;
3259     int error;
3260
3261     wlock_acquire(rtld_phdr_lock, &phdr_lockstate);
3262     rlock_acquire(rtld_bind_lock, &bind_lockstate);
3263
3264     error = 0;
3265
3266     for (obj = obj_list;  obj != NULL;  obj = obj->next) {
3267         rtld_fill_dl_phdr_info(obj, &phdr_info);
3268         if ((error = callback(&phdr_info, sizeof phdr_info, param)) != 0)
3269                 break;
3270
3271     }
3272     lock_release(rtld_bind_lock, &bind_lockstate);
3273     lock_release(rtld_phdr_lock, &phdr_lockstate);
3274
3275     return (error);
3276 }
3277
3278 static void *
3279 fill_search_info(const char *dir, size_t dirlen, void *param)
3280 {
3281     struct fill_search_info_args *arg;
3282
3283     arg = param;
3284
3285     if (arg->request == RTLD_DI_SERINFOSIZE) {
3286         arg->serinfo->dls_cnt ++;
3287         arg->serinfo->dls_size += sizeof(struct dl_serpath) + dirlen + 1;
3288     } else {
3289         struct dl_serpath *s_entry;
3290
3291         s_entry = arg->serpath;
3292         s_entry->dls_name  = arg->strspace;
3293         s_entry->dls_flags = arg->flags;
3294
3295         strncpy(arg->strspace, dir, dirlen);
3296         arg->strspace[dirlen] = '\0';
3297
3298         arg->strspace += dirlen + 1;
3299         arg->serpath++;
3300     }
3301
3302     return (NULL);
3303 }
3304
3305 static int
3306 do_search_info(const Obj_Entry *obj, int request, struct dl_serinfo *info)
3307 {
3308     struct dl_serinfo _info;
3309     struct fill_search_info_args args;
3310
3311     args.request = RTLD_DI_SERINFOSIZE;
3312     args.serinfo = &_info;
3313
3314     _info.dls_size = __offsetof(struct dl_serinfo, dls_serpath);
3315     _info.dls_cnt  = 0;
3316
3317     path_enumerate(obj->rpath, fill_search_info, &args);
3318     path_enumerate(ld_library_path, fill_search_info, &args);
3319     path_enumerate(obj->runpath, fill_search_info, &args);
3320     path_enumerate(gethints(obj->z_nodeflib), fill_search_info, &args);
3321     if (!obj->z_nodeflib)
3322       path_enumerate(STANDARD_LIBRARY_PATH, fill_search_info, &args);
3323
3324
3325     if (request == RTLD_DI_SERINFOSIZE) {
3326         info->dls_size = _info.dls_size;
3327         info->dls_cnt = _info.dls_cnt;
3328         return (0);
3329     }
3330
3331     if (info->dls_cnt != _info.dls_cnt || info->dls_size != _info.dls_size) {
3332         _rtld_error("Uninitialized Dl_serinfo struct passed to dlinfo()");
3333         return (-1);
3334     }
3335
3336     args.request  = RTLD_DI_SERINFO;
3337     args.serinfo  = info;
3338     args.serpath  = &info->dls_serpath[0];
3339     args.strspace = (char *)&info->dls_serpath[_info.dls_cnt];
3340
3341     args.flags = LA_SER_RUNPATH;
3342     if (path_enumerate(obj->rpath, fill_search_info, &args) != NULL)
3343         return (-1);
3344
3345     args.flags = LA_SER_LIBPATH;
3346     if (path_enumerate(ld_library_path, fill_search_info, &args) != NULL)
3347         return (-1);
3348
3349     args.flags = LA_SER_RUNPATH;
3350     if (path_enumerate(obj->runpath, fill_search_info, &args) != NULL)
3351         return (-1);
3352
3353     args.flags = LA_SER_CONFIG;
3354     if (path_enumerate(gethints(obj->z_nodeflib), fill_search_info, &args)
3355       != NULL)
3356         return (-1);
3357
3358     args.flags = LA_SER_DEFAULT;
3359     if (!obj->z_nodeflib &&
3360       path_enumerate(STANDARD_LIBRARY_PATH, fill_search_info, &args) != NULL)
3361         return (-1);
3362     return (0);
3363 }
3364
3365 static int
3366 rtld_dirname(const char *path, char *bname)
3367 {
3368     const char *endp;
3369
3370     /* Empty or NULL string gets treated as "." */
3371     if (path == NULL || *path == '\0') {
3372         bname[0] = '.';
3373         bname[1] = '\0';
3374         return (0);
3375     }
3376
3377     /* Strip trailing slashes */
3378     endp = path + strlen(path) - 1;
3379     while (endp > path && *endp == '/')
3380         endp--;
3381
3382     /* Find the start of the dir */
3383     while (endp > path && *endp != '/')
3384         endp--;
3385
3386     /* Either the dir is "/" or there are no slashes */
3387     if (endp == path) {
3388         bname[0] = *endp == '/' ? '/' : '.';
3389         bname[1] = '\0';
3390         return (0);
3391     } else {
3392         do {
3393             endp--;
3394         } while (endp > path && *endp == '/');
3395     }
3396
3397     if (endp - path + 2 > PATH_MAX)
3398     {
3399         _rtld_error("Filename is too long: %s", path);
3400         return(-1);
3401     }
3402
3403     strncpy(bname, path, endp - path + 1);
3404     bname[endp - path + 1] = '\0';
3405     return (0);
3406 }
3407
3408 static int
3409 rtld_dirname_abs(const char *path, char *base)
3410 {
3411         char base_rel[PATH_MAX];
3412
3413         if (rtld_dirname(path, base) == -1)
3414                 return (-1);
3415         if (base[0] == '/')
3416                 return (0);
3417         if (getcwd(base_rel, sizeof(base_rel)) == NULL ||
3418             strlcat(base_rel, "/", sizeof(base_rel)) >= sizeof(base_rel) ||
3419             strlcat(base_rel, base, sizeof(base_rel)) >= sizeof(base_rel))
3420                 return (-1);
3421         strcpy(base, base_rel);
3422         return (0);
3423 }
3424
3425 static void
3426 linkmap_add(Obj_Entry *obj)
3427 {
3428     struct link_map *l = &obj->linkmap;
3429     struct link_map *prev;
3430
3431     obj->linkmap.l_name = obj->path;
3432     obj->linkmap.l_addr = obj->mapbase;
3433     obj->linkmap.l_ld = obj->dynamic;
3434 #ifdef __mips__
3435     /* GDB needs load offset on MIPS to use the symbols */
3436     obj->linkmap.l_offs = obj->relocbase;
3437 #endif
3438
3439     if (r_debug.r_map == NULL) {
3440         r_debug.r_map = l;
3441         return;
3442     }
3443
3444     /*
3445      * Scan to the end of the list, but not past the entry for the
3446      * dynamic linker, which we want to keep at the very end.
3447      */
3448     for (prev = r_debug.r_map;
3449       prev->l_next != NULL && prev->l_next != &obj_rtld.linkmap;
3450       prev = prev->l_next)
3451         ;
3452
3453     /* Link in the new entry. */
3454     l->l_prev = prev;
3455     l->l_next = prev->l_next;
3456     if (l->l_next != NULL)
3457         l->l_next->l_prev = l;
3458     prev->l_next = l;
3459 }
3460
3461 static void
3462 linkmap_delete(Obj_Entry *obj)
3463 {
3464     struct link_map *l = &obj->linkmap;
3465
3466     if (l->l_prev == NULL) {
3467         if ((r_debug.r_map = l->l_next) != NULL)
3468             l->l_next->l_prev = NULL;
3469         return;
3470     }
3471
3472     if ((l->l_prev->l_next = l->l_next) != NULL)
3473         l->l_next->l_prev = l->l_prev;
3474 }
3475
3476 /*
3477  * Function for the debugger to set a breakpoint on to gain control.
3478  *
3479  * The two parameters allow the debugger to easily find and determine
3480  * what the runtime loader is doing and to whom it is doing it.
3481  *
3482  * When the loadhook trap is hit (r_debug_state, set at program
3483  * initialization), the arguments can be found on the stack:
3484  *
3485  *  +8   struct link_map *m
3486  *  +4   struct r_debug  *rd
3487  *  +0   RetAddr
3488  */
3489 void
3490 r_debug_state(struct r_debug* rd, struct link_map *m)
3491 {
3492     /*
3493      * The following is a hack to force the compiler to emit calls to
3494      * this function, even when optimizing.  If the function is empty,
3495      * the compiler is not obliged to emit any code for calls to it,
3496      * even when marked __noinline.  However, gdb depends on those
3497      * calls being made.
3498      */
3499     __asm __volatile("" : : : "memory");
3500 }
3501
3502 /*
3503  * Get address of the pointer variable in the main program.
3504  * Prefer non-weak symbol over the weak one.
3505  */
3506 static const void **
3507 get_program_var_addr(const char *name, RtldLockState *lockstate)
3508 {
3509     SymLook req;
3510     DoneList donelist;
3511
3512     symlook_init(&req, name);
3513     req.lockstate = lockstate;
3514     donelist_init(&donelist);
3515     if (symlook_global(&req, &donelist) != 0)
3516         return (NULL);
3517     if (ELF_ST_TYPE(req.sym_out->st_info) == STT_FUNC)
3518         return ((const void **)make_function_pointer(req.sym_out,
3519           req.defobj_out));
3520     else if (ELF_ST_TYPE(req.sym_out->st_info) == STT_GNU_IFUNC)
3521         return ((const void **)rtld_resolve_ifunc(req.defobj_out, req.sym_out));
3522     else
3523         return ((const void **)(req.defobj_out->relocbase +
3524           req.sym_out->st_value));
3525 }
3526
3527 /*
3528  * Set a pointer variable in the main program to the given value.  This
3529  * is used to set key variables such as "environ" before any of the
3530  * init functions are called.
3531  */
3532 static void
3533 set_program_var(const char *name, const void *value)
3534 {
3535     const void **addr;
3536
3537     if ((addr = get_program_var_addr(name, NULL)) != NULL) {
3538         dbg("\"%s\": *%p <-- %p", name, addr, value);
3539         *addr = value;
3540     }
3541 }
3542
3543 /*
3544  * Search the global objects, including dependencies and main object,
3545  * for the given symbol.
3546  */
3547 static int
3548 symlook_global(SymLook *req, DoneList *donelist)
3549 {
3550     SymLook req1;
3551     const Objlist_Entry *elm;
3552     int res;
3553
3554     symlook_init_from_req(&req1, req);
3555
3556     /* Search all objects loaded at program start up. */
3557     if (req->defobj_out == NULL ||
3558       ELF_ST_BIND(req->sym_out->st_info) == STB_WEAK) {
3559         res = symlook_list(&req1, &list_main, donelist);
3560         if (res == 0 && (req->defobj_out == NULL ||
3561           ELF_ST_BIND(req1.sym_out->st_info) != STB_WEAK)) {
3562             req->sym_out = req1.sym_out;
3563             req->defobj_out = req1.defobj_out;
3564             assert(req->defobj_out != NULL);
3565         }
3566     }
3567
3568     /* Search all DAGs whose roots are RTLD_GLOBAL objects. */
3569     STAILQ_FOREACH(elm, &list_global, link) {
3570         if (req->defobj_out != NULL &&
3571           ELF_ST_BIND(req->sym_out->st_info) != STB_WEAK)
3572             break;
3573         res = symlook_list(&req1, &elm->obj->dagmembers, donelist);
3574         if (res == 0 && (req->defobj_out == NULL ||
3575           ELF_ST_BIND(req1.sym_out->st_info) != STB_WEAK)) {
3576             req->sym_out = req1.sym_out;
3577             req->defobj_out = req1.defobj_out;
3578             assert(req->defobj_out != NULL);
3579         }
3580     }
3581
3582     return (req->sym_out != NULL ? 0 : ESRCH);
3583 }
3584
3585 /*
3586  * Given a symbol name in a referencing object, find the corresponding
3587  * definition of the symbol.  Returns a pointer to the symbol, or NULL if
3588  * no definition was found.  Returns a pointer to the Obj_Entry of the
3589  * defining object via the reference parameter DEFOBJ_OUT.
3590  */
3591 static int
3592 symlook_default(SymLook *req, const Obj_Entry *refobj)
3593 {
3594     DoneList donelist;
3595     const Objlist_Entry *elm;
3596     SymLook req1;
3597     int res;
3598
3599     donelist_init(&donelist);
3600     symlook_init_from_req(&req1, req);
3601
3602     /* Look first in the referencing object if linked symbolically. */
3603     if (refobj->symbolic && !donelist_check(&donelist, refobj)) {
3604         res = symlook_obj(&req1, refobj);
3605         if (res == 0) {
3606             req->sym_out = req1.sym_out;
3607             req->defobj_out = req1.defobj_out;
3608             assert(req->defobj_out != NULL);
3609         }
3610     }
3611
3612     symlook_global(req, &donelist);
3613
3614     /* Search all dlopened DAGs containing the referencing object. */
3615     STAILQ_FOREACH(elm, &refobj->dldags, link) {
3616         if (req->sym_out != NULL &&
3617           ELF_ST_BIND(req->sym_out->st_info) != STB_WEAK)
3618             break;
3619         res = symlook_list(&req1, &elm->obj->dagmembers, &donelist);
3620         if (res == 0 && (req->sym_out == NULL ||
3621           ELF_ST_BIND(req1.sym_out->st_info) != STB_WEAK)) {
3622             req->sym_out = req1.sym_out;
3623             req->defobj_out = req1.defobj_out;
3624             assert(req->defobj_out != NULL);
3625         }
3626     }
3627
3628     /*
3629      * Search the dynamic linker itself, and possibly resolve the
3630      * symbol from there.  This is how the application links to
3631      * dynamic linker services such as dlopen.
3632      */
3633     if (req->sym_out == NULL ||
3634       ELF_ST_BIND(req->sym_out->st_info) == STB_WEAK) {
3635         res = symlook_obj(&req1, &obj_rtld);
3636         if (res == 0) {
3637             req->sym_out = req1.sym_out;
3638             req->defobj_out = req1.defobj_out;
3639             assert(req->defobj_out != NULL);
3640         }
3641     }
3642
3643     return (req->sym_out != NULL ? 0 : ESRCH);
3644 }
3645
3646 static int
3647 symlook_list(SymLook *req, const Objlist *objlist, DoneList *dlp)
3648 {
3649     const Elf_Sym *def;
3650     const Obj_Entry *defobj;
3651     const Objlist_Entry *elm;
3652     SymLook req1;
3653     int res;
3654
3655     def = NULL;
3656     defobj = NULL;
3657     STAILQ_FOREACH(elm, objlist, link) {
3658         if (donelist_check(dlp, elm->obj))
3659             continue;
3660         symlook_init_from_req(&req1, req);
3661         if ((res = symlook_obj(&req1, elm->obj)) == 0) {
3662             if (def == NULL || ELF_ST_BIND(req1.sym_out->st_info) != STB_WEAK) {
3663                 def = req1.sym_out;
3664                 defobj = req1.defobj_out;
3665                 if (ELF_ST_BIND(def->st_info) != STB_WEAK)
3666                     break;
3667             }
3668         }
3669     }
3670     if (def != NULL) {
3671         req->sym_out = def;
3672         req->defobj_out = defobj;
3673         return (0);
3674     }
3675     return (ESRCH);
3676 }
3677
3678 /*
3679  * Search the chain of DAGS cointed to by the given Needed_Entry
3680  * for a symbol of the given name.  Each DAG is scanned completely
3681  * before advancing to the next one.  Returns a pointer to the symbol,
3682  * or NULL if no definition was found.
3683  */
3684 static int
3685 symlook_needed(SymLook *req, const Needed_Entry *needed, DoneList *dlp)
3686 {
3687     const Elf_Sym *def;
3688     const Needed_Entry *n;
3689     const Obj_Entry *defobj;
3690     SymLook req1;
3691     int res;
3692
3693     def = NULL;
3694     defobj = NULL;
3695     symlook_init_from_req(&req1, req);
3696     for (n = needed; n != NULL; n = n->next) {
3697         if (n->obj == NULL ||
3698             (res = symlook_list(&req1, &n->obj->dagmembers, dlp)) != 0)
3699             continue;
3700         if (def == NULL || ELF_ST_BIND(req1.sym_out->st_info) != STB_WEAK) {
3701             def = req1.sym_out;
3702             defobj = req1.defobj_out;
3703             if (ELF_ST_BIND(def->st_info) != STB_WEAK)
3704                 break;
3705         }
3706     }
3707     if (def != NULL) {
3708         req->sym_out = def;
3709         req->defobj_out = defobj;
3710         return (0);
3711     }
3712     return (ESRCH);
3713 }
3714
3715 /*
3716  * Search the symbol table of a single shared object for a symbol of
3717  * the given name and version, if requested.  Returns a pointer to the
3718  * symbol, or NULL if no definition was found.  If the object is
3719  * filter, return filtered symbol from filtee.
3720  *
3721  * The symbol's hash value is passed in for efficiency reasons; that
3722  * eliminates many recomputations of the hash value.
3723  */
3724 int
3725 symlook_obj(SymLook *req, const Obj_Entry *obj)
3726 {
3727     DoneList donelist;
3728     SymLook req1;
3729     int flags, res, mres;
3730
3731     /*
3732      * If there is at least one valid hash at this point, we prefer to
3733      * use the faster GNU version if available.
3734      */
3735     if (obj->valid_hash_gnu)
3736         mres = symlook_obj1_gnu(req, obj);
3737     else if (obj->valid_hash_sysv)
3738         mres = symlook_obj1_sysv(req, obj);
3739     else
3740         return (EINVAL);
3741
3742     if (mres == 0) {
3743         if (obj->needed_filtees != NULL) {
3744             flags = (req->flags & SYMLOOK_EARLY) ? RTLD_LO_EARLY : 0;
3745             load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate);
3746             donelist_init(&donelist);
3747             symlook_init_from_req(&req1, req);
3748             res = symlook_needed(&req1, obj->needed_filtees, &donelist);
3749             if (res == 0) {
3750                 req->sym_out = req1.sym_out;
3751                 req->defobj_out = req1.defobj_out;
3752             }
3753             return (res);
3754         }
3755         if (obj->needed_aux_filtees != NULL) {
3756             flags = (req->flags & SYMLOOK_EARLY) ? RTLD_LO_EARLY : 0;
3757             load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate);
3758             donelist_init(&donelist);
3759             symlook_init_from_req(&req1, req);
3760             res = symlook_needed(&req1, obj->needed_aux_filtees, &donelist);
3761             if (res == 0) {
3762                 req->sym_out = req1.sym_out;
3763                 req->defobj_out = req1.defobj_out;
3764                 return (res);
3765             }
3766         }
3767     }
3768     return (mres);
3769 }
3770
3771 /* Symbol match routine common to both hash functions */
3772 static bool
3773 matched_symbol(SymLook *req, const Obj_Entry *obj, Sym_Match_Result *result,
3774     const unsigned long symnum)
3775 {
3776         Elf_Versym verndx;
3777         const Elf_Sym *symp;
3778         const char *strp;
3779
3780         symp = obj->symtab + symnum;
3781         strp = obj->strtab + symp->st_name;
3782
3783         switch (ELF_ST_TYPE(symp->st_info)) {
3784         case STT_FUNC:
3785         case STT_NOTYPE:
3786         case STT_OBJECT:
3787         case STT_COMMON:
3788         case STT_GNU_IFUNC:
3789                 if (symp->st_value == 0)
3790                         return (false);
3791                 /* fallthrough */
3792         case STT_TLS:
3793                 if (symp->st_shndx != SHN_UNDEF)
3794                         break;
3795 #ifndef __mips__
3796                 else if (((req->flags & SYMLOOK_IN_PLT) == 0) &&
3797                     (ELF_ST_TYPE(symp->st_info) == STT_FUNC))
3798                         break;
3799                 /* fallthrough */
3800 #endif
3801         default:
3802                 return (false);
3803         }
3804         if (req->name[0] != strp[0] || strcmp(req->name, strp) != 0)
3805                 return (false);
3806
3807         if (req->ventry == NULL) {
3808                 if (obj->versyms != NULL) {
3809                         verndx = VER_NDX(obj->versyms[symnum]);
3810                         if (verndx > obj->vernum) {
3811                                 _rtld_error(
3812                                     "%s: symbol %s references wrong version %d",
3813                                     obj->path, obj->strtab + symnum, verndx);
3814                                 return (false);
3815                         }
3816                         /*
3817                          * If we are not called from dlsym (i.e. this
3818                          * is a normal relocation from unversioned
3819                          * binary), accept the symbol immediately if
3820                          * it happens to have first version after this
3821                          * shared object became versioned.  Otherwise,
3822                          * if symbol is versioned and not hidden,
3823                          * remember it. If it is the only symbol with
3824                          * this name exported by the shared object, it
3825                          * will be returned as a match by the calling
3826                          * function. If symbol is global (verndx < 2)
3827                          * accept it unconditionally.
3828                          */
3829                         if ((req->flags & SYMLOOK_DLSYM) == 0 &&
3830                             verndx == VER_NDX_GIVEN) {
3831                                 result->sym_out = symp;
3832                                 return (true);
3833                         }
3834                         else if (verndx >= VER_NDX_GIVEN) {
3835                                 if ((obj->versyms[symnum] & VER_NDX_HIDDEN)
3836                                     == 0) {
3837                                         if (result->vsymp == NULL)
3838                                                 result->vsymp = symp;
3839                                         result->vcount++;
3840                                 }
3841                                 return (false);
3842                         }
3843                 }
3844                 result->sym_out = symp;
3845                 return (true);
3846         }
3847         if (obj->versyms == NULL) {
3848                 if (object_match_name(obj, req->ventry->name)) {
3849                         _rtld_error("%s: object %s should provide version %s "
3850                             "for symbol %s", obj_rtld.path, obj->path,
3851                             req->ventry->name, obj->strtab + symnum);
3852                         return (false);
3853                 }
3854         } else {
3855                 verndx = VER_NDX(obj->versyms[symnum]);
3856                 if (verndx > obj->vernum) {
3857                         _rtld_error("%s: symbol %s references wrong version %d",
3858                             obj->path, obj->strtab + symnum, verndx);
3859                         return (false);
3860                 }
3861                 if (obj->vertab[verndx].hash != req->ventry->hash ||
3862                     strcmp(obj->vertab[verndx].name, req->ventry->name)) {
3863                         /*
3864                          * Version does not match. Look if this is a
3865                          * global symbol and if it is not hidden. If
3866                          * global symbol (verndx < 2) is available,
3867                          * use it. Do not return symbol if we are
3868                          * called by dlvsym, because dlvsym looks for
3869                          * a specific version and default one is not
3870                          * what dlvsym wants.
3871                          */
3872                         if ((req->flags & SYMLOOK_DLSYM) ||
3873                             (verndx >= VER_NDX_GIVEN) ||
3874                             (obj->versyms[symnum] & VER_NDX_HIDDEN))
3875                                 return (false);
3876                 }
3877         }
3878         result->sym_out = symp;
3879         return (true);
3880 }
3881
3882 /*
3883  * Search for symbol using SysV hash function.
3884  * obj->buckets is known not to be NULL at this point; the test for this was
3885  * performed with the obj->valid_hash_sysv assignment.
3886  */
3887 static int
3888 symlook_obj1_sysv(SymLook *req, const Obj_Entry *obj)
3889 {
3890         unsigned long symnum;
3891         Sym_Match_Result matchres;
3892
3893         matchres.sym_out = NULL;
3894         matchres.vsymp = NULL;
3895         matchres.vcount = 0;
3896
3897         for (symnum = obj->buckets[req->hash % obj->nbuckets];
3898             symnum != STN_UNDEF; symnum = obj->chains[symnum]) {
3899                 if (symnum >= obj->nchains)
3900                         return (ESRCH); /* Bad object */
3901
3902                 if (matched_symbol(req, obj, &matchres, symnum)) {
3903                         req->sym_out = matchres.sym_out;
3904                         req->defobj_out = obj;
3905                         return (0);
3906                 }
3907         }
3908         if (matchres.vcount == 1) {
3909                 req->sym_out = matchres.vsymp;
3910                 req->defobj_out = obj;
3911                 return (0);
3912         }
3913         return (ESRCH);
3914 }
3915
3916 /* Search for symbol using GNU hash function */
3917 static int
3918 symlook_obj1_gnu(SymLook *req, const Obj_Entry *obj)
3919 {
3920         Elf_Addr bloom_word;
3921         const Elf32_Word *hashval;
3922         Elf32_Word bucket;
3923         Sym_Match_Result matchres;
3924         unsigned int h1, h2;
3925         unsigned long symnum;
3926
3927         matchres.sym_out = NULL;
3928         matchres.vsymp = NULL;
3929         matchres.vcount = 0;
3930
3931         /* Pick right bitmask word from Bloom filter array */
3932         bloom_word = obj->bloom_gnu[(req->hash_gnu / __ELF_WORD_SIZE) &
3933             obj->maskwords_bm_gnu];
3934
3935         /* Calculate modulus word size of gnu hash and its derivative */
3936         h1 = req->hash_gnu & (__ELF_WORD_SIZE - 1);
3937         h2 = ((req->hash_gnu >> obj->shift2_gnu) & (__ELF_WORD_SIZE - 1));
3938
3939         /* Filter out the "definitely not in set" queries */
3940         if (((bloom_word >> h1) & (bloom_word >> h2) & 1) == 0)
3941                 return (ESRCH);
3942
3943         /* Locate hash chain and corresponding value element*/
3944         bucket = obj->buckets_gnu[req->hash_gnu % obj->nbuckets_gnu];
3945         if (bucket == 0)
3946                 return (ESRCH);
3947         hashval = &obj->chain_zero_gnu[bucket];
3948         do {
3949                 if (((*hashval ^ req->hash_gnu) >> 1) == 0) {
3950                         symnum = hashval - obj->chain_zero_gnu;
3951                         if (matched_symbol(req, obj, &matchres, symnum)) {
3952                                 req->sym_out = matchres.sym_out;
3953                                 req->defobj_out = obj;
3954                                 return (0);
3955                         }
3956                 }
3957         } while ((*hashval++ & 1) == 0);
3958         if (matchres.vcount == 1) {
3959                 req->sym_out = matchres.vsymp;
3960                 req->defobj_out = obj;
3961                 return (0);
3962         }
3963         return (ESRCH);
3964 }
3965
3966 static void
3967 trace_loaded_objects(Obj_Entry *obj)
3968 {
3969     char        *fmt1, *fmt2, *fmt, *main_local, *list_containers;
3970     int         c;
3971
3972     if ((main_local = getenv(LD_ "TRACE_LOADED_OBJECTS_PROGNAME")) == NULL)
3973         main_local = "";
3974
3975     if ((fmt1 = getenv(LD_ "TRACE_LOADED_OBJECTS_FMT1")) == NULL)
3976         fmt1 = "\t%o => %p (%x)\n";
3977
3978     if ((fmt2 = getenv(LD_ "TRACE_LOADED_OBJECTS_FMT2")) == NULL)
3979         fmt2 = "\t%o (%x)\n";
3980
3981     list_containers = getenv(LD_ "TRACE_LOADED_OBJECTS_ALL");
3982
3983     for (; obj; obj = obj->next) {
3984         Needed_Entry            *needed;
3985         char                    *name, *path;
3986         bool                    is_lib;
3987
3988         if (list_containers && obj->needed != NULL)
3989             rtld_printf("%s:\n", obj->path);
3990         for (needed = obj->needed; needed; needed = needed->next) {
3991             if (needed->obj != NULL) {
3992                 if (needed->obj->traced && !list_containers)
3993                     continue;
3994                 needed->obj->traced = true;
3995                 path = needed->obj->path;
3996             } else
3997                 path = "not found";
3998
3999             name = (char *)obj->strtab + needed->name;
4000             is_lib = strncmp(name, "lib", 3) == 0;      /* XXX - bogus */
4001
4002             fmt = is_lib ? fmt1 : fmt2;
4003             while ((c = *fmt++) != '\0') {
4004                 switch (c) {
4005                 default:
4006                     rtld_putchar(c);
4007                     continue;
4008                 case '\\':
4009                     switch (c = *fmt) {
4010                     case '\0':
4011                         continue;
4012                     case 'n':
4013                         rtld_putchar('\n');
4014                         break;
4015                     case 't':
4016                         rtld_putchar('\t');
4017                         break;
4018                     }
4019                     break;
4020                 case '%':
4021                     switch (c = *fmt) {
4022                     case '\0':
4023                         continue;
4024                     case '%':
4025                     default:
4026                         rtld_putchar(c);
4027                         break;
4028                     case 'A':
4029                         rtld_putstr(main_local);
4030                         break;
4031                     case 'a':
4032                         rtld_putstr(obj_main->path);
4033                         break;
4034                     case 'o':
4035                         rtld_putstr(name);
4036                         break;
4037 #if 0
4038                     case 'm':
4039                         rtld_printf("%d", sodp->sod_major);
4040                         break;
4041                     case 'n':
4042                         rtld_printf("%d", sodp->sod_minor);
4043                         break;
4044 #endif
4045                     case 'p':
4046                         rtld_putstr(path);
4047                         break;
4048                     case 'x':
4049                         rtld_printf("%p", needed->obj ? needed->obj->mapbase :
4050                           0);
4051                         break;
4052                     }
4053                     break;
4054                 }
4055                 ++fmt;
4056             }
4057         }
4058     }
4059 }
4060
4061 /*
4062  * Unload a dlopened object and its dependencies from memory and from
4063  * our data structures.  It is assumed that the DAG rooted in the
4064  * object has already been unreferenced, and that the object has a
4065  * reference count of 0.
4066  */
4067 static void
4068 unload_object(Obj_Entry *root)
4069 {
4070     Obj_Entry *obj;
4071     Obj_Entry **linkp;
4072
4073     assert(root->refcount == 0);
4074
4075     /*
4076      * Pass over the DAG removing unreferenced objects from
4077      * appropriate lists.
4078      */
4079     unlink_object(root);
4080
4081     /* Unmap all objects that are no longer referenced. */
4082     linkp = &obj_list->next;
4083     while ((obj = *linkp) != NULL) {
4084         if (obj->refcount == 0) {
4085             LD_UTRACE(UTRACE_UNLOAD_OBJECT, obj, obj->mapbase, obj->mapsize, 0,
4086                 obj->path);
4087             dbg("unloading \"%s\"", obj->path);
4088             unload_filtees(root);
4089             munmap(obj->mapbase, obj->mapsize);
4090             linkmap_delete(obj);
4091             *linkp = obj->next;
4092             obj_count--;
4093             obj_free(obj);
4094         } else
4095             linkp = &obj->next;
4096     }
4097     obj_tail = linkp;
4098 }
4099
4100 static void
4101 unlink_object(Obj_Entry *root)
4102 {
4103     Objlist_Entry *elm;
4104
4105     if (root->refcount == 0) {
4106         /* Remove the object from the RTLD_GLOBAL list. */
4107         objlist_remove(&list_global, root);
4108
4109         /* Remove the object from all objects' DAG lists. */
4110         STAILQ_FOREACH(elm, &root->dagmembers, link) {
4111             objlist_remove(&elm->obj->dldags, root);
4112             if (elm->obj != root)
4113                 unlink_object(elm->obj);
4114         }
4115     }
4116 }
4117
4118 static void
4119 ref_dag(Obj_Entry *root)
4120 {
4121     Objlist_Entry *elm;
4122
4123     assert(root->dag_inited);
4124     STAILQ_FOREACH(elm, &root->dagmembers, link)
4125         elm->obj->refcount++;
4126 }
4127
4128 static void
4129 unref_dag(Obj_Entry *root)
4130 {
4131     Objlist_Entry *elm;
4132
4133     assert(root->dag_inited);
4134     STAILQ_FOREACH(elm, &root->dagmembers, link)
4135         elm->obj->refcount--;
4136 }
4137
4138 /*
4139  * Common code for MD __tls_get_addr().
4140  */
4141 static void *tls_get_addr_slow(Elf_Addr **, int, size_t) __noinline;
4142 static void *
4143 tls_get_addr_slow(Elf_Addr **dtvp, int index, size_t offset)
4144 {
4145     Elf_Addr *newdtv, *dtv;
4146     RtldLockState lockstate;
4147     int to_copy;
4148
4149     dtv = *dtvp;
4150     /* Check dtv generation in case new modules have arrived */
4151     if (dtv[0] != tls_dtv_generation) {
4152         wlock_acquire(rtld_bind_lock, &lockstate);
4153         newdtv = xcalloc(tls_max_index + 2, sizeof(Elf_Addr));
4154         to_copy = dtv[1];
4155         if (to_copy > tls_max_index)
4156             to_copy = tls_max_index;
4157         memcpy(&newdtv[2], &dtv[2], to_copy * sizeof(Elf_Addr));
4158         newdtv[0] = tls_dtv_generation;
4159         newdtv[1] = tls_max_index;
4160         free(dtv);
4161         lock_release(rtld_bind_lock, &lockstate);
4162         dtv = *dtvp = newdtv;
4163     }
4164
4165     /* Dynamically allocate module TLS if necessary */
4166     if (dtv[index + 1] == 0) {
4167         /* Signal safe, wlock will block out signals. */
4168         wlock_acquire(rtld_bind_lock, &lockstate);
4169         if (!dtv[index + 1])
4170             dtv[index + 1] = (Elf_Addr)allocate_module_tls(index);
4171         lock_release(rtld_bind_lock, &lockstate);
4172     }
4173     return ((void *)(dtv[index + 1] + offset));
4174 }
4175
4176 void *
4177 tls_get_addr_common(Elf_Addr **dtvp, int index, size_t offset)
4178 {
4179         Elf_Addr *dtv;
4180
4181         dtv = *dtvp;
4182         /* Check dtv generation in case new modules have arrived */
4183         if (__predict_true(dtv[0] == tls_dtv_generation &&
4184             dtv[index + 1] != 0))
4185                 return ((void *)(dtv[index + 1] + offset));
4186         return (tls_get_addr_slow(dtvp, index, offset));
4187 }
4188
4189 #if defined(__arm__) || defined(__ia64__) || defined(__mips__) || defined(__powerpc__)
4190
4191 /*
4192  * Allocate Static TLS using the Variant I method.
4193  */
4194 void *
4195 allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign)
4196 {
4197     Obj_Entry *obj;
4198     char *tcb;
4199     Elf_Addr **tls;
4200     Elf_Addr *dtv;
4201     Elf_Addr addr;
4202     int i;
4203
4204     if (oldtcb != NULL && tcbsize == TLS_TCB_SIZE)
4205         return (oldtcb);
4206
4207     assert(tcbsize >= TLS_TCB_SIZE);
4208     tcb = xcalloc(1, tls_static_space - TLS_TCB_SIZE + tcbsize);
4209     tls = (Elf_Addr **)(tcb + tcbsize - TLS_TCB_SIZE);
4210
4211     if (oldtcb != NULL) {
4212         memcpy(tls, oldtcb, tls_static_space);
4213         free(oldtcb);
4214
4215         /* Adjust the DTV. */
4216         dtv = tls[0];
4217         for (i = 0; i < dtv[1]; i++) {
4218             if (dtv[i+2] >= (Elf_Addr)oldtcb &&
4219                 dtv[i+2] < (Elf_Addr)oldtcb + tls_static_space) {
4220                 dtv[i+2] = dtv[i+2] - (Elf_Addr)oldtcb + (Elf_Addr)tls;
4221             }
4222         }
4223     } else {
4224         dtv = xcalloc(tls_max_index + 2, sizeof(Elf_Addr));
4225         tls[0] = dtv;
4226         dtv[0] = tls_dtv_generation;
4227         dtv[1] = tls_max_index;
4228
4229         for (obj = objs; obj; obj = obj->next) {
4230             if (obj->tlsoffset > 0) {
4231                 addr = (Elf_Addr)tls + obj->tlsoffset;
4232                 if (obj->tlsinitsize > 0)
4233                     memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize);
4234                 if (obj->tlssize > obj->tlsinitsize)
4235                     memset((void*) (addr + obj->tlsinitsize), 0,
4236                            obj->tlssize - obj->tlsinitsize);
4237                 dtv[obj->tlsindex + 1] = addr;
4238             }
4239         }
4240     }
4241
4242     return (tcb);
4243 }
4244
4245 void
4246 free_tls(void *tcb, size_t tcbsize, size_t tcbalign)
4247 {
4248     Elf_Addr *dtv;
4249     Elf_Addr tlsstart, tlsend;
4250     int dtvsize, i;
4251
4252     assert(tcbsize >= TLS_TCB_SIZE);
4253
4254     tlsstart = (Elf_Addr)tcb + tcbsize - TLS_TCB_SIZE;
4255     tlsend = tlsstart + tls_static_space;
4256
4257     dtv = *(Elf_Addr **)tlsstart;
4258     dtvsize = dtv[1];
4259     for (i = 0; i < dtvsize; i++) {
4260         if (dtv[i+2] && (dtv[i+2] < tlsstart || dtv[i+2] >= tlsend)) {
4261             free((void*)dtv[i+2]);
4262         }
4263     }
4264     free(dtv);
4265     free(tcb);
4266 }
4267
4268 #endif
4269
4270 #if defined(__i386__) || defined(__amd64__) || defined(__sparc64__)
4271
4272 /*
4273  * Allocate Static TLS using the Variant II method.
4274  */
4275 void *
4276 allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign)
4277 {
4278     Obj_Entry *obj;
4279     size_t size;
4280     char *tls;
4281     Elf_Addr *dtv, *olddtv;
4282     Elf_Addr segbase, oldsegbase, addr;
4283     int i;
4284
4285     size = round(tls_static_space, tcbalign);
4286
4287     assert(tcbsize >= 2*sizeof(Elf_Addr));
4288     tls = xcalloc(1, size + tcbsize);
4289     dtv = xcalloc(tls_max_index + 2, sizeof(Elf_Addr));
4290
4291     segbase = (Elf_Addr)(tls + size);
4292     ((Elf_Addr*)segbase)[0] = segbase;
4293     ((Elf_Addr*)segbase)[1] = (Elf_Addr) dtv;
4294
4295     dtv[0] = tls_dtv_generation;
4296     dtv[1] = tls_max_index;
4297
4298     if (oldtls) {
4299         /*
4300          * Copy the static TLS block over whole.
4301          */
4302         oldsegbase = (Elf_Addr) oldtls;
4303         memcpy((void *)(segbase - tls_static_space),
4304                (const void *)(oldsegbase - tls_static_space),
4305                tls_static_space);
4306
4307         /*
4308          * If any dynamic TLS blocks have been created tls_get_addr(),
4309          * move them over.
4310          */
4311         olddtv = ((Elf_Addr**)oldsegbase)[1];
4312         for (i = 0; i < olddtv[1]; i++) {
4313             if (olddtv[i+2] < oldsegbase - size || olddtv[i+2] > oldsegbase) {
4314                 dtv[i+2] = olddtv[i+2];
4315                 olddtv[i+2] = 0;
4316             }
4317         }
4318
4319         /*
4320          * We assume that this block was the one we created with
4321          * allocate_initial_tls().
4322          */
4323         free_tls(oldtls, 2*sizeof(Elf_Addr), sizeof(Elf_Addr));
4324     } else {
4325         for (obj = objs; obj; obj = obj->next) {
4326             if (obj->tlsoffset) {
4327                 addr = segbase - obj->tlsoffset;
4328                 memset((void*) (addr + obj->tlsinitsize),
4329                        0, obj->tlssize - obj->tlsinitsize);
4330                 if (obj->tlsinit)
4331                     memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize);
4332                 dtv[obj->tlsindex + 1] = addr;
4333             }
4334         }
4335     }
4336
4337     return (void*) segbase;
4338 }
4339
4340 void
4341 free_tls(void *tls, size_t tcbsize, size_t tcbalign)
4342 {
4343     size_t size;
4344     Elf_Addr* dtv;
4345     int dtvsize, i;
4346     Elf_Addr tlsstart, tlsend;
4347
4348     /*
4349      * Figure out the size of the initial TLS block so that we can
4350      * find stuff which ___tls_get_addr() allocated dynamically.
4351      */
4352     size = round(tls_static_space, tcbalign);
4353
4354     dtv = ((Elf_Addr**)tls)[1];
4355     dtvsize = dtv[1];
4356     tlsend = (Elf_Addr) tls;
4357     tlsstart = tlsend - size;
4358     for (i = 0; i < dtvsize; i++) {
4359         if (dtv[i+2] && (dtv[i+2] < tlsstart || dtv[i+2] > tlsend)) {
4360             free((void*) dtv[i+2]);
4361         }
4362     }
4363
4364     free((void*) tlsstart);
4365     free((void*) dtv);
4366 }
4367
4368 #endif
4369
4370 /*
4371  * Allocate TLS block for module with given index.
4372  */
4373 void *
4374 allocate_module_tls(int index)
4375 {
4376     Obj_Entry* obj;
4377     char* p;
4378
4379     for (obj = obj_list; obj; obj = obj->next) {
4380         if (obj->tlsindex == index)
4381             break;
4382     }
4383     if (!obj) {
4384         _rtld_error("Can't find module with TLS index %d", index);
4385         die();
4386     }
4387
4388     p = malloc(obj->tlssize);
4389     if (p == NULL) {
4390         _rtld_error("Cannot allocate TLS block for index %d", index);
4391         die();
4392     }
4393     memcpy(p, obj->tlsinit, obj->tlsinitsize);
4394     memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize);
4395
4396     return p;
4397 }
4398
4399 bool
4400 allocate_tls_offset(Obj_Entry *obj)
4401 {
4402     size_t off;
4403
4404     if (obj->tls_done)
4405         return true;
4406
4407     if (obj->tlssize == 0) {
4408         obj->tls_done = true;
4409         return true;
4410     }
4411
4412     if (obj->tlsindex == 1)
4413         off = calculate_first_tls_offset(obj->tlssize, obj->tlsalign);
4414     else
4415         off = calculate_tls_offset(tls_last_offset, tls_last_size,
4416                                    obj->tlssize, obj->tlsalign);
4417
4418     /*
4419      * If we have already fixed the size of the static TLS block, we
4420      * must stay within that size. When allocating the static TLS, we
4421      * leave a small amount of space spare to be used for dynamically
4422      * loading modules which use static TLS.
4423      */
4424     if (tls_static_space) {
4425         if (calculate_tls_end(off, obj->tlssize) > tls_static_space)
4426             return false;
4427     }
4428
4429     tls_last_offset = obj->tlsoffset = off;
4430     tls_last_size = obj->tlssize;
4431     obj->tls_done = true;
4432
4433     return true;
4434 }
4435
4436 void
4437 free_tls_offset(Obj_Entry *obj)
4438 {
4439
4440     /*
4441      * If we were the last thing to allocate out of the static TLS
4442      * block, we give our space back to the 'allocator'. This is a
4443      * simplistic workaround to allow libGL.so.1 to be loaded and
4444      * unloaded multiple times.
4445      */
4446     if (calculate_tls_end(obj->tlsoffset, obj->tlssize)
4447         == calculate_tls_end(tls_last_offset, tls_last_size)) {
4448         tls_last_offset -= obj->tlssize;
4449         tls_last_size = 0;
4450     }
4451 }
4452
4453 void *
4454 _rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign)
4455 {
4456     void *ret;
4457     RtldLockState lockstate;
4458
4459     wlock_acquire(rtld_bind_lock, &lockstate);
4460     ret = allocate_tls(obj_list, oldtls, tcbsize, tcbalign);
4461     lock_release(rtld_bind_lock, &lockstate);
4462     return (ret);
4463 }
4464
4465 void
4466 _rtld_free_tls(void *tcb, size_t tcbsize, size_t tcbalign)
4467 {
4468     RtldLockState lockstate;
4469
4470     wlock_acquire(rtld_bind_lock, &lockstate);
4471     free_tls(tcb, tcbsize, tcbalign);
4472     lock_release(rtld_bind_lock, &lockstate);
4473 }
4474
4475 static void
4476 object_add_name(Obj_Entry *obj, const char *name)
4477 {
4478     Name_Entry *entry;
4479     size_t len;
4480
4481     len = strlen(name);
4482     entry = malloc(sizeof(Name_Entry) + len);
4483
4484     if (entry != NULL) {
4485         strcpy(entry->name, name);
4486         STAILQ_INSERT_TAIL(&obj->names, entry, link);
4487     }
4488 }
4489
4490 static int
4491 object_match_name(const Obj_Entry *obj, const char *name)
4492 {
4493     Name_Entry *entry;
4494
4495     STAILQ_FOREACH(entry, &obj->names, link) {
4496         if (strcmp(name, entry->name) == 0)
4497             return (1);
4498     }
4499     return (0);
4500 }
4501
4502 static Obj_Entry *
4503 locate_dependency(const Obj_Entry *obj, const char *name)
4504 {
4505     const Objlist_Entry *entry;
4506     const Needed_Entry *needed;
4507
4508     STAILQ_FOREACH(entry, &list_main, link) {
4509         if (object_match_name(entry->obj, name))
4510             return entry->obj;
4511     }
4512
4513     for (needed = obj->needed;  needed != NULL;  needed = needed->next) {
4514         if (strcmp(obj->strtab + needed->name, name) == 0 ||
4515           (needed->obj != NULL && object_match_name(needed->obj, name))) {
4516             /*
4517              * If there is DT_NEEDED for the name we are looking for,
4518              * we are all set.  Note that object might not be found if
4519              * dependency was not loaded yet, so the function can
4520              * return NULL here.  This is expected and handled
4521              * properly by the caller.
4522              */
4523             return (needed->obj);
4524         }
4525     }
4526     _rtld_error("%s: Unexpected inconsistency: dependency %s not found",
4527         obj->path, name);
4528     die();
4529 }
4530
4531 static int
4532 check_object_provided_version(Obj_Entry *refobj, const Obj_Entry *depobj,
4533     const Elf_Vernaux *vna)
4534 {
4535     const Elf_Verdef *vd;
4536     const char *vername;
4537
4538     vername = refobj->strtab + vna->vna_name;
4539     vd = depobj->verdef;
4540     if (vd == NULL) {
4541         _rtld_error("%s: version %s required by %s not defined",
4542             depobj->path, vername, refobj->path);
4543         return (-1);
4544     }
4545     for (;;) {
4546         if (vd->vd_version != VER_DEF_CURRENT) {
4547             _rtld_error("%s: Unsupported version %d of Elf_Verdef entry",
4548                 depobj->path, vd->vd_version);
4549             return (-1);
4550         }
4551         if (vna->vna_hash == vd->vd_hash) {
4552             const Elf_Verdaux *aux = (const Elf_Verdaux *)
4553                 ((char *)vd + vd->vd_aux);
4554             if (strcmp(vername, depobj->strtab + aux->vda_name) == 0)
4555                 return (0);
4556         }
4557         if (vd->vd_next == 0)
4558             break;
4559         vd = (const Elf_Verdef *) ((char *)vd + vd->vd_next);
4560     }
4561     if (vna->vna_flags & VER_FLG_WEAK)
4562         return (0);
4563     _rtld_error("%s: version %s required by %s not found",
4564         depobj->path, vername, refobj->path);
4565     return (-1);
4566 }
4567
4568 static int
4569 rtld_verify_object_versions(Obj_Entry *obj)
4570 {
4571     const Elf_Verneed *vn;
4572     const Elf_Verdef  *vd;
4573     const Elf_Verdaux *vda;
4574     const Elf_Vernaux *vna;
4575     const Obj_Entry *depobj;
4576     int maxvernum, vernum;
4577
4578     if (obj->ver_checked)
4579         return (0);
4580     obj->ver_checked = true;
4581
4582     maxvernum = 0;
4583     /*
4584      * Walk over defined and required version records and figure out
4585      * max index used by any of them. Do very basic sanity checking
4586      * while there.
4587      */
4588     vn = obj->verneed;
4589     while (vn != NULL) {
4590         if (vn->vn_version != VER_NEED_CURRENT) {
4591             _rtld_error("%s: Unsupported version %d of Elf_Verneed entry",
4592                 obj->path, vn->vn_version);
4593             return (-1);
4594         }
4595         vna = (const Elf_Vernaux *) ((char *)vn + vn->vn_aux);
4596         for (;;) {
4597             vernum = VER_NEED_IDX(vna->vna_other);
4598             if (vernum > maxvernum)
4599                 maxvernum = vernum;
4600             if (vna->vna_next == 0)
4601                  break;
4602             vna = (const Elf_Vernaux *) ((char *)vna + vna->vna_next);
4603         }
4604         if (vn->vn_next == 0)
4605             break;
4606         vn = (const Elf_Verneed *) ((char *)vn + vn->vn_next);
4607     }
4608
4609     vd = obj->verdef;
4610     while (vd != NULL) {
4611         if (vd->vd_version != VER_DEF_CURRENT) {
4612             _rtld_error("%s: Unsupported version %d of Elf_Verdef entry",
4613                 obj->path, vd->vd_version);
4614             return (-1);
4615         }
4616         vernum = VER_DEF_IDX(vd->vd_ndx);
4617         if (vernum > maxvernum)
4618                 maxvernum = vernum;
4619         if (vd->vd_next == 0)
4620             break;
4621         vd = (const Elf_Verdef *) ((char *)vd + vd->vd_next);
4622     }
4623
4624     if (maxvernum == 0)
4625         return (0);
4626
4627     /*
4628      * Store version information in array indexable by version index.
4629      * Verify that object version requirements are satisfied along the
4630      * way.
4631      */
4632     obj->vernum = maxvernum + 1;
4633     obj->vertab = xcalloc(obj->vernum, sizeof(Ver_Entry));
4634
4635     vd = obj->verdef;
4636     while (vd != NULL) {
4637         if ((vd->vd_flags & VER_FLG_BASE) == 0) {
4638             vernum = VER_DEF_IDX(vd->vd_ndx);
4639             assert(vernum <= maxvernum);
4640             vda = (const Elf_Verdaux *)((char *)vd + vd->vd_aux);
4641             obj->vertab[vernum].hash = vd->vd_hash;
4642             obj->vertab[vernum].name = obj->strtab + vda->vda_name;
4643             obj->vertab[vernum].file = NULL;
4644             obj->vertab[vernum].flags = 0;
4645         }
4646         if (vd->vd_next == 0)
4647             break;
4648         vd = (const Elf_Verdef *) ((char *)vd + vd->vd_next);
4649     }
4650
4651     vn = obj->verneed;
4652     while (vn != NULL) {
4653         depobj = locate_dependency(obj, obj->strtab + vn->vn_file);
4654         if (depobj == NULL)
4655             return (-1);
4656         vna = (const Elf_Vernaux *) ((char *)vn + vn->vn_aux);
4657         for (;;) {
4658             if (check_object_provided_version(obj, depobj, vna))
4659                 return (-1);
4660             vernum = VER_NEED_IDX(vna->vna_other);
4661             assert(vernum <= maxvernum);
4662             obj->vertab[vernum].hash = vna->vna_hash;
4663             obj->vertab[vernum].name = obj->strtab + vna->vna_name;
4664             obj->vertab[vernum].file = obj->strtab + vn->vn_file;
4665             obj->vertab[vernum].flags = (vna->vna_other & VER_NEED_HIDDEN) ?
4666                 VER_INFO_HIDDEN : 0;
4667             if (vna->vna_next == 0)
4668                  break;
4669             vna = (const Elf_Vernaux *) ((char *)vna + vna->vna_next);
4670         }
4671         if (vn->vn_next == 0)
4672             break;
4673         vn = (const Elf_Verneed *) ((char *)vn + vn->vn_next);
4674     }
4675     return 0;
4676 }
4677
4678 static int
4679 rtld_verify_versions(const Objlist *objlist)
4680 {
4681     Objlist_Entry *entry;
4682     int rc;
4683
4684     rc = 0;
4685     STAILQ_FOREACH(entry, objlist, link) {
4686         /*
4687          * Skip dummy objects or objects that have their version requirements
4688          * already checked.
4689          */
4690         if (entry->obj->strtab == NULL || entry->obj->vertab != NULL)
4691             continue;
4692         if (rtld_verify_object_versions(entry->obj) == -1) {
4693             rc = -1;
4694             if (ld_tracing == NULL)
4695                 break;
4696         }
4697     }
4698     if (rc == 0 || ld_tracing != NULL)
4699         rc = rtld_verify_object_versions(&obj_rtld);
4700     return rc;
4701 }
4702
4703 const Ver_Entry *
4704 fetch_ventry(const Obj_Entry *obj, unsigned long symnum)
4705 {
4706     Elf_Versym vernum;
4707
4708     if (obj->vertab) {
4709         vernum = VER_NDX(obj->versyms[symnum]);
4710         if (vernum >= obj->vernum) {
4711             _rtld_error("%s: symbol %s has wrong verneed value %d",
4712                 obj->path, obj->strtab + symnum, vernum);
4713         } else if (obj->vertab[vernum].hash != 0) {
4714             return &obj->vertab[vernum];
4715         }
4716     }
4717     return NULL;
4718 }
4719
4720 int
4721 _rtld_get_stack_prot(void)
4722 {
4723
4724         return (stack_prot);
4725 }
4726
4727 static void
4728 map_stacks_exec(RtldLockState *lockstate)
4729 {
4730         void (*thr_map_stacks_exec)(void);
4731
4732         if ((max_stack_flags & PF_X) == 0 || (stack_prot & PROT_EXEC) != 0)
4733                 return;
4734         thr_map_stacks_exec = (void (*)(void))(uintptr_t)
4735             get_program_var_addr("__pthread_map_stacks_exec", lockstate);
4736         if (thr_map_stacks_exec != NULL) {
4737                 stack_prot |= PROT_EXEC;
4738                 thr_map_stacks_exec();
4739         }
4740 }
4741
4742 void
4743 symlook_init(SymLook *dst, const char *name)
4744 {
4745
4746         bzero(dst, sizeof(*dst));
4747         dst->name = name;
4748         dst->hash = elf_hash(name);
4749         dst->hash_gnu = gnu_hash(name);
4750 }
4751
4752 static void
4753 symlook_init_from_req(SymLook *dst, const SymLook *src)
4754 {
4755
4756         dst->name = src->name;
4757         dst->hash = src->hash;
4758         dst->hash_gnu = src->hash_gnu;
4759         dst->ventry = src->ventry;
4760         dst->flags = src->flags;
4761         dst->defobj_out = NULL;
4762         dst->sym_out = NULL;
4763         dst->lockstate = src->lockstate;
4764 }
4765
4766 /*
4767  * Overrides for libc_pic-provided functions.
4768  */
4769
4770 int
4771 __getosreldate(void)
4772 {
4773         size_t len;
4774         int oid[2];
4775         int error, osrel;
4776
4777         if (osreldate != 0)
4778                 return (osreldate);
4779
4780         oid[0] = CTL_KERN;
4781         oid[1] = KERN_OSRELDATE;
4782         osrel = 0;
4783         len = sizeof(osrel);
4784         error = sysctl(oid, 2, &osrel, &len, NULL, 0);
4785         if (error == 0 && osrel > 0 && len == sizeof(osrel))
4786                 osreldate = osrel;
4787         return (osreldate);
4788 }
4789
4790 void
4791 exit(int status)
4792 {
4793
4794         _exit(status);
4795 }
4796
4797 void (*__cleanup)(void);
4798 int __isthreaded = 0;
4799 int _thread_autoinit_dummy_decl = 1;
4800
4801 /*
4802  * No unresolved symbols for rtld.
4803  */
4804 void
4805 __pthread_cxa_finalize(struct dl_phdr_info *a)
4806 {
4807 }
4808
4809 void
4810 __stack_chk_fail(void)
4811 {
4812
4813         _rtld_error("stack overflow detected; terminated");
4814         die();
4815 }
4816 __weak_reference(__stack_chk_fail, __stack_chk_fail_local);
4817
4818 void
4819 __chk_fail(void)
4820 {
4821
4822         _rtld_error("buffer overflow detected; terminated");
4823         die();
4824 }
4825
4826 const char *
4827 rtld_strerror(int errnum)
4828 {
4829
4830         if (errnum < 0 || errnum >= sys_nerr)
4831                 return ("Unknown error");
4832         return (sys_errlist[errnum]);
4833 }