#ifndef __ELF_DOT_H
#define __ELF_DOT_H
#include <sys/types.h>
#include <sys/mman.h>
#include <sgs.h>
#include <elf.h>
#include <_rtld.h>
#ifdef __cplusplus
extern "C" {
#endif
extern int elf_config(Rt_map *);
extern Rtc_obj *elf_config_ent(const char *, Word, int, const char **);
extern void elf_config_flt(Lm_list *, const char *, const char *,
Alist **, Aliste);
#if defined(__i386)
extern int elf_copy_gen(Rt_map *);
#endif
extern int elf_copy_reloc(char *, Sym *, Rt_map *, void *, Sym *,
Rt_map *, const void *);
extern int elf_find_sym(Slookup *, Sresult *, uint_t *, int *);
extern int elf_lazy_find_sym(Slookup *, Sresult *, uint_t *, int *);
extern Rt_map *elf_lazy_load(Rt_map *, Slookup *, uint_t, const char *,
uint_t, Grp_hdl **, int *);
extern int elf_lookup_filtee(Slookup *, Sresult *, uint_t *, uint_t,
int *);
extern int elf_mach_flags_check(Rej_desc *, Ehdr *);
extern Rt_map *elf_new_lmp(Lm_list *, Aliste, Fdesc *, Addr, size_t, void *,
Rt_map *, int *);
extern Rt_map *elf_obj_file(Lm_list *, Aliste, Rt_map *, const char *,
mmapobj_result_t *, mmapobj_result_t *, uint_t);
extern Rt_map *elf_obj_fini(Lm_list *, Rt_map *, Rt_map *, int *);
extern void elf_plt_init(void *, caddr_t);
#if defined(__sparcv9)
extern void elf_plt2_init(uint_t *, Rt_map *);
#endif
extern int elf_reloc(Rt_map *, uint_t, int *, APlist **);
extern void elf_reloc_bad(Rt_map *, void *, uchar_t, ulong_t,
ulong_t);
extern int elf_reloc_error(Rt_map *, const char *, void *, uint_t);
extern int elf_rtld_load();
extern long elf_static_tls(Rt_map *, Sym *, void *, uchar_t, char *,
ulong_t, long);
extern Fct *elf_verify(caddr_t, size_t, Fdesc *, const char *, Rej_desc *);
extern int elf_verify_vers(const char *, Rt_map *, Rt_map *);
typedef struct pltpadinfo {
Addr pp_addr;
void *pp_plt;
} Pltpadinfo;
typedef struct _rt_elf_private {
void *e_symtab;
void *e_sunwsymtab;
uint_t *e_hash;
char *e_strtab;
void *e_reloc;
uint_t *e_pltgot;
void *e_jmprel;
ulong_t e_sunwsortent;
uint_t *e_sunwsymsort;
ulong_t e_sunwsymsortsz;
ulong_t e_sunwsymsz;
ulong_t e_pltrelsize;
ulong_t e_relsz;
ulong_t e_relent;
ulong_t e_movesz;
ulong_t e_moveent;
ulong_t e_tlsstatoff;
void *e_movetab;
Phdr *e_pttls;
Phdr *e_ptunwind;
ulong_t e_syment;
Verneed *e_verneed;
int e_verneednum;
Verdef *e_verdef;
int e_verdefnum;
Versym *e_versym;
ulong_t e_syminent;
void *e_pltpad;
void *e_pltpadend;
Syscapset e_capset;
Capinfo *e_capinfo;
uint_t e_capchainent;
uint_t e_capchainsz;
} Rt_elfp;
#define ELFPRV(X) ((X)->rt_priv)
#define SYMTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_symtab)
#define SUNWSYMTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymtab)
#define HASH(X) (((Rt_elfp *)(X)->rt_priv)->e_hash)
#define STRTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_strtab)
#define REL(X) (((Rt_elfp *)(X)->rt_priv)->e_reloc)
#define PLTGOT(X) (((Rt_elfp *)(X)->rt_priv)->e_pltgot)
#define MOVESZ(X) (((Rt_elfp *)(X)->rt_priv)->e_movesz)
#define MOVEENT(X) (((Rt_elfp *)(X)->rt_priv)->e_moveent)
#define MOVETAB(X) (((Rt_elfp *)(X)->rt_priv)->e_movetab)
#define JMPREL(X) (((Rt_elfp *)(X)->rt_priv)->e_jmprel)
#define SUNWSYMSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymsz)
#define PTTLS(X) (((Rt_elfp *)(X)->rt_priv)->e_pttls)
#define PTUNWIND(X) (((Rt_elfp *)(X)->rt_priv)->e_ptunwind)
#define TLSSTATOFF(X) (((Rt_elfp *)(X)->rt_priv)->e_tlsstatoff)
#define PLTRELSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_pltrelsize)
#define RELSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_relsz)
#define RELENT(X) (((Rt_elfp *)(X)->rt_priv)->e_relent)
#define SYMENT(X) (((Rt_elfp *)(X)->rt_priv)->e_syment)
#define VERNEED(X) (((Rt_elfp *)(X)->rt_priv)->e_verneed)
#define VERNEEDNUM(X) (((Rt_elfp *)(X)->rt_priv)->e_verneednum)
#define VERDEF(X) (((Rt_elfp *)(X)->rt_priv)->e_verdef)
#define VERDEFNUM(X) (((Rt_elfp *)(X)->rt_priv)->e_verdefnum)
#define VERSYM(X) (((Rt_elfp *)(X)->rt_priv)->e_versym)
#define SYMINENT(X) (((Rt_elfp *)(X)->rt_priv)->e_syminent)
#define PLTPAD(X) (((Rt_elfp *)(X)->rt_priv)->e_pltpad)
#define PLTPADEND(X) (((Rt_elfp *)(X)->rt_priv)->e_pltpadend)
#define SUNWSORTENT(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsortent)
#define SUNWSYMSORT(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymsort)
#define SUNWSYMSORTSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymsortsz)
#define CAPSET(X) (((Rt_elfp *)(X)->rt_priv)->e_capset)
#define CAPINFO(X) (((Rt_elfp *)(X)->rt_priv)->e_capinfo)
#define CAPCHAINENT(X) (((Rt_elfp *)(X)->rt_priv)->e_capchainent)
#define CAPCHAINSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_capchainsz)
#define THIS_IS_ELF(X) (FCT(X) == &elf_fct)
#define THIS_IS_NOT_ELF(X) (FCT(X) != &elf_fct)
#ifdef __cplusplus
}
#endif
#endif