#ifndef __RTLD_H
#define __RTLD_H
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/avl.h>
#include <sys/mman.h>
#include <stdarg.h>
#include <synch.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <link.h>
#include <rtld.h>
#include <sgs.h>
#include <machdep.h>
#include <rtc.h>
#include <debug.h>
#include <msg.h>
#include <libc_int.h>
#ifdef __cplusplus
extern "C" {
#endif
#define RPLENV 1
#define PRMENV 2
#define RUNPATH 3
#define DEFAULT 4
typedef struct fdesc Fdesc;
typedef struct fct Fct;
typedef struct pdesc Pdesc;
struct fct {
Fct *(*fct_verify_file)(caddr_t, size_t, Fdesc *, const char *,
Rej_desc *);
Rt_map *(*fct_new_lmp)(Lm_list *, Aliste, Fdesc *, Addr, size_t,
void *, Rt_map *, int *);
Addr (*fct_entry_pt)(void);
int (*fct_needed)(Lm_list *, Aliste, Rt_map *, int *);
int (*fct_lookup_sym)(Slookup *, Sresult *, uint_t *, int *);
int (*fct_reloc)(Rt_map *, uint_t, int *, APlist **);
Alist **(*fct_get_def_dirs)(void);
Alist **(*fct_get_sec_dirs)(void);
int (*fct_fix_name)(const char *, Rt_map *, Alist **, Aliste,
uint_t);
char *(*fct_get_so)(const char *, const char *, size_t, size_t);
void (*fct_dladdr)(ulong_t, Rt_map *, Dl_info *, void **, int);
int (*fct_dlsym)(Grp_hdl *, Slookup *, Sresult *, uint_t *, int *);
};
#define LM_ENTRY_PT(X) ((X)->rt_fct->fct_entry_pt)
#define LM_NEEDED(X) ((X)->rt_fct->fct_needed)
#define LM_LOOKUP_SYM(X) ((X)->rt_fct->fct_lookup_sym)
#define LM_RELOC(X) ((X)->rt_fct->fct_reloc)
#define LM_DEFAULT_DIRS(X) ((X)->rt_fct->fct_get_def_dirs)
#define LM_SECURE_DIRS(X) ((X)->rt_fct->fct_get_sec_dirs)
#define LM_FIX_NAME(X) ((X)->rt_fct->fct_fix_name)
#define LM_GET_SO(X) ((X)->rt_fct->fct_get_so)
#define LM_DLADDR(X) ((X)->rt_fct->fct_dladdr)
#define LM_DLSYM(X) ((X)->rt_fct->fct_dlsym)
#define MMAPFD_NUM 10
#define AL_CNT_ALIAS 2
#define AL_CNT_DEPENDS 20
#define AL_CNT_CALLERS 20
#define AL_CNT_GROUPS 20
#define AL_CNT_COPYREL 10
#define AL_CNT_LAZYFIND 10
#define AL_CNT_GRPCLCT 10
#define AL_CNT_DEPCLCT 10
#define AL_CNT_RTLDINFO 1
#define AL_CNT_FPNODE 4
#define AL_CNT_LMLISTS 20
#define AL_CNT_LMNOW 8
#define AL_CNT_RELBIND 20
#define AL_CNT_ACTAUDIT 2
#define AL_CNT_MOVES 10
#define AL_CNT_MPOBJS 4
#define AL_CNT_TEXTREL 2
#define AL_CNT_NEEDED 1
#define AL_CNT_SEARCH 4
#define AL_CNT_FILTEES 2
#define AL_CNT_HANDLES 1
#define AL_CNT_FREELIST 80
#define AL_CNT_CAP 10
#define AL_CNT_SPATH 4
#define AL_CNT_DYNLIST 2
#define AL_CNT_PENDING 2
#define AL_CNT_PLTPAD 10
#define AL_CNT_AUDITORS 2
#define AL_CNT_ENVIRON 20
#define AL_CNT_COOKIES 2
#define ERRSIZE 2048
typedef struct config {
const char *c_name;
Addr c_bgn;
Addr c_end;
Word *c_hashtbl;
Word *c_hashchain;
const char *c_strtbl;
Rtc_obj *c_objtbl;
Rtc_fltr *c_fltr;
Rtc_flte *c_flte;
} Config;
typedef struct reglist {
Rt_map *rl_lmp;
Sym *rl_sym;
struct reglist *rl_next;
} Reglist;
typedef struct interp {
char *i_name;
caddr_t i_faddr;
} Interp;
typedef struct {
const char *r_name;
Sym *r_rsym;
Rt_map *r_rlmp;
Rt_map *r_dlmp;
Sym *r_dsym;
void *r_radd;
const void *r_dadd;
ulong_t r_size;
} Rel_copy;
struct fdesc {
Rt_map *fd_lmp;
Lm_list *fd_lml;
Fct *fd_ftp;
const char *fd_oname;
const char *fd_odir;
const char *fd_nname;
const char *fd_pname;
dev_t fd_dev;
rtld_ino_t fd_ino;
avl_index_t fd_avlwhere;
Syscapset fd_scapset;
mmapobj_result_t *fd_mapp;
uint_t fd_mapn;
uint_t fd_flags;
};
#define FLG_FD_ALTER 0x0001
#define FLG_FD_SLASH 0x0002
#define FLG_FD_RESOLVED 0x0004
#define FLG_FD_ALTCHECK 0x0008
#define FLG_FD_ALTCAP 0x0010
#define FLG_FD_IGNORE 0x0020
#define FD_UNAVAIL -1
#define FLTR_DISABLED UINT_MAX
#define RT_FL_THREADS 0x00000001
#define RT_FL_WARNFLTR 0x00000002
#define RT_FL_DBNOTIF 0x00000004
#define RT_FL_DEFERRED 0x00000008
#define RT_FL_NOBIND 0x00000010
#define RT_FL_NOVERSION 0x00000020
#define RT_FL_SECURE 0x00000040
#define RT_FL_APPLIC 0x00000080
#define RT_FL_NOENVIRON 0x00000100
#define RT_FL_CONFGEN 0x00000200
#define RT_FL_CONFAPP 0x00000400
#define RT_FL_DEBUGGER 0x00000800
#define RT_FL_OPERATION 0x00001000
#define RT_FL_NEWLOCALE 0x00002000
#define RT_FL_NOBAPLT 0x00004000
#define RT_FL_NOAUXFLTR 0x00008000
#define RT_FL_NOAUDIT 0x00020000
#define RT_FL_ATEXIT 0x00040000
#define RT_FL_SILENCERR 0x00080000
#define RT_FL_INITFIRST 0x00200000
#define RT_FL_DEMANGLE 0x01000000
#define RT_FL_NOCFG 0x02000000
#define RT_FL_NODIRCFG 0x04000000
#define RT_FL_NOOBJALT 0x08000000
#define RT_FL_NOENVCFG 0x10000000
#define RT_FL_DIRCFG 0x20000000
#define RT_FL_OBJALT 0x40000000
#define RT_FL_MEMRESV 0x80000000
#define RT_FL2_HASAUDIT 0x00000001
#define RT_FL2_RTLDSEEN 0x00000002
#define RT_FL2_UNIFPROC 0x00000004
#define RT_FL2_NOFLTCFG 0x00000010
#define RT_FL2_FLTCFG 0x00000020
#define RT_FL2_HWCAP 0x00000040
#define RT_FL2_FTL2WARN 0x00000080
#define RT_FL2_BINDNOW 0x00000100
#define RT_FL2_BINDLAZY 0x00000200
#define RT_FL2_PLMSETUP 0x00000400
#define RT_FL2_BRANDED 0x00000800
#define RT_FL2_NOPLM 0x00001000
#define RT_FL2_SETUID 0x00002000
#define RT_FL2_ADDR32 0x00004000
#define ENV_INF_PATHCFG 0x00000001
#define ENV_INF_FLAGCFG 0x00000002
typedef struct {
Rt_map *rti_lmp;
Lc_interface *rti_info;
} Rti_desc;
#if !defined(CI_V_FIVE)
#define THR_FLG_RTLD 0x00000001
#define THR_FLG_NOLOCK 0x00000000
#define THR_FLG_REENTER 0x00000000
#endif
#define ROUND(x, a) (((int)(x) + ((int)(a) - 1)) & ~((int)(a) - 1))
typedef struct {
char *pr_buf;
char *pr_cur;
size_t pr_len;
int pr_fd;
} Prfbuf;
struct pdesc {
const char *pd_pname;
const char *pd_oname;
void *pd_info;
size_t pd_plen;
uint_t pd_flags;
};
#define PD_TKN_ORIGIN 0x00001000
#define PD_TKN_PLATFORM 0x00002000
#define PD_TKN_OSNAME 0x00004000
#define PD_TKN_OSREL 0x00008000
#define PD_TKN_ISALIST 0x00010000
#define PD_TKN_CAP 0x00020000
#define PD_TKN_MACHINE 0x00040000
#define PD_TKN_RESOLVED 0x00080000
#define PD_MSK_EXPAND 0x000ff000
#define PD_FLG_PNSLASH 0x00100000
#define PD_FLG_DUPLICAT 0x00200000
#define PD_FLG_EXTLOAD 0x00400000
#define PD_FLG_UNIQUE 0x00800000
#define PD_FLG_USED 0x01000000
#define PD_FLG_FULLPATH 0x02000000
#define PD_MSK_INHERIT 0x0ffff000
#define TKN_NONE 0x00000001
#define TKN_DOTSLASH 0x00000002
#define HDLIST_SZ 101
#define HDLIST_ORP 102
typedef struct {
uchar_t *sp_rule;
Alist **sp_dalpp;
Aliste sp_idx;
} Spath_desc;
typedef struct {
const char *sd_name;
size_t sd_len;
} Spath_defn;
#define CL_NONE 0
#define CL_EXECDEF 1
#define BINFO_REJDIRECT 0x010000
#define BINFO_REJSINGLE 0x100000
#define BINFO_REJGROUP 0x200000
#define BINFO_MSK_TRYAGAIN 0xf00000
#define BINFO_MSK_REJECTED 0xff0000
#ifdef _LP64
#define rtld_fstat fstat
#define rtld_stat stat
typedef struct stat rtld_stat_t;
#else
typedef struct {
dev_t st_dev;
rtld_ino_t st_ino;
mode_t st_mode;
uid_t st_uid;
off_t st_size;
timestruc_t st_mtim;
#ifdef sparc
blksize_t st_blksize;
#endif
} rtld_stat_t;
#endif
#if defined(__x86)
#define AV_HW1_IGNORE (0x8000 | 0x2000)
#else
#define AV_HW1_IGNORE 0
#endif
#define APPLICATION_ENTER(f) \
f = (rtld_flags & RT_FL_APPLIC) ? 0 : RT_FL_APPLIC; \
rtld_flags |= f;
#define APPLICATION_RETURN(f) \
rtld_flags &= ~f;
extern Lc_desc glcs[];
extern Rt_lock rtldlock;
extern int thr_flg_nolock;
extern int thr_flg_reenter;
extern APlist *dynlm_list;
extern char **environ;
extern int dyn_plt_ent_size;
extern ulong_t at_flags;
extern const char *procname;
extern Rtld_db_priv r_debug;
extern char *lasterr;
extern Interp *interp;
extern const char *rtldname;
extern APlist *hdl_alp[];
extern size_t syspagsz;
extern Isa_desc *isa;
extern Uts_desc *uts;
extern uint_t rtld_flags;
extern uint_t rtld_flags2;
extern uint32_t pltcnt21d;
extern uint32_t pltcnt24d;
extern uint32_t pltcntu32;
extern uint32_t pltcntu44;
extern uint32_t pltcntfull;
extern uint32_t pltcntfar;
extern uchar_t search_rules[];
extern Fct elf_fct;
extern Config *config;
extern const char *locale;
extern const char *rpl_audit;
extern const char *rpl_debug;
extern const char *rpl_ldflags;
extern const char *rpl_libpath;
extern Alist *rpl_libdirs;
extern const char *rpl_preload;
extern const char *prm_audit;
extern const char *prm_debug;
extern const char *prm_ldflags;
extern const char *prm_libpath;
extern Alist *prm_libdirs;
extern const char *prm_preload;
extern Alist *elf_def_dirs;
extern Alist *elf_sec_dirs;
extern uint_t env_info;
extern int killsig;
extern APlist *free_alp;
extern uint_t audit_argcnt;
extern Audit_desc *auditors;
extern APlist *aud_preinit;
extern APlist *aud_activity;
extern char **_environ;
extern const char *dbg_file;
extern Reglist *reglist;
extern const Msg err_reject[];
extern const Msg ldd_reject[];
extern const Msg ldd_warn[];
extern const char *profile_name;
extern const char *profile_out;
extern const char *profile_lib;
extern Dl_argsinfo argsinfo;
extern const char *err_strs[ERR_NUM];
extern const char *nosym_str;
extern Syscapset *org_scapset;
extern Syscapset *alt_scapset;
extern const char *rpl_hwcap;
extern const char *rpl_sfcap;
extern const char *rpl_machcap;
extern const char *rpl_platcap;
extern const char *rpl_cap_files;
extern const char *prm_hwcap;
extern const char *prm_sfcap;
extern const char *prm_machcap;
extern const char *prm_platcap;
extern const char *prm_cap_files;
extern avl_tree_t *capavl;
extern avl_tree_t *nfavl;
extern avl_tree_t *spavl;
extern u_longlong_t cnt_map;
extern u_longlong_t cnt_unmap;
extern void addfree(void *, size_t);
extern int append_alias(Rt_map *, const char *, int *);
extern Rt_map *analyze_lmc(Lm_list *, Aliste, Rt_map *, Rt_map *,
int *);
extern void atexit_fini(void);
extern int bind_one(Rt_map *, Rt_map *, uint_t);
extern int bufprint(Prfbuf *, const char *, ...);
extern void call_array(Addr *, uint_t, Rt_map *, Word);
extern void call_fini(Lm_list *, Rt_map **, Rt_map *);
extern void call_init(Rt_map **, int);
extern int callable(Rt_map *, Rt_map *, Grp_hdl *, uint_t);
extern Rt_map *_caller(caddr_t, int);
extern caddr_t caller(void);
extern void *calloc(size_t, size_t);
extern int cap_alternative(void);
extern int cap_check_fdesc(Fdesc *, Cap *, char *, Rej_desc *);
extern int cap_check_lmp(Rt_map *, Rej_desc *);
extern int cap_filtees(Alist **, Aliste, const char *, Aliste,
Rt_map *, Rt_map *, const char *, int, uint_t,
int *);
extern int cap_match(Sresult *, uint_t, Sym *, char *);
extern const char *_conv_reloc_type(uint_t rel);
extern Aliste create_cntl(Lm_list *, int);
extern void defrag(void);
extern int dbg_setup(const char *, Dbg_desc *);
extern const char *demangle(const char *);
extern int dlclose_intn(Grp_hdl *, Rt_map *);
extern int dlclose_core(Grp_hdl *, Rt_map *, Lm_list *);
extern int dlsym_handle(Grp_hdl *, Slookup *, Sresult *, uint_t *,
int *);
extern void *dlsym_intn(void *, const char *, Rt_map *, Rt_map **);
extern Grp_hdl *dlmopen_intn(Lm_list *, const char *, int, Rt_map *,
uint_t, uint_t);
extern size_t doprf(const char *, va_list, Prfbuf *);
extern int dowrite(Prfbuf *);
extern void *dz_map(Lm_list *, caddr_t, size_t, int, int);
extern int enter(int);
extern uint_t expand(char **, size_t *, char **, uint_t, uint_t,
Rt_map *);
extern int expand_paths(Rt_map *, const char *, Alist **, Aliste,
uint_t, uint_t);
extern void free_hdl(Grp_hdl *);
extern void file_notfound(Lm_list *, const char *, Rt_map *,
uint_t, Rej_desc *);
extern int find_path(Lm_list *, Rt_map *, uint_t, Fdesc *,
Rej_desc *, int *);
extern int fpavl_insert(Lm_list *, Rt_map *, const char *,
avl_index_t);
extern Rt_map *fpavl_recorded(Lm_list *, const char *, uint_t,
avl_index_t *);
extern void fpavl_remove(Rt_map *);
extern size_t fullpath(Rt_map *, Fdesc *);
extern Lmid_t get_linkmap_id(Lm_list *);
extern Pdesc *get_next_dir(Spath_desc *, Rt_map *, uint_t);
extern Grp_desc *hdl_add(Grp_hdl *, Rt_map *, uint_t, int *);
extern Grp_hdl *hdl_create(Lm_list *, Rt_map *, Rt_map *, uint_t,
uint_t, uint_t);
extern int hdl_initialize(Grp_hdl *, Rt_map *, int, int);
extern int hwcap1_check(Syscapset *, Xword, Rej_desc *);
extern int hwcap2_check(Syscapset *, Xword, Rej_desc *);
extern void is_dep_init(Rt_map *, Rt_map *);
extern int is_move_data(caddr_t);
extern int is_path_secure(char *, Rt_map *, uint_t, uint_t);
extern int is_rtld_setuid();
extern int is_sym_interposer(Rt_map *, Sym *);
extern void ldso_plt_init(Rt_map *);
extern void leave(Lm_list *, int);
extern void lm_append(Lm_list *, Aliste, Rt_map *);
extern void lm_delete(Lm_list *, Rt_map *, Rt_map *);
extern void lm_move(Lm_list *, Aliste, Aliste, Lm_cntl *,
Lm_cntl *);
extern Rt_map *load_cap(Lm_list *, Aliste, const char *, Rt_map *,
uint_t, uint_t, Grp_hdl **, Rej_desc *, int *);
extern void load_completion(Rt_map *);
extern Rt_map *load_file(Lm_list *, Aliste, Rt_map *, Fdesc *, int *);
extern Rt_map *load_path(Lm_list *, Aliste, Rt_map *, int, uint_t,
Grp_hdl **, Fdesc *, Rej_desc *, int *);
extern Rt_map *load_one(Lm_list *, Aliste, Alist *, Rt_map *, int,
uint_t, Grp_hdl **, int *);
extern const char *load_trace(Lm_list *, Pdesc *, Rt_map *, Fdesc *);
extern void nfavl_insert(const char *, avl_index_t);
extern void *nu_map(Lm_list *, caddr_t, size_t, int, int);
extern Fct *map_obj(Lm_list *, Fdesc *, size_t, const char *, int,
Rej_desc *);
extern void *malloc(size_t);
extern int machcap_check(Syscapset *, const char *, Rej_desc *);
extern void machine_name(Syscapset *);
extern int move_data(Rt_map *, APlist **);
extern int platcap_check(Syscapset *, const char *, Rej_desc *);
extern void platform_name(Syscapset *);
extern int pnavl_recorded(avl_tree_t **, const char *, uint_t,
avl_index_t *);
extern int procenv_user(APlist *, Word *, Word *);
extern void rd_event(Lm_list *, rd_event_e, r_state_e);
extern int readenv_user(const char **, APlist **);
extern int readenv_config(Rtc_env *, Addr);
extern void rejection_inherit(Rej_desc *, Rej_desc *);
extern int relocate_lmc(Lm_list *, Aliste, Rt_map *, Rt_map *,
int *);
extern int relocate_finish(Rt_map *, APlist *, int);
extern void remove_alist(Alist **, int);
extern void remove_cntl(Lm_list *, Aliste);
extern int remove_hdl(Grp_hdl *, Rt_map *, int *);
extern void remove_lmc(Lm_list *, Rt_map *, Aliste, const char *);
extern void remove_lml(Lm_list *);
extern void remove_so(Lm_list *, Rt_map *, Rt_map *);
extern int rt_critical(void);
extern int rt_bind_guard(int);
extern int rt_bind_clear(int);
extern int rt_get_extern(Lm_list *, Rt_map *);
extern int rt_mutex_lock(Rt_lock *);
extern int rt_mutex_unlock(Rt_lock *);
extern void rt_thr_init(Lm_list *);
extern thread_t rt_thr_self(void);
extern void rtld_db_dlactivity(Lm_list *);
extern void rtld_db_preinit(Lm_list *);
extern void rtld_db_postinit(Lm_list *);
extern void rtldexit(Lm_list *, int);
#ifndef _LP64
extern int rtld_fstat(int, rtld_stat_t *restrict);
extern int rtld_stat(const char *restrict, rtld_stat_t *restrict);
#endif
extern int rtld_getopt(char **, char ***, auxv_t **, Word *,
Word *);
extern void security(uid_t, uid_t, gid_t, gid_t, int);
extern void set_environ(Lm_list *);
extern void set_dirs(Alist **, Spath_defn *, uint_t);
extern int set_prot(Rt_map *, mmapobj_result_t *, int);
extern Rt_map *setup(char **, auxv_t *, Word, char *, int, char *,
ulong_t, ulong_t, int fd, Phdr *, char *, char **,
uid_t, uid_t, gid_t, gid_t, int, uint_t *);
extern const char *stravl_insert(const char *, uint_t, size_t, int);
extern void spavl_insert(const char *);
extern int sfcap1_check(Syscapset *, Xword, Rej_desc *);
extern int tls_assign(Lm_list *, Rt_map *, Phdr *);
extern void tls_modaddrem(Rt_map *, uint_t);
extern int tls_statmod(Lm_list *, Rt_map *);
extern Rt_map **tsort(Rt_map *, int, int);
extern void unused(Lm_list *);
extern void unmap_obj(mmapobj_result_t *, uint_t);
extern int update_mode(Rt_map *, int, int);
extern void zero(caddr_t, size_t);
#if defined(__sparc)
extern int elf_regsyms(Rt_map *);
extern void set_sparc_g1(ulong_t);
extern void set_sparc_g2(ulong_t);
extern void set_sparc_g3(ulong_t);
extern void set_sparc_g4(ulong_t);
extern void set_sparc_g5(ulong_t);
extern void set_sparc_g6(ulong_t);
extern void set_sparc_g7(ulong_t);
#endif
extern long _sysconfig(int);
#ifdef __cplusplus
}
#endif
#endif