xref: /illumos-gate/usr/src/cmd/sgs/rtld/common/_rtld.h (revision 1c1abfbc1c2d0908a973470fd549f89022b3dcc3)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
55aefb655Srie  * Common Development and Distribution License (the "License").
65aefb655Srie  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
2156deab07SRod Evans 
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  *	Copyright (c) 1988 AT&T
247c478bd9Sstevel@tonic-gate  *	  All Rights Reserved
257c478bd9Sstevel@tonic-gate  *
26f441771bSRod Evans  * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
277c478bd9Sstevel@tonic-gate  */
287c478bd9Sstevel@tonic-gate #ifndef	__RTLD_H
297c478bd9Sstevel@tonic-gate #define	__RTLD_H
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate /*
327c478bd9Sstevel@tonic-gate  * Common header for run-time linker.
337c478bd9Sstevel@tonic-gate  */
347c478bd9Sstevel@tonic-gate #include <sys/types.h>
357c478bd9Sstevel@tonic-gate #include <sys/stat.h>
367c478bd9Sstevel@tonic-gate #include <sys/avl.h>
3756deab07SRod Evans #include <sys/mman.h>
387c478bd9Sstevel@tonic-gate #include <stdarg.h>
397c478bd9Sstevel@tonic-gate #include <synch.h>
407c478bd9Sstevel@tonic-gate #include <signal.h>
417c478bd9Sstevel@tonic-gate #include <errno.h>
427c478bd9Sstevel@tonic-gate #include <unistd.h>
437c478bd9Sstevel@tonic-gate #include <link.h>
447c478bd9Sstevel@tonic-gate #include <rtld.h>
457c478bd9Sstevel@tonic-gate #include <sgs.h>
467c478bd9Sstevel@tonic-gate #include <machdep.h>
477c478bd9Sstevel@tonic-gate #include <rtc.h>
485aefb655Srie #include <debug.h>
497c478bd9Sstevel@tonic-gate #include <msg.h>
507c478bd9Sstevel@tonic-gate #include <libc_int.h>
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
537c478bd9Sstevel@tonic-gate extern "C" {
547c478bd9Sstevel@tonic-gate #endif
557c478bd9Sstevel@tonic-gate 
567c478bd9Sstevel@tonic-gate /*
577c478bd9Sstevel@tonic-gate  * Dependency search rule order.
587c478bd9Sstevel@tonic-gate  */
597c478bd9Sstevel@tonic-gate #define	RPLENV		1		/* replaceable LD_LIBRARY_PATH */
607c478bd9Sstevel@tonic-gate #define	PRMENV		2		/* permanent LD_LIBRARY_PATH */
617c478bd9Sstevel@tonic-gate #define	RUNPATH		3		/* callers runpath */
627c478bd9Sstevel@tonic-gate #define	DEFAULT		4		/* default library path */
637c478bd9Sstevel@tonic-gate 
6456deab07SRod Evans typedef struct fdesc	Fdesc;
6556deab07SRod Evans typedef struct fct	Fct;
6656deab07SRod Evans typedef	struct pdesc	Pdesc;
677c478bd9Sstevel@tonic-gate 
687c478bd9Sstevel@tonic-gate /*
697c478bd9Sstevel@tonic-gate  * Data structure for file class specific functions and data.
707c478bd9Sstevel@tonic-gate  */
7156deab07SRod Evans struct fct {
7256deab07SRod Evans 	/* Verify that the object is of this class. */
7356deab07SRod Evans 	Fct	*(*fct_verify_file)(caddr_t, size_t, Fdesc *, const char *,
7456deab07SRod Evans 	    Rej_desc *);
7556deab07SRod Evans 
7656deab07SRod Evans 	/* Generate a link-map to describe the loaded object. */
7756deab07SRod Evans 	Rt_map	*(*fct_new_lmp)(Lm_list *, Aliste, Fdesc *, Addr, size_t,
7856deab07SRod Evans 	    void *, int *);
7956deab07SRod Evans 
8056deab07SRod Evans 	/* Retrieve the entry point of the object. */
8156deab07SRod Evans 	Addr	(*fct_entry_pt)(void);
8256deab07SRod Evans 
8356deab07SRod Evans 	/* Determine the objects dependencies (needed entries). */
849aa23310Srie 	int	(*fct_needed)(Lm_list *, Aliste, Rt_map *, int *);
8556deab07SRod Evans 
8656deab07SRod Evans 	/* Look up a symbol for the object. */
8708278a5eSRod Evans 	int	(*fct_lookup_sym)(Slookup *, Sresult *, uint_t *, int *);
887c478bd9Sstevel@tonic-gate 
8956deab07SRod Evans 	/* Relocate the object. */
9056deab07SRod Evans 	int	(*fct_reloc)(Rt_map *, uint_t, int *, APlist **);
917c478bd9Sstevel@tonic-gate 
9256deab07SRod Evans 	/* List of default directories to search for dependencies. */
9356deab07SRod Evans 	Alist	**(*fct_get_def_dirs)(void);
9456deab07SRod Evans 
9556deab07SRod Evans 	/* List of secure directories to search for dependencies. */
9656deab07SRod Evans 	Alist	**(*fct_get_sec_dirs)(void);
977c478bd9Sstevel@tonic-gate 
9856deab07SRod Evans 	/* Transpose the name of the object. */
9956deab07SRod Evans 	int	(*fct_fix_name)(const char *, Rt_map *, Alist **, Aliste,
10056deab07SRod Evans 	    uint_t);
10156deab07SRod Evans 
10256deab07SRod Evans 	/* Get a shared object name */
10356deab07SRod Evans 	char	*(*fct_get_so)(const char *, const char *, size_t, size_t);
10456deab07SRod Evans 
10556deab07SRod Evans 	/* Retrieve a symbolic address from the object. */
10656deab07SRod Evans 	void	(*fct_dladdr)(ulong_t, Rt_map *, Dl_info *, void **, int);
10756deab07SRod Evans 
10856deab07SRod Evans 	/* Process a dlsym(3c) request within the object. */
10908278a5eSRod Evans 	int	(*fct_dlsym)(Grp_hdl *, Slookup *, Sresult *, uint_t *, int *);
11056deab07SRod Evans };
1117c478bd9Sstevel@tonic-gate 
1127c478bd9Sstevel@tonic-gate /*
1137c478bd9Sstevel@tonic-gate  * Macros for getting to the file class table.
1147c478bd9Sstevel@tonic-gate  */
1157c478bd9Sstevel@tonic-gate #define	LM_ENTRY_PT(X)		((X)->rt_fct->fct_entry_pt)
1167c478bd9Sstevel@tonic-gate #define	LM_NEEDED(X)		((X)->rt_fct->fct_needed)
1177c478bd9Sstevel@tonic-gate #define	LM_LOOKUP_SYM(X)	((X)->rt_fct->fct_lookup_sym)
1187c478bd9Sstevel@tonic-gate #define	LM_RELOC(X)		((X)->rt_fct->fct_reloc)
11956deab07SRod Evans #define	LM_DEFAULT_DIRS(X)	((X)->rt_fct->fct_get_def_dirs)
12056deab07SRod Evans #define	LM_SECURE_DIRS(X)	((X)->rt_fct->fct_get_sec_dirs)
1217c478bd9Sstevel@tonic-gate #define	LM_FIX_NAME(X)		((X)->rt_fct->fct_fix_name)
1227c478bd9Sstevel@tonic-gate #define	LM_GET_SO(X)		((X)->rt_fct->fct_get_so)
1237c478bd9Sstevel@tonic-gate #define	LM_DLADDR(X)		((X)->rt_fct->fct_dladdr)
1247c478bd9Sstevel@tonic-gate #define	LM_DLSYM(X)		((X)->rt_fct->fct_dlsym)
1257c478bd9Sstevel@tonic-gate 
12656deab07SRod Evans /*
12756deab07SRod Evans  * Initial memory map allocation.  Typical ELF objects contain a text and data
12856deab07SRod Evans  * segment, which can be augmented with a bss mapping.  Add a bunch more for
12956deab07SRod Evans  * luck.
13056deab07SRod Evans  */
13156deab07SRod Evans #define	MMAPFD_NUM	10
1327c478bd9Sstevel@tonic-gate 
1337c478bd9Sstevel@tonic-gate /*
13456deab07SRod Evans  * Define Alist initialization counts.
1357c478bd9Sstevel@tonic-gate  */
13656deab07SRod Evans #define	AL_CNT_ALIAS	2		/* ALIAS() */
137a4bc8592SRod Evans #define	AL_CNT_DEPENDS	20		/* DEPENDS() */
138a4bc8592SRod Evans #define	AL_CNT_CALLERS	20		/* CALLERS() */
1392017c965SRod Evans #define	AL_CNT_GROUPS	20		/* GROUPS() */
14056deab07SRod Evans #define	AL_CNT_COPYREL	10		/* COPY() */
14156deab07SRod Evans #define	AL_CNT_LAZYFIND	10		/* elf_lazy_find_sym() */
14256deab07SRod Evans #define	AL_CNT_GRPCLCT	10		/* gdp_collect() */
14356deab07SRod Evans #define	AL_CNT_DEPCLCT	10		/* load_finish() */
14456deab07SRod Evans #define	AL_CNT_RTLDINFO	1		/* RTLDINFO() */
14556deab07SRod Evans #define	AL_CNT_FPNODE	4		/* FPNODE() */
146481bba9eSRod Evans #define	AL_CNT_LMLISTS	20		/* lm_lists */
14756deab07SRod Evans #define	AL_CNT_LMNOW	8		/* lm_now */
14856deab07SRod Evans #define	AL_CNT_RELBIND	20		/* relocation binding */
14956deab07SRod Evans #define	AL_CNT_ACTAUDIT	2		/* lm_actaudit */
15056deab07SRod Evans #define	AL_CNT_MOVES	10		/* move_data */
15156deab07SRod Evans #define	AL_CNT_MPOBJS	4		/* elf_obj_file() */
15256deab07SRod Evans #define	AL_CNT_TEXTREL	2		/* text relocation segment */
15356deab07SRod Evans #define	AL_CNT_NEEDED	1		/* dependency path */
15456deab07SRod Evans #define	AL_CNT_SEARCH	4		/* search path */
15556deab07SRod Evans #define	AL_CNT_FILTEES	2		/* filtee path */
15656deab07SRod Evans #define	AL_CNT_HANDLES	1		/* hdl_list[] */
157a4bc8592SRod Evans #define	AL_CNT_FREELIST	80		/* free_alp */
15808278a5eSRod Evans #define	AL_CNT_CAP	10		/* capabilities candidate */
15956deab07SRod Evans #define	AL_CNT_SPATH	4		/* search path */
16057ef7aa9SRod Evans #define	AL_CNT_DYNLIST	2		/* dynlm_list */
16157ef7aa9SRod Evans #define	AL_CNT_PENDING	2		/* pending tsort list (INITFIRST) */
16257ef7aa9SRod Evans #define	AL_CNT_PLTPAD	10		/* plt padding */
16357ef7aa9SRod Evans #define	AL_CNT_AUDITORS	2		/* auditing list */
164*1c1abfbcSRod Evans #define	AL_CNT_ENVIRON	20		/* environment list (enough for ldd) */
1657c478bd9Sstevel@tonic-gate 
1667c478bd9Sstevel@tonic-gate /*
1677c478bd9Sstevel@tonic-gate  * Size of buffer for building error messages.
1687c478bd9Sstevel@tonic-gate  */
1697c478bd9Sstevel@tonic-gate #define	ERRSIZE		2048		/* MAXPATHLEN * 2 */
1707c478bd9Sstevel@tonic-gate 
1717c478bd9Sstevel@tonic-gate /*
1727c478bd9Sstevel@tonic-gate  * Configuration file information.
1737c478bd9Sstevel@tonic-gate  */
1747c478bd9Sstevel@tonic-gate typedef struct config {
1757c478bd9Sstevel@tonic-gate 	const char	*c_name;
1767c478bd9Sstevel@tonic-gate 	Addr		c_bgn;
1777c478bd9Sstevel@tonic-gate 	Addr		c_end;
1787c478bd9Sstevel@tonic-gate 	Word		*c_hashtbl;
1797c478bd9Sstevel@tonic-gate 	Word		*c_hashchain;
1807c478bd9Sstevel@tonic-gate 	const char	*c_strtbl;
1817c478bd9Sstevel@tonic-gate 	Rtc_obj		*c_objtbl;
1827c478bd9Sstevel@tonic-gate 	Rtc_fltr	*c_fltr;
1837c478bd9Sstevel@tonic-gate 	Rtc_flte	*c_flte;
1847c478bd9Sstevel@tonic-gate } Config;
1857c478bd9Sstevel@tonic-gate 
1867c478bd9Sstevel@tonic-gate /*
1877c478bd9Sstevel@tonic-gate  * Register symbol list.
1887c478bd9Sstevel@tonic-gate  */
1897c478bd9Sstevel@tonic-gate typedef struct reglist {
1907c478bd9Sstevel@tonic-gate 	Rt_map		*rl_lmp;	/* defining object */
1917c478bd9Sstevel@tonic-gate 	Sym		*rl_sym;	/* regsym */
1927c478bd9Sstevel@tonic-gate 	struct reglist	*rl_next;	/* next entry */
1937c478bd9Sstevel@tonic-gate } Reglist;
1947c478bd9Sstevel@tonic-gate 
1957c478bd9Sstevel@tonic-gate /*
1967c478bd9Sstevel@tonic-gate  * Data structure to hold interpreter information.
1977c478bd9Sstevel@tonic-gate  */
1987c478bd9Sstevel@tonic-gate typedef struct interp {
1997c478bd9Sstevel@tonic-gate 	char		*i_name;	/* interpreter name */
2007c478bd9Sstevel@tonic-gate 	caddr_t		i_faddr;	/* address interpreter is mapped at */
2017c478bd9Sstevel@tonic-gate } Interp;
2027c478bd9Sstevel@tonic-gate 
2037c478bd9Sstevel@tonic-gate /*
2047c478bd9Sstevel@tonic-gate  * Data structure used to keep track of copy relocations.  These relocations
2057c478bd9Sstevel@tonic-gate  * are collected during initial relocation processing and maintained on the
2067c478bd9Sstevel@tonic-gate  * COPY(lmp) list of the defining object.  Each copy list is also added to the
2077c478bd9Sstevel@tonic-gate  * COPY(lmp) of the head object (normally the application dynamic executable)
2087c478bd9Sstevel@tonic-gate  * from which they will be processed after all relocations are done.
2097c478bd9Sstevel@tonic-gate  *
2107c478bd9Sstevel@tonic-gate  * The use of RTLD_GROUP will also reference individual objects COPY(lmp) lists
2117c478bd9Sstevel@tonic-gate  * in case a bound symbol must be assigned to it actual copy relocation.
2127c478bd9Sstevel@tonic-gate  */
2137c478bd9Sstevel@tonic-gate typedef struct {
2147c478bd9Sstevel@tonic-gate 	const char	*r_name;	/* symbol name */
2157c478bd9Sstevel@tonic-gate 	Sym		*r_rsym;	/* reference symbol table entry */
2167c478bd9Sstevel@tonic-gate 	Rt_map		*r_rlmp;	/* reference link map */
2177c478bd9Sstevel@tonic-gate 	Rt_map		*r_dlmp;	/* definition link map */
2187c478bd9Sstevel@tonic-gate 	Sym		*r_dsym;	/* definition symbol table entry */
2197c478bd9Sstevel@tonic-gate 	void		*r_radd;	/* copy to address */
2207c478bd9Sstevel@tonic-gate 	const void	*r_dadd;	/* copy from address */
2217c478bd9Sstevel@tonic-gate 	ulong_t		r_size;		/* copy size bytes */
2227c478bd9Sstevel@tonic-gate } Rel_copy;
2237c478bd9Sstevel@tonic-gate 
2247c478bd9Sstevel@tonic-gate /*
2257c478bd9Sstevel@tonic-gate  * Define a file descriptor, which maintains information regarding a pathname
2267c478bd9Sstevel@tonic-gate  * that has been opened and minimally inspected.
2277c478bd9Sstevel@tonic-gate  */
22856deab07SRod Evans struct fdesc {
2297c478bd9Sstevel@tonic-gate 	Rt_map		*fd_lmp;	/* existing link-map pointer */
230*1c1abfbcSRod Evans 	Lm_list		*fd_lml;	/* callers link-map list */
2317c478bd9Sstevel@tonic-gate 	Fct		*fd_ftp;	/* file functions pointer */
2327c478bd9Sstevel@tonic-gate 	const char	*fd_oname;	/* original file name */
2337c478bd9Sstevel@tonic-gate 	const char	*fd_odir;	/* original directory name */
2347c478bd9Sstevel@tonic-gate 	const char	*fd_nname;	/* new file (expanded) name */
2357c478bd9Sstevel@tonic-gate 	const char	*fd_pname;	/* new path (resolved) name */
2367c478bd9Sstevel@tonic-gate 	dev_t		fd_dev;		/* file device number */
237cb511613SAli Bahrami 	rtld_ino_t	fd_ino;		/* file inode number */
2387c478bd9Sstevel@tonic-gate 	avl_index_t	fd_avlwhere;	/* avl tree insertion index */
23908278a5eSRod Evans 	Syscapset	fd_scapset;	/* capabilities */
24056deab07SRod Evans 	mmapobj_result_t *fd_mapp;	/* mapping pointer */
24156deab07SRod Evans 	uint_t		fd_mapn;	/* mapping number */
242*1c1abfbcSRod Evans 	uint_t		fd_flags;
24356deab07SRod Evans };
2447c478bd9Sstevel@tonic-gate 
24556deab07SRod Evans #define	FLG_FD_ALTER	0x0001		/* file is an alternate */
24656deab07SRod Evans #define	FLG_FD_SLASH	0x0002		/* file contains a "/" */
24756deab07SRod Evans #define	FLG_FD_RESOLVED	0x0004		/* fd_nname has been resolved */
24808278a5eSRod Evans #define	FLG_FD_ALTCHECK	0x0008		/* alternative system capabilities */
24908278a5eSRod Evans 					/*	checked */
25008278a5eSRod Evans #define	FLG_FD_ALTCAP	0x0010		/* alternative system capabilities */
25108278a5eSRod Evans 					/*	should be used */
252*1c1abfbcSRod Evans #define	FLG_FD_IGNORE	0x0020		/* descriptor should be ignored */
2537c478bd9Sstevel@tonic-gate 
2547c478bd9Sstevel@tonic-gate /*
2557c478bd9Sstevel@tonic-gate  * File descriptor availability flag.
2567c478bd9Sstevel@tonic-gate  */
2577c478bd9Sstevel@tonic-gate #define	FD_UNAVAIL	-1
2587c478bd9Sstevel@tonic-gate 
2597c478bd9Sstevel@tonic-gate /*
2607c478bd9Sstevel@tonic-gate  * Disabled filter flag.  Filter objects are referenced using their .dynamic
2617c478bd9Sstevel@tonic-gate  * index (DT_FILTER or DT_AUXILIARY).  This index is saved and used to lookup
2627c478bd9Sstevel@tonic-gate  * the required filter.  Note that 0 is a valid .dynamic index.  The caller's
2637c478bd9Sstevel@tonic-gate  * OBJFLTRNDX() element is initialized using the following flag, and should
2647c478bd9Sstevel@tonic-gate  * the filter's initialization fail, is reset to this value to indicate the
2657c478bd9Sstevel@tonic-gate  * filter is disabled.  UINT_MAX provides a convenient invalid .dynamic index.
2667c478bd9Sstevel@tonic-gate  */
2677c478bd9Sstevel@tonic-gate #define	FLTR_DISABLED	UINT_MAX
2687c478bd9Sstevel@tonic-gate 
2697c478bd9Sstevel@tonic-gate /*
2707c478bd9Sstevel@tonic-gate  * Status flags for rtld_flags
2717c478bd9Sstevel@tonic-gate  */
2727c478bd9Sstevel@tonic-gate #define	RT_FL_THREADS	0x00000001	/* threads are enabled */
2737c478bd9Sstevel@tonic-gate #define	RT_FL_WARNFLTR	0x00000002	/* warn of missing filtees (ldd) */
2747c478bd9Sstevel@tonic-gate #define	RT_FL_DBNOTIF	0x00000004	/* binding activity going on */
275f441771bSRod Evans #define	RT_FL_DEFERRED	0x00000008	/* load deferred dependencies (ldd) */
2767c478bd9Sstevel@tonic-gate #define	RT_FL_NOBIND	0x00000010	/* don't carry out plt binding */
2777c478bd9Sstevel@tonic-gate #define	RT_FL_NOVERSION	0x00000020	/* disable version checking */
2787c478bd9Sstevel@tonic-gate #define	RT_FL_SECURE	0x00000040	/* setuid/segid flag */
2797c478bd9Sstevel@tonic-gate #define	RT_FL_APPLIC	0x00000080	/* are we executing user code */
280*1c1abfbcSRod Evans #define	RT_FL_NOENVIRON	0x00000100	/* don't process environment */
281*1c1abfbcSRod Evans 					/*	variables (ld.so.1 -e) */
2827c478bd9Sstevel@tonic-gate #define	RT_FL_CONFGEN	0x00000200	/* don't relocate initiating object */
283*1c1abfbcSRod Evans 					/*	set by crle(1) */
2847c478bd9Sstevel@tonic-gate #define	RT_FL_CONFAPP	0x00000400	/* application specific configuration */
2857c478bd9Sstevel@tonic-gate 					/*	cache required */
2867c478bd9Sstevel@tonic-gate #define	RT_FL_DEBUGGER	0x00000800	/* a debugger is monitoring us */
2879aa23310Srie #define	RT_FL_OPERATION	0x00001000	/* start recording operations */
2887c478bd9Sstevel@tonic-gate #define	RT_FL_NEWLOCALE	0x00002000	/* message locale has changed */
2897c478bd9Sstevel@tonic-gate #define	RT_FL_NOBAPLT	0x00004000	/* sparc: don't use ba plt's */
2907c478bd9Sstevel@tonic-gate #define	RT_FL_NOAUXFLTR	0x00008000	/* disable auxiliary filters */
29156deab07SRod Evans 
2927c478bd9Sstevel@tonic-gate #define	RT_FL_NOAUDIT	0x00020000	/* disable auditing */
2937c478bd9Sstevel@tonic-gate #define	RT_FL_ATEXIT	0x00040000	/* we're shutting down */
2947c478bd9Sstevel@tonic-gate #define	RT_FL_SILENCERR	0x00080000	/* silence error messages */
29556deab07SRod Evans 
2967c478bd9Sstevel@tonic-gate #define	RT_FL_INITFIRST	0x00200000	/* processing a DT_INITFIRST object */
29756deab07SRod Evans 
2987c478bd9Sstevel@tonic-gate #define	RT_FL_DEMANGLE	0x01000000	/* demangle C++ symbol names */
2997c478bd9Sstevel@tonic-gate #define	RT_FL_NOCFG	0x02000000	/* disable config file use */
3007c478bd9Sstevel@tonic-gate #define	RT_FL_NODIRCFG	0x04000000	/* disable directory config use */
3017c478bd9Sstevel@tonic-gate #define	RT_FL_NOOBJALT	0x08000000	/* disable object alternative use */
3027c478bd9Sstevel@tonic-gate #define	RT_FL_NOENVCFG	0x10000000	/* disable config envars use */
3037c478bd9Sstevel@tonic-gate #define	RT_FL_DIRCFG	0x20000000	/* directory config info available */
3047c478bd9Sstevel@tonic-gate #define	RT_FL_OBJALT	0x40000000	/* object alternatives are available */
3057c478bd9Sstevel@tonic-gate #define	RT_FL_MEMRESV	0x80000000	/* memory reservation established */
3067c478bd9Sstevel@tonic-gate 
3077c478bd9Sstevel@tonic-gate /*
3087c478bd9Sstevel@tonic-gate  * Status flags for rtld_flags2
3097c478bd9Sstevel@tonic-gate  */
3105aefb655Srie #define	RT_FL2_HASAUDIT	0x00000001	/* auditing lm_list is present */
3117c478bd9Sstevel@tonic-gate #define	RT_FL2_RTLDSEEN	0x00000002	/* rtldinfo has been set */
3125aefb655Srie #define	RT_FL2_UNIFPROC	0x00000004	/* libc/libthread unified environment */
31356deab07SRod Evans 
3147c478bd9Sstevel@tonic-gate #define	RT_FL2_NOFLTCFG	0x00000010	/* disable config filter use */
3157c478bd9Sstevel@tonic-gate #define	RT_FL2_FLTCFG	0x00000020	/* filter config info available */
3167c478bd9Sstevel@tonic-gate #define	RT_FL2_HWCAP	0x00000040	/* hardware capabilities available */
3177c478bd9Sstevel@tonic-gate #define	RT_FL2_FTL2WARN	0x00000080	/* convert fatal to warning messages */
3187c478bd9Sstevel@tonic-gate #define	RT_FL2_BINDNOW	0x00000100	/* LD_BIND_NOW in effect */
319dffec89cSrie #define	RT_FL2_BINDLAZY	0x00000200	/* disable RTLD_NOW (and LD_BIND_NOW) */
32010a4fa49Srie #define	RT_FL2_PLMSETUP	0x00000400	/* primary link-map set up complete */
3219aa23310Srie #define	RT_FL2_BRANDED	0x00000800	/* process is branded */
3229aa23310Srie #define	RT_FL2_NOPLM	0x00001000	/* process has no primary link map */
3233dbfc803SRod Evans #define	RT_FL2_SETUID	0x00002000	/* ld.so.1 is setuid root */
324bebb829dSRod Evans #define	RT_FL2_ADDR32	0x00004000	/* 32-bit address space requirement */
3257c478bd9Sstevel@tonic-gate 
3267c478bd9Sstevel@tonic-gate /*
3277c478bd9Sstevel@tonic-gate  * Information flags for env_info.
3287c478bd9Sstevel@tonic-gate  */
3297c478bd9Sstevel@tonic-gate #define	ENV_INF_PATHCFG	0x00000001	/* replaceable LD_LIBRARY_PATH */
3307c478bd9Sstevel@tonic-gate 					/*	originates from configuration */
3317c478bd9Sstevel@tonic-gate 					/*	file */
3327c478bd9Sstevel@tonic-gate #define	ENV_INF_FLAGCFG	0x00000002	/* replaceable LD_FLAGS originates */
3337c478bd9Sstevel@tonic-gate 					/*	from configuration file */
3347c478bd9Sstevel@tonic-gate 
3357c478bd9Sstevel@tonic-gate /*
33610a4fa49Srie  * RTLDINFO descriptor.
33710a4fa49Srie  */
33810a4fa49Srie typedef struct {
33910a4fa49Srie 	Rt_map		*rti_lmp;	/* RTLDINFO provider */
34010a4fa49Srie 	Lc_interface	*rti_info;	/* RTLDINFO data */
34110a4fa49Srie } Rti_desc;
34210a4fa49Srie 
34310a4fa49Srie /*
34456deab07SRod Evans  * Binding flags for the rt_bind_guard()/rt_bind_clear() routines.
3458cd45542Sraf  * These are defined in usr/src/lib/libc/inc/libc_int.h in the
3468cd45542Sraf  * latest version of the libc/rtld runtime interface (CI_V_FIVE).
3477c478bd9Sstevel@tonic-gate  */
3488cd45542Sraf #if !defined(CI_V_FIVE)
34956deab07SRod Evans #define	THR_FLG_RTLD	0x00000001	/* rtldlock bind guard flag */
3508cd45542Sraf #define	THR_FLG_NOLOCK	0x00000000	/* no-op before CI_V_FIVE */
3518cd45542Sraf #define	THR_FLG_REENTER	0x00000000	/* no-op before CI_V_FIVE */
3528cd45542Sraf #endif
3537c478bd9Sstevel@tonic-gate 
3549aa23310Srie #define	ROUND(x, a)	(((int)(x) + ((int)(a) - 1)) & ~((int)(a) - 1))
3557c478bd9Sstevel@tonic-gate 
3567c478bd9Sstevel@tonic-gate /*
3577c478bd9Sstevel@tonic-gate  * Print buffer.
3587c478bd9Sstevel@tonic-gate  */
3597c478bd9Sstevel@tonic-gate typedef struct {
3607c478bd9Sstevel@tonic-gate 	char	*pr_buf;	/* pointer to beginning of buffer */
3617c478bd9Sstevel@tonic-gate 	char	*pr_cur;	/* pointer to next free char in buffer */
3627c478bd9Sstevel@tonic-gate 	size_t	pr_len;		/* buffer size */
3637c478bd9Sstevel@tonic-gate 	int	pr_fd;		/* output fd */
3647c478bd9Sstevel@tonic-gate } Prfbuf;
3657c478bd9Sstevel@tonic-gate 
3667c478bd9Sstevel@tonic-gate /*
36756deab07SRod Evans  * Path name descriptor.  Used to construct various path names such as search
36856deab07SRod Evans  * paths, dependency paths, filter paths etc.  The pd_info element can be used
36956deab07SRod Evans  * to hold various pointers, like Grp_hdl, Rtc_obj, etc.
3707c478bd9Sstevel@tonic-gate  */
37156deab07SRod Evans struct pdesc {
37256deab07SRod Evans 	const char	*pd_pname;	/* path name - may be expanded */
37356deab07SRod Evans 	const char	*pd_oname;	/* original name - unexpanded */
37456deab07SRod Evans 	void		*pd_info;	/* possible auxiliary information */
37556deab07SRod Evans 	size_t		pd_plen;	/* path name length */
37656deab07SRod Evans 	uint_t		pd_flags;	/* descriptor specific flags */
37756deab07SRod Evans };
3787c478bd9Sstevel@tonic-gate 
3797c478bd9Sstevel@tonic-gate /*
38056deab07SRod Evans  * Path name descriptors are passed to expand_path() and expand().  These
38156deab07SRod Evans  * routines break down possible multiple path strings (separated with ":"),
38256deab07SRod Evans  * and perform any reserved token expansion.  These routines are passed
38356deab07SRod Evans  * information that indicates the use of the path, for example, search paths,
38456deab07SRod Evans  * i.e., LD_LIBRARY_PATH, RPATHS, etc. are defined using la_objsearch()
38556deab07SRod Evans  * information (see LA_SER flags in link.h).  This information is recorded in
38656deab07SRod Evans  * the pd_flags field for later use.
38756deab07SRod Evans  *
38856deab07SRod Evans  * Define expansion path tokens.  These are used to prevent various expansions
38956deab07SRod Evans  * from occurring, and record those expansions that do.  Any expansion
39056deab07SRod Evans  * information is also recorded in the pd_flags field, and thus is or'd
39156deab07SRod Evans  * together with any LA_SER flags.
39256deab07SRod Evans  */
39356deab07SRod Evans #define	PD_TKN_ORIGIN	0x00001000	/* $ORIGIN expansion has occurred */
39456deab07SRod Evans #define	PD_TKN_PLATFORM	0x00002000	/* $PLATFORM expansion has occurred */
39556deab07SRod Evans #define	PD_TKN_OSNAME	0x00004000	/* $OSNAME expansion has occurred */
39656deab07SRod Evans #define	PD_TKN_OSREL	0x00008000	/* $OSREL expansion has occurred */
39756deab07SRod Evans #define	PD_TKN_ISALIST	0x00010000	/* $ISALIST expansion has occurred */
39808278a5eSRod Evans #define	PD_TKN_CAP	0x00020000	/* $CAPABILITY/$HWCAP expansion has */
39908278a5eSRod Evans 					/*	occurred */
40008278a5eSRod Evans #define	PD_TKN_MACHINE	0x00040000	/* $MACHINE expansion has occurred */
40108278a5eSRod Evans #define	PD_TKN_RESOLVED	0x00080000	/* resolvepath() expansion has */
40256deab07SRod Evans 					/*	occurred */
40356deab07SRod Evans #define	PD_MSK_EXPAND	0x000ff000	/* mask for all expansions */
40456deab07SRod Evans 
40556deab07SRod Evans /*
40656deab07SRod Evans  * Define additional path information.  These definitions extend the path
40756deab07SRod Evans  * information, and may be passed into expand_path(), or set internally, or
40856deab07SRod Evans  * inherited from expand().  These definitions are or'd together with any
40956deab07SRod Evans  * LA_SER_ flags and PD_TKN_ flags.
41056deab07SRod Evans  */
41156deab07SRod Evans #define	PD_FLG_PNSLASH	0x00100000	/* pd_pname contains a slash */
41256deab07SRod Evans #define	PD_FLG_DUPLICAT	0x00200000	/* path is a duplicate */
41356deab07SRod Evans #define	PD_FLG_EXTLOAD	0x00400000	/* path defines extra loaded objects */
4147c478bd9Sstevel@tonic-gate 					/*	(preload, audit etc.) */
41556deab07SRod Evans #define	PD_FLG_UNIQUE	0x00800000	/* ensure path is unique */
41656deab07SRod Evans #define	PD_FLG_USED	0x01000000	/* indicate that path is used */
41756deab07SRod Evans #define	PD_FLG_FULLPATH	0x02000000	/* ensure path is a full path */
4187c478bd9Sstevel@tonic-gate 
41956deab07SRod Evans #define	PD_MSK_INHERIT	0x0ffff000	/* mask for pd_flags incorporation */
4207c478bd9Sstevel@tonic-gate 
4217c478bd9Sstevel@tonic-gate /*
42256deab07SRod Evans  * Additional token expansion information.  Although these flags may be set
42356deab07SRod Evans  * within a token data item return from expand(), they are masked off with
42456deab07SRod Evans  * PD_MSK_INHERIT prior to any expansion information being recorded in a path
42556deab07SRod Evans  * name descriptor for later diagnostics.
42656deab07SRod Evans  */
42756deab07SRod Evans #define	TKN_NONE	0x00000001	/* no token expansion has occurred */
42856deab07SRod Evans #define	TKN_DOTSLASH	0x00000002	/* path contains a "./" */
42956deab07SRod Evans 
43056deab07SRod Evans /*
43156deab07SRod Evans  * dlopen() handle list size.
4327c478bd9Sstevel@tonic-gate  */
43356deab07SRod Evans #define	HDLIST_SZ	101	/* prime no. for hashing */
43456deab07SRod Evans #define	HDLIST_ORP	102	/* orphan handle list */
4357c478bd9Sstevel@tonic-gate 
43656deab07SRod Evans /*
43756deab07SRod Evans  * Define a path name search descriptor.  This "cookie" maintains state as
43856deab07SRod Evans  * search paths are processed with get_next_dir().  Note, the path list is an
43956deab07SRod Evans  * indirect pointer, as search paths can be reevaluated for secure applications
44056deab07SRod Evans  * to provide better error diagnostics.
44156deab07SRod Evans  */
44256deab07SRod Evans typedef struct {
44356deab07SRod Evans 	uchar_t		*sp_rule;	/* present search rule */
44456deab07SRod Evans 	Alist		**sp_dalpp;	/* present path list within rule */
44556deab07SRod Evans 	Aliste		sp_idx;		/* present index within path list */
44656deab07SRod Evans } Spath_desc;
4477c478bd9Sstevel@tonic-gate 
4489aa23310Srie /*
44956deab07SRod Evans  * Define a path name definition descriptor.  Used to maintain initial ELF and
45056deab07SRod Evans  * AOUT path name definitions.
4519aa23310Srie  */
45256deab07SRod Evans typedef struct {
45356deab07SRod Evans 	const char	*sd_name;	/* path name */
45456deab07SRod Evans 	size_t		sd_len;		/* path name size */
45556deab07SRod Evans } Spath_defn;
4567c478bd9Sstevel@tonic-gate 
4577c478bd9Sstevel@tonic-gate /*
4587c478bd9Sstevel@tonic-gate  * Define _caller flags.
4597c478bd9Sstevel@tonic-gate  */
4607c478bd9Sstevel@tonic-gate #define	CL_NONE		0
4617c478bd9Sstevel@tonic-gate #define	CL_EXECDEF	1		/* supply the executable as a default */
4627c478bd9Sstevel@tonic-gate 					/* if the caller can't be determined */
4637c478bd9Sstevel@tonic-gate 
4647c478bd9Sstevel@tonic-gate /*
46537ffaf83SRod Evans  * Binding information flags.  These flags are passed up from low level binding
46637ffaf83SRod Evans  * routines to indicate "additional" information, such as why a binding has been
46737ffaf83SRod Evans  * rejected.  These flags use the same data element as is used to record any
46837ffaf83SRod Evans  * DBG_BINFO flags.  The DBG_BINFO flags are used to define the final bindings
46937ffaf83SRod Evans  * information and are used to provide better binding diagnostics.
4707c478bd9Sstevel@tonic-gate  */
47137ffaf83SRod Evans #define	BINFO_REJDIRECT		0x010000	/* reject a direct binding */
47237ffaf83SRod Evans #define	BINFO_REJSINGLE		0x100000	/* reject a singleton binding */
47337ffaf83SRod Evans #define	BINFO_REJGROUP		0x200000	/* reject a group binding */
47437ffaf83SRod Evans 
47537ffaf83SRod Evans #define	BINFO_MSK_TRYAGAIN	0xf00000	/* a mask of bindings that */
47637ffaf83SRod Evans 						/*    should be retried */
47737ffaf83SRod Evans #define	BINFO_MSK_REJECTED	0xff0000	/* a mask of bindings that */
47837ffaf83SRod Evans 						/*    have been rejected */
479cb511613SAli Bahrami 
480cb511613SAli Bahrami /*
481cb511613SAli Bahrami  * The 32-bit version of rtld uses special stat() wrapper functions
482cb511613SAli Bahrami  * that preserve the non-largefile semantics of stat()/fstat() while
483cb511613SAli Bahrami  * allowing for large inode values. The 64-bit rtld uses stat() directly.
484cb511613SAli Bahrami  */
485cb511613SAli Bahrami #ifdef _LP64
486cb511613SAli Bahrami #define	rtld_fstat	fstat
487cb511613SAli Bahrami #define	rtld_stat	stat
488cb511613SAli Bahrami typedef	struct stat	rtld_stat_t;
489cb511613SAli Bahrami #else
490cb511613SAli Bahrami typedef struct {
491cb511613SAli Bahrami 	dev_t		st_dev;
492cb511613SAli Bahrami 	rtld_ino_t	st_ino;
493cb511613SAli Bahrami 	mode_t		st_mode;
494cb511613SAli Bahrami 	uid_t		st_uid;
495cb511613SAli Bahrami 	off_t		st_size;
496cb511613SAli Bahrami 	timestruc_t	st_mtim;
497cb511613SAli Bahrami #ifdef sparc
498cb511613SAli Bahrami 	blksize_t	st_blksize;
499cb511613SAli Bahrami #endif
500cb511613SAli Bahrami } rtld_stat_t;
501cb511613SAli Bahrami #endif
502cb511613SAli Bahrami 
5034e12d685SRod Evans /*
5044e12d685SRod Evans  * Some capabilities aux vector definitions have been removed over time.
5054e12d685SRod Evans  * However, existing objects may define these capabilities.  Establish
5064e12d685SRod Evans  * capability masks that provide for deleting any removed capabilities, so
5074e12d685SRod Evans  * that these capabilities are not used to validate the associated object.
5084e12d685SRod Evans  *
5094e12d685SRod Evans  * These masks are tightly coupled to the aux vector definitions in auxv_386.h
5104e12d685SRod Evans  * and auxv_SPARC.h, however they are maintained here, as only ld.so.1 needs
5114e12d685SRod Evans  * to remove these capabilities.  These definitions also describe where the
5124e12d685SRod Evans  * flags are associated and allow for providing multi-architecture definitions
5134e12d685SRod Evans  * should they become necessary, without having to pollute global header files.
5144e12d685SRod Evans  */
5154e12d685SRod Evans #if	defined(__x86)
5164e12d685SRod Evans #define	AV_HW1_IGNORE	(0x8000 | 0x2000)	/* withdrawn MON and PAUSE */
5174e12d685SRod Evans #else						/*    auxv_386.h flags */
5184e12d685SRod Evans #define	AV_HW1_IGNORE	0
5194e12d685SRod Evans #endif
520cb511613SAli Bahrami 
5217c478bd9Sstevel@tonic-gate /*
5227c478bd9Sstevel@tonic-gate  * Data declarations.
5237c478bd9Sstevel@tonic-gate  */
52410a4fa49Srie extern Lc_desc		glcs[];		/* global external interfaces */
52510a4fa49Srie 
5268cd45542Sraf extern	Rt_lock		rtldlock;	/* rtld lock */
5278cd45542Sraf extern	int		thr_flg_nolock;
5288cd45542Sraf extern	int		thr_flg_reenter;
5297c478bd9Sstevel@tonic-gate 
53057ef7aa9SRod Evans extern APlist		*dynlm_list;	/* dynamic list of link-maps */
5317c478bd9Sstevel@tonic-gate extern char		**environ;	/* environ pointer */
5327c478bd9Sstevel@tonic-gate 
5337c478bd9Sstevel@tonic-gate extern int		dyn_plt_ent_size; /* Size of dynamic plt's */
5347c478bd9Sstevel@tonic-gate extern ulong_t		at_flags;	/* machine specific file flags */
53541072f3cSrie extern const char	*procname;	/* file name of executing process */
5367c478bd9Sstevel@tonic-gate extern Rtld_db_priv	r_debug;	/* debugging information */
5377c478bd9Sstevel@tonic-gate extern char		*lasterr;	/* string describing last error */
5387c478bd9Sstevel@tonic-gate extern Interp		*interp;	/* ELF executable interpreter info */
53941072f3cSrie extern const char	*rtldname;	/* name of the dynamic linker */
54056deab07SRod Evans extern APlist		*hdl_alp[];	/* dlopen() handle list */
5417c478bd9Sstevel@tonic-gate extern size_t		syspagsz;	/* system page size */
5427c478bd9Sstevel@tonic-gate extern Isa_desc		*isa;		/* isalist descriptor */
5437c478bd9Sstevel@tonic-gate extern Uts_desc		*uts;		/* utsname descriptor */
5447c478bd9Sstevel@tonic-gate extern uint_t		rtld_flags;	/* status flags for RTLD */
5457c478bd9Sstevel@tonic-gate extern uint_t		rtld_flags2;	/* additional status flags for RTLD */
5467c478bd9Sstevel@tonic-gate extern uint32_t		pltcnt21d;	/* cnt of 21d PLTs */
5477c478bd9Sstevel@tonic-gate extern uint32_t		pltcnt24d;	/* cnt of 24d PLTs */
5487c478bd9Sstevel@tonic-gate extern uint32_t		pltcntu32;	/* cnt of u32 PLTs */
5497c478bd9Sstevel@tonic-gate extern uint32_t		pltcntu44;	/* cnt of u44 PLTs */
5507c478bd9Sstevel@tonic-gate extern uint32_t		pltcntfull;	/* cnt of full PLTs */
5517c478bd9Sstevel@tonic-gate extern uint32_t		pltcntfar;	/* cnt of far PLTs */
5527c478bd9Sstevel@tonic-gate extern uchar_t		search_rules[];	/* dependency search rules */
5537c478bd9Sstevel@tonic-gate 
5547c478bd9Sstevel@tonic-gate extern Fct		elf_fct;	/* ELF file class dependent data */
5557c478bd9Sstevel@tonic-gate 
55602ca3e02Srie #if	defined(__sparc) && !defined(__sparcv9)
5577c478bd9Sstevel@tonic-gate extern Fct		aout_fct;	/* a.out (4.x) file class dependent */
5587c478bd9Sstevel@tonic-gate 					/*	data */
5597c478bd9Sstevel@tonic-gate #endif
5607c478bd9Sstevel@tonic-gate 
5617c478bd9Sstevel@tonic-gate extern Config		*config;		/* configuration structure */
5627c478bd9Sstevel@tonic-gate extern const char	*locale;		/* locale environment setting */
5637c478bd9Sstevel@tonic-gate 
5647c478bd9Sstevel@tonic-gate extern const char	*rpl_audit;	/* replaceable LD_AUDIT string */
5657c478bd9Sstevel@tonic-gate extern const char	*rpl_debug;	/* replaceable LD_DEBUG string */
5667c478bd9Sstevel@tonic-gate extern const char	*rpl_ldflags;	/* replaceable LD_FLAGS string */
5677c478bd9Sstevel@tonic-gate extern const char	*rpl_libpath;	/* replaceable LD_LIBRARY string */
56856deab07SRod Evans extern Alist		*rpl_libdirs;	/*	and its associated Pdesc list */
5697c478bd9Sstevel@tonic-gate extern const char	*rpl_preload;	/* replaceable LD_PRELOAD string */
5707c478bd9Sstevel@tonic-gate 
5717c478bd9Sstevel@tonic-gate extern const char	*prm_audit;	/* permanent LD_AUDIT string */
5727c478bd9Sstevel@tonic-gate extern const char	*prm_debug;	/* permanent LD_DEBUG string */
5737c478bd9Sstevel@tonic-gate extern const char	*prm_ldflags;	/* permanent LD_FLAGS string */
5747c478bd9Sstevel@tonic-gate extern const char	*prm_libpath;	/* permanent LD_LIBRARY string */
57556deab07SRod Evans extern Alist		*prm_libdirs;	/*	and its associated Pdesc list */
5767c478bd9Sstevel@tonic-gate extern const char	*prm_preload;	/* permanent LD_PRELOAD string */
5777c478bd9Sstevel@tonic-gate 
57856deab07SRod Evans extern Alist		*elf_def_dirs;	/* ELF default directory seach paths */
57956deab07SRod Evans extern Alist		*elf_sec_dirs;	/* ELF secure directory seach paths */
58056deab07SRod Evans extern Alist		*aout_def_dirs;	/* AOUT default directory seach paths */
58156deab07SRod Evans extern Alist		*aout_sec_dirs;	/* AOUT secure directory seach paths */
58256deab07SRod Evans 
5837c478bd9Sstevel@tonic-gate extern uint_t		env_info;	/* information regarding environment */
5847c478bd9Sstevel@tonic-gate 					/*	variables */
5857c478bd9Sstevel@tonic-gate extern int		killsig;	/* signal sent on fatal exit */
58656deab07SRod Evans extern APlist		*free_alp;	/* defragmentation list */
5877c478bd9Sstevel@tonic-gate 
5887c478bd9Sstevel@tonic-gate extern uint_t		audit_argcnt;	/* no. of stack args to copy */
5897c478bd9Sstevel@tonic-gate extern Audit_desc	*auditors;	/* global auditors */
5907c478bd9Sstevel@tonic-gate 
5912017c965SRod Evans extern char		**_environ;	/* environ reference for libc */
5927c478bd9Sstevel@tonic-gate 
5937c478bd9Sstevel@tonic-gate extern const char	*dbg_file;	/* debugging directed to a file */
5947c478bd9Sstevel@tonic-gate 
5957c478bd9Sstevel@tonic-gate extern Reglist		*reglist;	/* list of register symbols */
5967c478bd9Sstevel@tonic-gate 
5977c478bd9Sstevel@tonic-gate extern const Msg	err_reject[];	/* rejection error message tables */
5987c478bd9Sstevel@tonic-gate extern const Msg	ldd_reject[];
59908278a5eSRod Evans extern const Msg	ldd_warn[];
6007c478bd9Sstevel@tonic-gate 
6017c478bd9Sstevel@tonic-gate extern const char	*profile_name;	/* object being profiled */
6027c478bd9Sstevel@tonic-gate extern const char	*profile_out;	/* profile output file */
6037c478bd9Sstevel@tonic-gate extern const char	*profile_lib;	/* audit library to perform profile */
6047c478bd9Sstevel@tonic-gate 
60541072f3cSrie extern Dl_argsinfo	argsinfo;	/* process argument, environment and */
60641072f3cSrie 					/*	auxv information */
60741072f3cSrie 
60843d7826aSRod Evans extern const char	*err_strs[ERR_NUM];
60943d7826aSRod Evans 					/* diagnostic error string headers */
6107c478bd9Sstevel@tonic-gate extern const char	*nosym_str;	/* MSG_GEN_NOSYM message cache */
6117c478bd9Sstevel@tonic-gate 
61208278a5eSRod Evans extern Syscapset	*org_scapset;	/* original system capabilities */
61308278a5eSRod Evans extern Syscapset	*alt_scapset;	/* alternative system capabilities */
61408278a5eSRod Evans 
61508278a5eSRod Evans extern const char	*rpl_hwcap;	/* replaceable hwcap str */
61608278a5eSRod Evans extern const char	*rpl_sfcap;	/* replaceable sfcap str */
61708278a5eSRod Evans extern const char	*rpl_machcap;	/* replaceable machcap str */
61808278a5eSRod Evans extern const char	*rpl_platcap;	/* replaceable platcap str */
61908278a5eSRod Evans extern const char	*rpl_cap_files;	/* associated files */
62008278a5eSRod Evans 
62108278a5eSRod Evans extern const char	*prm_hwcap;	/* permanent hwcap str */
62208278a5eSRod Evans extern const char	*prm_sfcap;	/* permanent sfcap str */
62308278a5eSRod Evans extern const char	*prm_machcap;	/* permanent machcap str */
62408278a5eSRod Evans extern const char	*prm_platcap;	/* permanent platcap str */
62508278a5eSRod Evans extern const char	*prm_cap_files;	/* associated files */
6267c478bd9Sstevel@tonic-gate 
62708278a5eSRod Evans extern avl_tree_t	*capavl;	/* capabilities files */
62808278a5eSRod Evans extern avl_tree_t	*nfavl;		/* not-found path names */
62908278a5eSRod Evans extern avl_tree_t	*spavl;		/* secure path names */
6309aa23310Srie 
63120272c2eSAli Bahrami extern u_longlong_t	cnt_map;	/* Incr. for each object mapped */
63220272c2eSAli Bahrami extern u_longlong_t	cnt_unmap;	/* Incr. for each object unmapped */
63320272c2eSAli Bahrami 
6347c478bd9Sstevel@tonic-gate /*
6357c478bd9Sstevel@tonic-gate  * Function declarations.
6367c478bd9Sstevel@tonic-gate  */
6377c478bd9Sstevel@tonic-gate extern void		addfree(void *, size_t);
6387c478bd9Sstevel@tonic-gate extern int		append_alias(Rt_map *, const char *, int *);
63956deab07SRod Evans extern Rt_map		*analyze_lmc(Lm_list *, Aliste, Rt_map *, int *);
6407c478bd9Sstevel@tonic-gate extern void		atexit_fini(void);
6417c478bd9Sstevel@tonic-gate extern int		bind_one(Rt_map *, Rt_map *, uint_t);
6427c478bd9Sstevel@tonic-gate extern int		bufprint(Prfbuf *, const char *, ...);
6435aefb655Srie extern void		call_array(Addr *, uint_t, Rt_map *, Word);
6447c478bd9Sstevel@tonic-gate extern void		call_fini(Lm_list *, Rt_map **);
6457c478bd9Sstevel@tonic-gate extern void		call_init(Rt_map **, int);
64660758829Srie extern int		callable(Rt_map *, Rt_map *, Grp_hdl *, uint_t);
6477c478bd9Sstevel@tonic-gate extern Rt_map		*_caller(caddr_t, int);
6487c478bd9Sstevel@tonic-gate extern caddr_t		caller(void);
6497c478bd9Sstevel@tonic-gate extern void		*calloc(size_t, size_t);
65008278a5eSRod Evans extern int		cap_alternative(void);
65108278a5eSRod Evans extern int		cap_check_fdesc(Fdesc *, Cap *, char *, Rej_desc *);
65208278a5eSRod Evans extern int		cap_check_lmp(Rt_map *, Rej_desc *);
65308278a5eSRod Evans extern int 		cap_filtees(Alist **, Aliste, const char *, Aliste,
65408278a5eSRod Evans 			    Rt_map *, const char *, int, uint_t, int *);
65508278a5eSRod Evans extern int		cap_match(Sresult *, uint_t, Sym *, char *);
6565aefb655Srie extern const char	*_conv_reloc_type(uint_t rel);
657dde769a2SRod Evans extern Aliste		create_cntl(Lm_list *, int);
65856deab07SRod Evans extern void		defrag(void);
659e23c41c9SAli Bahrami extern int		dbg_setup(const char *, Dbg_desc *);
6607c478bd9Sstevel@tonic-gate extern const char	*demangle(const char *);
6617c478bd9Sstevel@tonic-gate extern int		dlclose_intn(Grp_hdl *, Rt_map *);
66202ca3e02Srie extern int		dlclose_core(Grp_hdl *, Rt_map *, Lm_list *);
66308278a5eSRod Evans extern int		dlsym_handle(Grp_hdl *, Slookup *, Sresult *, uint_t *,
66408278a5eSRod Evans 			    int *);
6657c478bd9Sstevel@tonic-gate extern void		*dlsym_intn(void *, const char *, Rt_map *, Rt_map **);
6667c478bd9Sstevel@tonic-gate extern Grp_hdl		*dlmopen_intn(Lm_list *, const char *, int, Rt_map *,
6679aa23310Srie 			    uint_t, uint_t);
6687c478bd9Sstevel@tonic-gate extern size_t		doprf(const char *, va_list, Prfbuf *);
6697c478bd9Sstevel@tonic-gate extern int		dowrite(Prfbuf *);
67056deab07SRod Evans extern void		*dz_map(Lm_list *, caddr_t, size_t, int, int);
6718cd45542Sraf extern int		enter(int);
6727c478bd9Sstevel@tonic-gate extern uint_t		expand(char **, size_t *, char **, uint_t, uint_t,
6737c478bd9Sstevel@tonic-gate 			    Rt_map *);
67456deab07SRod Evans extern int		expand_paths(Rt_map *, const char *, Alist **, Aliste,
67556deab07SRod Evans 			    uint_t, uint_t);
6762017c965SRod Evans extern void		free_hdl(Grp_hdl *);
6777c478bd9Sstevel@tonic-gate extern void		file_notfound(Lm_list *, const char *, Rt_map *,
6787c478bd9Sstevel@tonic-gate 			    uint_t, Rej_desc *);
67956deab07SRod Evans extern int		find_path(Lm_list *, Rt_map *, uint_t, Fdesc *,
68056deab07SRod Evans 			    Rej_desc *, int *);
6817c478bd9Sstevel@tonic-gate extern int		fpavl_insert(Lm_list *, Rt_map *, const char *,
6827c478bd9Sstevel@tonic-gate 			    avl_index_t);
68356deab07SRod Evans extern Rt_map		*fpavl_recorded(Lm_list *, const char *, uint_t,
68456deab07SRod Evans 			    avl_index_t *);
6857c478bd9Sstevel@tonic-gate extern void		fpavl_remove(Rt_map *);
68656deab07SRod Evans extern size_t		fullpath(Rt_map *, Fdesc *);
6877c478bd9Sstevel@tonic-gate extern Lmid_t		get_linkmap_id(Lm_list *);
68856deab07SRod Evans extern Pdesc		*get_next_dir(Spath_desc *, Rt_map *, uint_t);
6892017c965SRod Evans extern Grp_desc		*hdl_add(Grp_hdl *, Rt_map *, uint_t, int *);
6908af2c5b9Srie extern Grp_hdl		*hdl_create(Lm_list *, Rt_map *, Rt_map *, uint_t,
6918af2c5b9Srie 			    uint_t, uint_t);
69202ca3e02Srie extern int		hdl_initialize(Grp_hdl *, Rt_map *, int, int);
69308278a5eSRod Evans extern int		hwcap1_check(Syscapset *, Xword, Rej_desc *);
69408278a5eSRod Evans extern int		hwcap2_check(Syscapset *, Xword, Rej_desc *);
6959a411307Srie extern void		is_dep_init(Rt_map *, Rt_map *);
696466e2a62Srie extern int		is_move_data(caddr_t);
697247b82a1SRod Evans extern int		is_path_secure(char *, Rt_map *, uint_t, uint_t);
6983dbfc803SRod Evans extern int		is_rtld_setuid();
6999a411307Srie extern int		is_sym_interposer(Rt_map *, Sym *);
7009a411307Srie extern void		ldso_plt_init(Rt_map *);
7018cd45542Sraf extern void		leave(Lm_list *, int);
7027c478bd9Sstevel@tonic-gate extern void		lm_append(Lm_list *, Aliste, Rt_map *);
7037c478bd9Sstevel@tonic-gate extern void		lm_delete(Lm_list *, Rt_map *);
7047c478bd9Sstevel@tonic-gate extern void		lm_move(Lm_list *, Aliste, Aliste, Lm_cntl *,
7057c478bd9Sstevel@tonic-gate 			    Lm_cntl *);
70608278a5eSRod Evans extern Rt_map 		*load_cap(Lm_list *, Aliste, const char *, Rt_map *,
70708278a5eSRod Evans 			    uint_t, uint_t, Grp_hdl **, Rej_desc *, int *);
7087247f888Srie extern void		load_completion(Rt_map *);
70956deab07SRod Evans extern Rt_map		*load_file(Lm_list *, Aliste, Fdesc *, int *);
71056deab07SRod Evans extern Rt_map		*load_path(Lm_list *, Aliste, Rt_map *, int, uint_t,
71156deab07SRod Evans 			    Grp_hdl **, Fdesc *, Rej_desc *, int *);
71256deab07SRod Evans extern Rt_map		*load_one(Lm_list *, Aliste, Alist *, Rt_map *, int,
7139aa23310Srie 			    uint_t, Grp_hdl **, int *);
71456deab07SRod Evans extern const char	*load_trace(Lm_list *, Pdesc *, Rt_map *, Fdesc *);
7159aa23310Srie extern void		nfavl_insert(const char *, avl_index_t);
71656deab07SRod Evans extern void		*nu_map(Lm_list *, caddr_t, size_t, int, int);
71756deab07SRod Evans extern Fct		*map_obj(Lm_list *, Fdesc *, size_t, const char *, int,
71856deab07SRod Evans 			    Rej_desc *);
7197c478bd9Sstevel@tonic-gate extern void		*malloc(size_t);
72008278a5eSRod Evans extern int		machcap_check(Syscapset *, const char *, Rej_desc *);
72108278a5eSRod Evans extern void		machine_name(Syscapset *);
72256deab07SRod Evans extern int		move_data(Rt_map *, APlist **);
72308278a5eSRod Evans extern int		platcap_check(Syscapset *, const char *, Rej_desc *);
72408278a5eSRod Evans extern void		platform_name(Syscapset *);
72508278a5eSRod Evans extern int		pnavl_recorded(avl_tree_t **, const char *, uint_t,
72608278a5eSRod Evans 			    avl_index_t *);
727*1c1abfbcSRod Evans extern int		procenv_user(APlist *, Word *, Word *, int);
7287c478bd9Sstevel@tonic-gate extern void		rd_event(Lm_list *, rd_event_e, r_state_e);
729*1c1abfbcSRod Evans extern int		readenv_user(const char **, APlist **);
7307c478bd9Sstevel@tonic-gate extern int		readenv_config(Rtc_env *, Addr, int);
73131fdd7caSab extern void		rejection_inherit(Rej_desc *, Rej_desc *);
7329aa23310Srie extern int		relocate_lmc(Lm_list *, Aliste, Rt_map *, Rt_map *,
7339aa23310Srie 			    int *);
73456deab07SRod Evans extern int		relocate_finish(Rt_map *, APlist *, int);
7357c478bd9Sstevel@tonic-gate extern void		remove_cntl(Lm_list *, Aliste);
7367c478bd9Sstevel@tonic-gate extern int		remove_hdl(Grp_hdl *, Rt_map *, int *);
737481bba9eSRod Evans extern void		remove_lmc(Lm_list *, Rt_map *, Aliste, const char *);
7387c478bd9Sstevel@tonic-gate extern void		remove_lml(Lm_list *);
73956deab07SRod Evans extern void		remove_plist(Alist **, int);
7407c478bd9Sstevel@tonic-gate extern void		remove_so(Lm_list *, Rt_map *);
7417c478bd9Sstevel@tonic-gate extern int		rt_cond_wait(Rt_cond *, Rt_lock *);
7422a8d6ebaSRod Evans extern int		rt_critical(void);
7437c478bd9Sstevel@tonic-gate extern int		rt_bind_guard(int);
7447c478bd9Sstevel@tonic-gate extern int		rt_bind_clear(int);
74510a4fa49Srie extern int		rt_get_extern(Lm_list *, Rt_map *);
7467c478bd9Sstevel@tonic-gate extern int		rt_mutex_lock(Rt_lock *);
7477c478bd9Sstevel@tonic-gate extern int		rt_mutex_unlock(Rt_lock *);
74810a4fa49Srie extern void		rt_thr_init(Lm_list *);
7497c478bd9Sstevel@tonic-gate extern thread_t		rt_thr_self(void);
7505aefb655Srie extern void		rtld_db_dlactivity(Lm_list *);
7515aefb655Srie extern void		rtld_db_preinit(Lm_list *);
7525aefb655Srie extern void		rtld_db_postinit(Lm_list *);
7537c478bd9Sstevel@tonic-gate extern void		rtldexit(Lm_list *, int);
754cb511613SAli Bahrami #ifndef _LP64
755cb511613SAli Bahrami extern int		rtld_fstat(int, rtld_stat_t *restrict);
756cb511613SAli Bahrami extern int		rtld_stat(const char *restrict, rtld_stat_t *restrict);
757cb511613SAli Bahrami #endif
75841072f3cSrie extern int		rtld_getopt(char **, char ***, auxv_t **, Word *,
75941072f3cSrie 			    Word *, int);
7607c478bd9Sstevel@tonic-gate extern void		security(uid_t, uid_t, gid_t, gid_t, int);
7617c478bd9Sstevel@tonic-gate extern void		set_environ(Lm_list *);
76256deab07SRod Evans extern void		set_dirs(Alist **, Spath_defn *, uint_t);
76356deab07SRod Evans extern int		set_prot(Rt_map *, mmapobj_result_t *, int);
76441072f3cSrie extern Rt_map		*setup(char **, auxv_t *, Word, char *, int, char *,
76556deab07SRod Evans 			    ulong_t, ulong_t, int fd, Phdr *, char *, char **,
76656deab07SRod Evans 			    uid_t, uid_t, gid_t, gid_t, void *, int, uint_t);
76756deab07SRod Evans extern const char	*stravl_insert(const char *, uint_t, size_t, int);
7683dbfc803SRod Evans extern void		spavl_insert(const char *);
76908278a5eSRod Evans extern int		sfcap1_check(Syscapset *, Xword, Rej_desc *);
770d326b23bSrie extern int		tls_assign(Lm_list *, Rt_map *, Phdr *);
77110a4fa49Srie extern void		tls_modaddrem(Rt_map *, uint_t);
77210a4fa49Srie extern int		tls_statmod(Lm_list *, Rt_map *);
7737c478bd9Sstevel@tonic-gate extern Rt_map		**tsort(Rt_map *, int, int);
7747c478bd9Sstevel@tonic-gate extern void		unused(Lm_list *);
77556deab07SRod Evans extern void		unmap_obj(mmapobj_result_t *, uint_t);
7767c478bd9Sstevel@tonic-gate extern int		update_mode(Rt_map *, int, int);
7777c478bd9Sstevel@tonic-gate extern void		zero(caddr_t, size_t);
7787c478bd9Sstevel@tonic-gate 
77902ca3e02Srie #if	defined(__sparc)
7807c478bd9Sstevel@tonic-gate /*
7817c478bd9Sstevel@tonic-gate  * SPARC Register symbol support.
7827c478bd9Sstevel@tonic-gate  */
7837c478bd9Sstevel@tonic-gate extern int		elf_regsyms(Rt_map *);
7847c478bd9Sstevel@tonic-gate extern void		set_sparc_g1(ulong_t);
7857c478bd9Sstevel@tonic-gate extern void		set_sparc_g2(ulong_t);
7867c478bd9Sstevel@tonic-gate extern void		set_sparc_g3(ulong_t);
7877c478bd9Sstevel@tonic-gate extern void		set_sparc_g4(ulong_t);
7887c478bd9Sstevel@tonic-gate extern void		set_sparc_g5(ulong_t);
7897c478bd9Sstevel@tonic-gate extern void		set_sparc_g6(ulong_t);
7907c478bd9Sstevel@tonic-gate extern void		set_sparc_g7(ulong_t);
79102ca3e02Srie #endif
7927c478bd9Sstevel@tonic-gate 
7937c478bd9Sstevel@tonic-gate extern long		_sysconfig(int);
7947c478bd9Sstevel@tonic-gate 
7957c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
7967c478bd9Sstevel@tonic-gate }
7977c478bd9Sstevel@tonic-gate #endif
7987c478bd9Sstevel@tonic-gate 
7997c478bd9Sstevel@tonic-gate #endif /* __RTLD_H */
800