_rtld.h revision 3731:79e3159504fa
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 *	Copyright (c) 1988 AT&T
23 *	  All Rights Reserved
24 *
25 *
26 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
27 * Use is subject to license terms.
28 */
29
30#ifndef	__RTLD_H
31#define	__RTLD_H
32
33#pragma ident	"%Z%%M%	%I%	%E% SMI"
34
35/*
36 * Common header for run-time linker.
37 */
38#include <sys/types.h>
39#include <sys/stat.h>
40#include <sys/avl.h>
41#include <stdarg.h>
42#include <synch.h>
43#include <signal.h>
44#include <errno.h>
45#include <unistd.h>
46#include <link.h>
47#include <rtld.h>
48#include <sgs.h>
49#include <machdep.h>
50#include <rtc.h>
51#include <debug.h>
52#include <msg.h>
53#include <libc_int.h>
54
55#ifdef	__cplusplus
56extern "C" {
57#endif
58
59/*
60 * Dependency search rule order.
61 */
62#define	RPLENV		1		/* replaceable LD_LIBRARY_PATH */
63#define	PRMENV		2		/* permanent LD_LIBRARY_PATH */
64#define	RUNPATH		3		/* callers runpath */
65#define	DEFAULT		4		/* default library path */
66
67
68/*
69 * Data structure for file class specific functions and data.
70 */
71typedef struct fct {
72	int	(*fct_are_u_this)(Rej_desc *);	/* determine type of object */
73	ulong_t	(*fct_entry_pt)(void);		/* get entry point */
74	Rt_map	*(*fct_map_so)(Lm_list *, Aliste, const char *, const char *,
75		    int);			/* map in a shared object */
76	void	(*fct_unmap_so)(Rt_map *);	/* unmap a shared object */
77	int	(*fct_needed)(Lm_list *, Aliste, Rt_map *);
78						/* determine needed objects */
79	Sym	*(*fct_lookup_sym)(Slookup *, Rt_map **, uint_t *);
80						/* initialize symbol lookup */
81	int	(*fct_reloc)(Rt_map *, uint_t);	/* relocate shared object */
82	Pnode	*fct_dflt_dirs;			/* list of default dirs to */
83						/*	search */
84	Pnode	*fct_secure_dirs;		/* list of secure dirs to */
85						/*	search (set[ug]id) */
86	Pnode	*(*fct_fix_name)(const char *, Rt_map *, uint_t);
87						/* transpose name */
88	char	*(*fct_get_so)(const char *, const char *);
89						/* get shared object */
90	void	(*fct_dladdr)(ulong_t, Rt_map *, Dl_info *, void **, int);
91						/* get symbolic address */
92	Sym	*(*fct_dlsym)(Grp_hdl *, Slookup *, Rt_map **, uint_t *);
93						/* process dlsym request */
94	int	(*fct_verify_vers)(const char *, Rt_map *, Rt_map *);
95						/* verify versioning (ELF) */
96	int	(*fct_set_prot)(Rt_map *, int);
97						/* set protection */
98} Fct;
99
100
101/*
102 * Return codes for util::anon_map().
103 */
104typedef enum {
105	AM_OK,			/* mmap(MAP_ANON) succeeded */
106	AM_NOSUP,		/* mmap(MAP_ANON) not supported (old OS) */
107	AM_ERROR		/* mmap(MAP_ANON) failed */
108} Am_ret;
109
110
111/*
112 * Macros for getting to the file class table.
113 */
114#define	LM_ENTRY_PT(X)		((X)->rt_fct->fct_entry_pt)
115#define	LM_UNMAP_SO(X)		((X)->rt_fct->fct_unmap_so)
116#define	LM_NEEDED(X)		((X)->rt_fct->fct_needed)
117#define	LM_LOOKUP_SYM(X)	((X)->rt_fct->fct_lookup_sym)
118#define	LM_RELOC(X)		((X)->rt_fct->fct_reloc)
119#define	LM_DFLT_DIRS(X)		((X)->rt_fct->fct_dflt_dirs)
120#define	LM_SECURE_DIRS(X)	((X)->rt_fct->fct_secure_dirs)
121#define	LM_FIX_NAME(X)		((X)->rt_fct->fct_fix_name)
122#define	LM_GET_SO(X)		((X)->rt_fct->fct_get_so)
123#define	LM_DLADDR(X)		((X)->rt_fct->fct_dladdr)
124#define	LM_DLSYM(X)		((X)->rt_fct->fct_dlsym)
125#define	LM_VERIFY_VERS(X)	((X)->rt_fct->fct_verify_vers)
126#define	LM_SET_PROT(X)		((X)->rt_fct->fct_set_prot)
127
128
129/*
130 * Define Alist initialization sizes.
131 */
132#define	AL_CNT_ALIAS	2		/* ALIAS() initial alist count */
133#define	AL_CNT_DEPENDS	10		/* DEPENDS() initial alist count */
134#define	AL_CNT_CALLERS	10		/* CALLERS() initial alist count */
135#define	AL_CNT_GROUPS	1		/* GROUPS() initial alist count */
136#define	AL_CNT_COPYREL	10		/* COPY() initial alist count */
137#define	AL_CNT_LAZYFIND	10		/* elf_lazy_find_sym() initial alist */
138					/*	count */
139#define	AL_CNT_GRPCLCT	10		/* gdp_collect() initial alist count */
140#define	AL_CNT_DEPCLCT	10		/* load_so() initial alist count */
141#define	AL_CNT_RTLDINFO	1		/* RTLDINFO() initial alist count */
142#define	AL_CNT_FPNODE	2		/* FPNODE() initial alist count */
143#define	AL_CNT_LMLISTS	8		/* lm_lists initial alist count */
144#define	AL_CNT_LMNOW	8		/* lm_now initial alist count */
145#define	AL_CNT_RELBIND	20		/* relocation binding alist count */
146
147
148/*
149 * Size of buffer for building error messages.
150 */
151#define	ERRSIZE		2048		/* MAXPATHLEN * 2 */
152
153
154/*
155 * Configuration file information.
156 */
157typedef struct config {
158	const char	*c_name;
159	Addr		c_bgn;
160	Addr		c_end;
161	Word		*c_hashtbl;
162	Word		*c_hashchain;
163	const char	*c_strtbl;
164	Rtc_obj		*c_objtbl;
165	Rtc_fltr	*c_fltr;
166	Rtc_flte	*c_flte;
167} Config;
168
169/*
170 * Register symbol list.
171 */
172typedef struct reglist {
173	Rt_map		*rl_lmp;	/* defining object */
174	Sym		*rl_sym;	/* regsym */
175	struct reglist	*rl_next;	/* next entry */
176} Reglist;
177
178/*
179 * Data structure to hold interpreter information.
180 */
181typedef struct interp {
182	char		*i_name;	/* interpreter name */
183	caddr_t		i_faddr;	/* address interpreter is mapped at */
184} Interp;
185
186/*
187 * Data structure used to keep track of copy relocations.  These relocations
188 * are collected during initial relocation processing and maintained on the
189 * COPY(lmp) list of the defining object.  Each copy list is also added to the
190 * COPY(lmp) of the head object (normally the application dynamic executable)
191 * from which they will be processed after all relocations are done.
192 *
193 * The use of RTLD_GROUP will also reference individual objects COPY(lmp) lists
194 * in case a bound symbol must be assigned to it actual copy relocation.
195 */
196typedef struct {
197	const char	*r_name;	/* symbol name */
198	Sym		*r_rsym;	/* reference symbol table entry */
199	Rt_map		*r_rlmp;	/* reference link map */
200	Rt_map		*r_dlmp;	/* definition link map */
201	Sym		*r_dsym;	/* definition symbol table entry */
202	void		*r_radd;	/* copy to address */
203	const void	*r_dadd;	/* copy from address */
204	ulong_t		r_size;		/* copy size bytes */
205} Rel_copy;
206
207/*
208 * Data structure to hold initial file mapping information.  Used to
209 * communicate during initial object mapping and provide for error recovery.
210 */
211typedef struct {
212	char		*fm_maddr;	/* address of initial mapping */
213	size_t		fm_msize;	/* size of initial mapping */
214	size_t		fm_fsize;	/* actual file size */
215	ulong_t		fm_etext;	/* end of text segment */
216	int		fm_mflags;	/* mapping flags */
217	ulong_t		fm_hwptr;	/* hardware capabilities pointer */
218} Fmap;
219
220/*
221 * Define a file descriptor, which maintains information regarding a pathname
222 * that has been opened and minimally inspected.
223 */
224typedef struct {
225	Rt_map		*fd_lmp;	/* existing link-map pointer */
226	Fct		*fd_ftp;	/* file functions pointer */
227	const char	*fd_oname;	/* original file name */
228	const char	*fd_odir;	/* original directory name */
229	const char	*fd_nname;	/* new file (expanded) name */
230	const char	*fd_pname;	/* new path (resolved) name */
231	dev_t		fd_dev;		/* file device number */
232	ino_t		fd_ino;		/* file inode number */
233	int		fd_fd;		/* open file descriptor */
234	uint_t		fd_flags;
235	avl_index_t	fd_avlwhere;	/* avl tree insertion index */
236	Fmap		fd_fmap;	/* file mapping information */
237} Fdesc;
238
239#define	FLG_FD_ALTER	0x01		/* file is an alternate */
240#define	FLG_FD_SLASH	0x02		/* file contains a "/" */
241
242/*
243 * File descriptor availability flag.
244 */
245#define	FD_UNAVAIL	-1
246
247/*
248 * Disabled filter flag.  Filter objects are referenced using their .dynamic
249 * index (DT_FILTER or DT_AUXILIARY).  This index is saved and used to lookup
250 * the required filter.  Note that 0 is a valid .dynamic index.  The caller's
251 * OBJFLTRNDX() element is initialized using the following flag, and should
252 * the filter's initialization fail, is reset to this value to indicate the
253 * filter is disabled.  UINT_MAX provides a convenient invalid .dynamic index.
254 */
255#define	FLTR_DISABLED	UINT_MAX
256
257/*
258 * Status flags for rtld_flags
259 */
260#define	RT_FL_THREADS	0x00000001	/* threads are enabled */
261#define	RT_FL_WARNFLTR	0x00000002	/* warn of missing filtees (ldd) */
262#define	RT_FL_DBNOTIF	0x00000004	/* binding activity going on */
263
264#ifdef	SIEBEL_DISABLE
265#define	RT_FL_DISFIX_1	0x00000008	/* disable fix number 1 */
266#endif
267
268#define	RT_FL_NOBIND	0x00000010	/* don't carry out plt binding */
269#define	RT_FL_NOVERSION	0x00000020	/* disable version checking */
270#define	RT_FL_SECURE	0x00000040	/* setuid/segid flag */
271#define	RT_FL_APPLIC	0x00000080	/* are we executing user code */
272#define	RT_FL_CONCUR	0x00000100	/* thread concurrency checks required */
273#define	RT_FL_CONFGEN	0x00000200	/* don't relocate initiating object */
274					/*	set by crle(1). */
275#define	RT_FL_CONFAPP	0x00000400	/* application specific configuration */
276					/*	cache required */
277#define	RT_FL_DEBUGGER	0x00000800	/* a debugger is monitoring us */
278#define	RT_FL_AUNOTIF	0x00001000	/* audit activity going on */
279#define	RT_FL_NEWLOCALE	0x00002000	/* message locale has changed */
280#define	RT_FL_NOBAPLT	0x00004000	/* sparc: don't use ba plt's */
281#define	RT_FL_NOAUXFLTR	0x00008000	/* disable auxiliary filters */
282#define	RT_FL_NOCONCUR	0x00010000	/* disable thread concurrency checks */
283#define	RT_FL_NOAUDIT	0x00020000	/* disable auditing */
284#define	RT_FL_ATEXIT	0x00040000	/* we're shutting down */
285#define	RT_FL_SILENCERR	0x00080000	/* silence error messages */
286#define	RT_FL_BREADTH	0x00100000	/* use breadth-first for .init/.fini */
287#define	RT_FL_INITFIRST	0x00200000	/* processing a DT_INITFIRST object */
288#define	RT_FL_RELATIVE	0x00400000	/* relative path expansion required */
289#define	RT_FL_EXECNAME	0x00800000	/* AT_SUN_EXECNAME vector is avail */
290#define	RT_FL_DEMANGLE	0x01000000	/* demangle C++ symbol names */
291#define	RT_FL_NOCFG	0x02000000	/* disable config file use */
292#define	RT_FL_NODIRCFG	0x04000000	/* disable directory config use */
293#define	RT_FL_NOOBJALT	0x08000000	/* disable object alternative use */
294#define	RT_FL_NOENVCFG	0x10000000	/* disable config envars use */
295#define	RT_FL_DIRCFG	0x20000000	/* directory config info available */
296#define	RT_FL_OBJALT	0x40000000	/* object alternatives are available */
297#define	RT_FL_MEMRESV	0x80000000	/* memory reservation established */
298
299/*
300 * Status flags for rtld_flags2
301 */
302#define	RT_FL2_HASAUDIT	0x00000001	/* auditing lm_list is present */
303#define	RT_FL2_RTLDSEEN	0x00000002	/* rtldinfo has been set */
304#define	RT_FL2_UNIFPROC	0x00000004	/* libc/libthread unified environment */
305#define	RT_FL2_NOMALIGN	0x00000008	/* mmap MAP_ALIGN isn't available */
306#define	RT_FL2_NOFLTCFG	0x00000010	/* disable config filter use */
307#define	RT_FL2_FLTCFG	0x00000020	/* filter config info available */
308#define	RT_FL2_HWCAP	0x00000040	/* hardware capabilities available */
309#define	RT_FL2_FTL2WARN	0x00000080	/* convert fatal to warning messages */
310#define	RT_FL2_BINDNOW	0x00000100	/* LD_BIND_NOW in effect */
311#define	RT_FL2_BINDLAZY	0x00000200	/* disable RTLD_NOW (and LD_BIND_NOW) */
312#define	RT_FL2_PLMSETUP	0x00000400	/* primary link-map set up complete */
313#define	RT_FL2_BRANDED	0x00000800	/* Process is branded */
314
315/*
316 * Information flags for env_info.
317 */
318#define	ENV_INF_PATHCFG	0x00000001	/* replaceable LD_LIBRARY_PATH */
319					/*	originates from configuration */
320					/*	file */
321#define	ENV_INF_FLAGCFG	0x00000002	/* replaceable LD_FLAGS originates */
322					/*	from configuration file */
323
324/*
325 * RTLDINFO descriptor.
326 */
327typedef struct {
328	Rt_map		*rti_lmp;	/* RTLDINFO provider */
329	Lc_interface	*rti_info;	/* RTLDINFO data */
330} Rti_desc;
331
332/*
333 * Binding flags for the bindguard routines.
334 */
335#define	THR_FLG_RTLD	0x00000001	/* rtldlock bind_guard() flag */
336#define	THR_FLG_MASK	THR_FLG_RTLD	/* mask for all THR_FLG flags */
337
338#define	ROUND(x, a)	(((int)(x) + ((int)(a) - 1)) & \
339				~((int)(a) - 1))
340
341/*
342 * Print buffer.
343 */
344typedef struct {
345	char	*pr_buf;	/* pointer to beginning of buffer */
346	char	*pr_cur;	/* pointer to next free char in buffer */
347	size_t	pr_len;		/* buffer size */
348	int	pr_fd;		/* output fd */
349} Prfbuf;
350
351/*
352 * dlopen() handle list size.
353 */
354#define	HDLIST_SZ	101	/* prime no. for hashing */
355#define	HDLIST_ORP	102	/* orphan handle list */
356
357/*
358 * Define expansion path information.  Search paths, i.e., LD_LIBRARY_PATH,
359 * RPATHS, etc. are defined using la_objsearch() information (see LA_SER flags
360 * in link.h).  Definitions here extend the path information to other uses of
361 * pathname expansion, and are or'd together with any LA_SER_* flags.
362 */
363#define	PN_SER_NEEDED	0x00001000	/* paths define DT_NEEDED entry */
364#define	PN_SER_FILTEE	0x00002000	/* paths define filtees */
365#define	PN_SER_EXTLOAD	0x00004000	/* paths define extra loaded objects */
366					/*	(preload, audit etc.) */
367#define	PN_SER_DLOPEN	0x00008000	/* paths define dlopen() request */
368
369#define	PN_SER_MASK	0x000ff000	/* mask for p_orig incorporation */
370
371/*
372 * Define reserved path tokens.  These are used to prevent various expansions
373 * from occurring, and record those expansions that do.  Note that any expansion
374 * information is also recorded in the p_orig field of a Pnode, and thus is
375 * or'd together with any LA_SER_* flags.
376 */
377#define	PN_TKN_ORIGIN	0x00100000	/* $ORIGIN expansion has occurred */
378#define	PN_TKN_PLATFORM	0x00200000	/* $PLATFORM expansion has occurred */
379#define	PN_TKN_OSNAME	0x00400000	/* $OSNAME expansion has occurred */
380#define	PN_TKN_OSREL	0x00800000	/* $OSREL expansion has occurred */
381#define	PN_TKN_ISALIST	0x01000000	/* $ISALIST expansion has occurred */
382#define	PN_TKN_HWCAP	0x02000000	/* $HWCAP expansion has occurred */
383
384#define	PN_TKN_MASK	0xfff00000	/* mask for p_orig incorporation */
385
386#define	TKN_NONE	0x00000001	/* no token expansion has occurred */
387#define	TKN_DOTSLASH	0x00000002	/* path contains a "./" */
388
389/*
390 * Define alist descriptor addition return values (see hdl_add()).
391 */
392#define	ALE_EXISTS	1		/* alist entry already exists */
393#define	ALE_CREATE	2		/* alist entry created */
394
395/*
396 * Define _caller flags.
397 */
398#define	CL_NONE		0
399#define	CL_EXECDEF	1		/* supply the executable as a default */
400					/* if the caller can't be determined */
401
402/*
403 * Binding information.  Note, this is or'ed in with the DBG_BINFO flags to
404 * convey information regarding symbol bindings.
405 */
406#define	BINFO_DIRECTDIS	0x10000		/* a direct binding has been disabled */
407
408/*
409 * Data declarations.
410 */
411extern Lc_desc		glcs[];		/* global external interfaces */
412
413extern Rt_lock		rtldlock;	/* rtld lock */
414
415extern List		dynlm_list;	/* dynamic list of link-maps */
416extern char		**environ;	/* environ pointer */
417
418extern int		dyn_plt_ent_size; /* Size of dynamic plt's */
419extern ulong_t		at_flags;	/* machine specific file flags */
420extern const char	*procname;	/* file name of executing process */
421extern Rtld_db_priv	r_debug;	/* debugging information */
422extern char		*lasterr;	/* string describing last error */
423extern Interp		*interp;	/* ELF executable interpreter info */
424extern const char	*rtldname;	/* name of the dynamic linker */
425extern List		hdl_list[];	/* dlopen() handle list */
426extern size_t		syspagsz;	/* system page size */
427extern char		*platform; 	/* platform name */
428extern size_t		platform_sz; 	/* platform name string size */
429extern Isa_desc		*isa;		/* isalist descriptor */
430extern Uts_desc		*uts;		/* utsname descriptor */
431extern uint_t		rtld_flags;	/* status flags for RTLD */
432extern uint_t		rtld_flags2;	/* additional status flags for RTLD */
433extern Fmap		*fmap;		/* Initial file mapping info */
434extern uint32_t		pltcnt21d;	/* cnt of 21d PLTs */
435extern uint32_t		pltcnt24d;	/* cnt of 24d PLTs */
436extern uint32_t		pltcntu32;	/* cnt of u32 PLTs */
437extern uint32_t		pltcntu44;	/* cnt of u44 PLTs */
438extern uint32_t		pltcntfull;	/* cnt of full PLTs */
439extern uint32_t		pltcntfar;	/* cnt of far PLTs */
440extern uchar_t		search_rules[];	/* dependency search rules */
441
442extern Fct		elf_fct;	/* ELF file class dependent data */
443
444#if	defined(__sparc) && !defined(__sparcv9)
445extern Fct		aout_fct;	/* a.out (4.x) file class dependent */
446					/*	data */
447#endif
448
449extern const char	*locale;		/* locale environment setting */
450
451extern Config		*config;		/* configuration structure */
452extern const char	*locale;		/* locale environment setting */
453
454extern const char	*rpl_audit;	/* replaceable LD_AUDIT string */
455extern const char	*rpl_debug;	/* replaceable LD_DEBUG string */
456extern const char	*rpl_ldflags;	/* replaceable LD_FLAGS string */
457extern const char	*rpl_libpath;	/* replaceable LD_LIBRARY string */
458extern Pnode		*rpl_libdirs;	/*	and its associated Pnode list */
459extern const char	*rpl_preload;	/* replaceable LD_PRELOAD string */
460
461extern const char	*prm_audit;	/* permanent LD_AUDIT string */
462extern const char	*prm_debug;	/* permanent LD_DEBUG string */
463extern const char	*prm_ldflags;	/* permanent LD_FLAGS string */
464extern const char	*prm_libpath;	/* permanent LD_LIBRARY string */
465extern Pnode		*prm_libdirs;	/*	and its associated Pnode list */
466extern const char	*prm_preload;	/* permanent LD_PRELOAD string */
467
468extern uint_t		env_info;	/* information regarding environment */
469					/*	variables */
470extern int		killsig;	/* signal sent on fatal exit */
471
472extern uint_t		audit_argcnt;	/* no. of stack args to copy */
473extern Audit_desc	*auditors;	/* global auditors */
474
475extern char		**_environ;
476
477extern const char	*dbg_file;	/* debugging directed to a file */
478
479extern Reglist		*reglist;	/* list of register symbols */
480
481extern const Msg	err_reject[];	/* rejection error message tables */
482extern const Msg	ldd_reject[];
483
484extern const char	*profile_name;	/* object being profiled */
485extern const char	*profile_out;	/* profile output file */
486extern const char	*profile_lib;	/* audit library to perform profile */
487
488extern Dl_argsinfo	argsinfo;	/* process argument, environment and */
489					/*	auxv information */
490
491extern const char	*err_strs[];	/* diagnostic error string headers */
492extern const char	*nosym_str;	/* MSG_GEN_NOSYM message cache */
493
494extern ulong_t		hwcap;		/* hardware capabilities */
495extern ulong_t		sfcap;		/* software capabilities */
496
497/*
498 * Function declarations.
499 */
500extern void		addfree(void *, size_t);
501extern void *		alist_append(Alist **, const void *, size_t, int);
502extern int		alist_delete(Alist *, const void *, Aliste *);
503extern int		alist_test(Alist **, void *, size_t, int);
504extern int		append_alias(Rt_map *, const char *, int *);
505extern int		analyze_lmc(Lm_list *, Aliste, Rt_map *);
506extern Am_ret		anon_map(Lm_list *, caddr_t *, size_t, int, int);
507extern Fct		*are_u_this(Rej_desc *, int, struct stat *,
508			    const char *);
509extern void		atexit_fini(void);
510extern int		bind_one(Rt_map *, Rt_map *, uint_t);
511extern int		bufprint(Prfbuf *, const char *, ...);
512extern void		call_array(Addr *, uint_t, Rt_map *, Word);
513extern void		call_fini(Lm_list *, Rt_map **);
514extern void		call_init(Rt_map **, int);
515extern int		callable(Rt_map *, Rt_map *, Grp_hdl *);
516extern Rt_map		*_caller(caddr_t, int);
517extern caddr_t		caller(void);
518extern void		*calloc(size_t, size_t);
519extern void		cap_assign(Cap *, Rt_map *);
520extern const char	*_conv_reloc_type(uint_t rel);
521extern uintptr_t	dbg_setup(const char *, Dbg_desc *);
522extern const char	*demangle(const char *);
523extern int		dlclose_intn(Grp_hdl *, Rt_map *);
524extern int		dlclose_core(Grp_hdl *, Rt_map *, Lm_list *);
525extern Sym		*dlsym_handle(Grp_hdl *, Slookup *, Rt_map **,
526			    uint_t *);
527extern void		*dlsym_intn(void *, const char *, Rt_map *, Rt_map **);
528extern Grp_hdl		*dlmopen_intn(Lm_list *, const char *, int, Rt_map *,
529			    uint_t, uint_t, int *);
530extern size_t		doprf(const char *, va_list, Prfbuf *);
531extern int		dowrite(Prfbuf *);
532extern void		dz_init(int);
533extern caddr_t		dz_map(Lm_list *, caddr_t, size_t, int, int);
534extern int		elf_config(Rt_map *, int);
535extern int		elf_mach_flags_check(Rej_desc *, Ehdr *);
536extern Rtc_obj		*elf_config_ent(const char *, Word, int, const char **);
537extern Pnode		*elf_config_flt(Lm_list *, const char *, const char *);
538extern ulong_t		elf_hash(const char *);
539extern void 		elf_reloc_bad(Rt_map *, void *, uchar_t, ulong_t,
540			    ulong_t);
541extern ulong_t		elf_reloc_relative(ulong_t, ulong_t, ulong_t,
542			    ulong_t, ulong_t, ulong_t);
543extern ulong_t		elf_reloc_relacount(ulong_t, ulong_t,
544			    ulong_t, ulong_t);
545extern long		elf_static_tls(Rt_map *, Sym *, void *, uchar_t, char *,
546			    ulong_t, long);
547extern int		enter(void);
548extern uint_t		expand(char **, size_t *, char **, uint_t, uint_t,
549			    Rt_map *);
550extern Pnode		*expand_paths(Rt_map *, const char *, uint_t, uint_t);
551extern void		free_hdl(Grp_hdl *);
552extern void		file_notfound(Lm_list *, const char *, Rt_map *,
553			    uint_t, Rej_desc *);
554extern int		find_path(Lm_list *, const char *, Rt_map *, uint_t,
555			    Fdesc *, Rej_desc *);
556extern int		fpavl_insert(Lm_list *, Rt_map *, const char *,
557			    avl_index_t);
558extern Rt_map		*fpavl_loaded(Lm_list *, const char *, avl_index_t *);
559extern void		fpavl_remove(Rt_map *);
560extern size_t		fullpath(Rt_map *, const char *);
561extern void		fmap_setup();
562extern void		get_lcinterface(Rt_map *, Lc_interface *);
563extern Lmid_t		get_linkmap_id(Lm_list *);
564extern Pnode		*get_next_dir(Pnode **, Rt_map *, uint_t);
565extern int		hdl_add(Grp_hdl *, Rt_map *, uint_t);
566extern Grp_hdl		*hdl_create(Lm_list *, Rt_map *, Rt_map *, uint_t);
567extern int		hdl_initialize(Grp_hdl *, Rt_map *, int, int);
568extern int		hwcap_check(Rej_desc *, Ehdr *);
569extern Pnode 		*hwcap_filtees(Pnode **, Aliste, Lm_cntl *, Dyninfo *,
570			    Rt_map *, const char *, int, uint_t);
571extern void		is_dep_ready(Rt_map *, Rt_map *, int);
572extern void		is_dep_init(Rt_map *, Rt_map *);
573extern int		is_sym_interposer(Rt_map *, Sym *);
574extern void		ldso_plt_init(Rt_map *);
575extern Listnode		*list_append(List *, const void *);
576extern Listnode		*list_insert(List *, const void *, Listnode *);
577extern Listnode		*list_prepend(List *, const void *);
578extern void		list_delete(List *, void *);
579extern void		leave(Lm_list *);
580extern void		lm_append(Lm_list *, Aliste, Rt_map *);
581extern void		lm_delete(Lm_list *, Rt_map *);
582extern void		lm_move(Lm_list *, Aliste, Aliste, Lm_cntl *,
583			    Lm_cntl *);
584extern void		load_completion(Rt_map *, Rt_map *);
585extern Rt_map 		*load_hwcap(Lm_list *, Aliste, const char *, Rt_map *,
586			    uint_t, uint_t, Grp_hdl **, Rej_desc *);
587extern Rt_map		*load_path(Lm_list *, Aliste, const char *, Rt_map *,
588			    int, uint_t, Grp_hdl **, Fdesc *, Rej_desc *);
589extern Rt_map		*load_one(Lm_list *, Aliste, Pnode *, Rt_map *, int,
590			    uint_t, Grp_hdl **);
591extern const char	*load_trace(Lm_list *, const char *, Rt_map *);
592extern caddr_t		nu_map(Lm_list *, caddr_t, size_t, int, int);
593extern void		*malloc(size_t);
594extern void		move_data(Rt_map *);
595extern int		pr_open(Lm_list *);
596extern void		rd_event(Lm_list *, rd_event_e, r_state_e);
597extern int		readenv_user(const char **, Word *, Word *, int);
598extern int		readenv_config(Rtc_env *, Addr, int);
599extern void		rejection_inherit(Rej_desc *, Rej_desc *, Fdesc *);
600extern int		relocate_lmc(Lm_list *, Aliste, Rt_map *, Rt_map *);
601extern int		relocate_finish(Rt_map *, Alist *, int, int);
602extern void		remove_cntl(Lm_list *, Aliste);
603extern int		remove_hdl(Grp_hdl *, Rt_map *, int *);
604extern void		remove_lmc(Lm_list *, Rt_map *, Lm_cntl *, Aliste,
605			    const char *);
606extern void		remove_incomplete(Lm_list *, Aliste);
607extern void		remove_lists(Rt_map *, int);
608extern void		remove_lml(Lm_list *);
609extern void		remove_pnode(Pnode *);
610extern void		remove_rej(Rej_desc *);
611extern void		remove_so(Lm_list *, Rt_map *);
612extern int		rt_cond_broadcast(Rt_cond *);
613extern Rt_cond		*rt_cond_create(void);
614extern int		rt_cond_wait(Rt_cond *, Rt_lock *);
615extern int		rt_bind_guard(int);
616extern int		rt_bind_clear(int);
617extern int		rt_get_extern(Lm_list *, Rt_map *);
618extern int		rt_mutex_lock(Rt_lock *);
619extern int		rt_mutex_unlock(Rt_lock *);
620extern void		rt_thr_init(Lm_list *);
621extern thread_t		rt_thr_self(void);
622extern void		rtld_db_dlactivity(Lm_list *);
623extern void		rtld_db_preinit(Lm_list *);
624extern void		rtld_db_postinit(Lm_list *);
625extern void		rtldexit(Lm_list *, int);
626extern int		rtld_getopt(char **, char ***, auxv_t **, Word *,
627			    Word *, int);
628extern void		security(uid_t, uid_t, gid_t, gid_t, int);
629extern void		set_environ(Lm_list *);
630extern Rt_map		*setup(char **, auxv_t *, Word, char *, int, char *,
631			    Dyn *, ulong_t, ulong_t, int fd, Phdr *, char *,
632			    char **, int, uid_t, uid_t, gid_t, gid_t, void *,
633			    int, uint_t);
634extern int		tls_assign(Lm_list *, Rt_map *, Phdr *);
635extern void		tls_modaddrem(Rt_map *, uint_t);
636extern int		tls_statmod(Lm_list *, Rt_map *);
637extern Rt_map		**tsort(Rt_map *, int, int);
638extern void		unused(Lm_list *);
639extern int		update_mode(Rt_map *, int, int);
640extern void		zero(caddr_t, size_t);
641
642#if	defined(__sparc)
643/*
644 * SPARC Register symbol support.
645 */
646extern int		elf_regsyms(Rt_map *);
647extern void		set_sparc_g1(ulong_t);
648extern void		set_sparc_g2(ulong_t);
649extern void		set_sparc_g3(ulong_t);
650extern void		set_sparc_g4(ulong_t);
651extern void		set_sparc_g5(ulong_t);
652extern void		set_sparc_g6(ulong_t);
653extern void		set_sparc_g7(ulong_t);
654#endif
655
656extern long		_sysconfig(int);
657
658#ifdef	__cplusplus
659}
660#endif
661
662#endif /* __RTLD_H */
663