xref: /freebsd/libexec/rtld-elf/rtld.c (revision 8d20be1e22095c27faf8fe8b2f0d089739cc742e)
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 }
4834