_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