#ifndef _LINK_H
#define _LINK_H
#include <sys/link.h>
#ifndef _ASM
#include <elf.h>
#include <sys/types.h>
#include <dlfcn.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _ASM
#if !defined(_ILP32) || _FILE_OFFSET_BITS != 64
#include <libelf.h>
extern uint_t ld_version(uint_t);
extern void ld_input_done(uint_t *);
extern void ld_start(const char *, const Elf32_Half, const char *);
extern void ld_atexit(int);
extern void ld_open(const char **, const char **, int *, int, Elf **,
Elf *, size_t, const Elf_Kind);
extern void ld_file(const char *, const Elf_Kind, int, Elf *);
extern void ld_input_section(const char *, Elf32_Shdr **, Elf32_Word,
Elf_Data *, Elf *, uint_t *);
extern void ld_section(const char *, Elf32_Shdr *, Elf32_Word,
Elf_Data *, Elf *);
#if defined(_LP64) || defined(_LONGLONG_TYPE)
extern void ld_start64(const char *, const Elf64_Half, const char *);
extern void ld_atexit64(int);
extern void ld_open64(const char **, const char **, int *, int, Elf **,
Elf *, size_t, const Elf_Kind);
extern void ld_file64(const char *, const Elf_Kind, int, Elf *);
extern void ld_input_section64(const char *, Elf64_Shdr **, Elf64_Word,
Elf_Data *, Elf *, uint_t *);
extern void ld_section64(const char *, Elf64_Shdr *, Elf64_Word,
Elf_Data *, Elf *);
#endif
#endif
#define LD_SUP_VNONE 0
#define LD_SUP_VERSION1 1
#define LD_SUP_VERSION2 2
#define LD_SUP_VERSION3 3
#define LD_SUP_VCURRENT LD_SUP_VERSION3
#define LD_SUP_DERIVED 0x1
#define LD_SUP_INHERITED 0x2
#define LD_SUP_EXTRACTED 0x4
#endif
#define LM_ID_BASE 0x00
#define LM_ID_LDSO 0x01
#define LM_ID_NUM 2
#define LM_ID_BRAND 0xfd
#define LM_ID_NONE 0xfe
#define LM_ID_NEWLM 0xff
#define LAV_NONE 0
#define LAV_VERSION1 1
#define LAV_VERSION2 2
#define LAV_VERSION3 3
#define LAV_VERSION4 4
#define LAV_VERSION5 5
#define LAV_CURRENT LAV_VERSION5
#define LAV_NUM 6
#define LA_FLG_BINDTO 0x0001
#define LA_FLG_BINDFROM 0x0002
#define LA_SYMB_NOPLTENTER 0x0001
#define LA_SYMB_NOPLTEXIT 0x0002
#define LA_SYMB_STRUCTCALL 0x0004
#define LA_SYMB_DLSYM 0x0008
#define LA_SYMB_ALTVALUE 0x0010
#define LA_SER_ORIG 0x001
#define LA_SER_LIBPATH 0x002
#define LA_SER_RUNPATH 0x004
#define LA_SER_CONFIG 0x008
#define LA_SER_DEFAULT 0x040
#define LA_SER_SECURE 0x080
#define LA_SER_MASK 0xfff
#define LA_ACT_CONSISTENT 0x00
#define LA_ACT_ADD 0x01
#define LA_ACT_DELETE 0x02
#define LA_ACT_MAX 3
#ifndef _KERNEL
#ifndef _ASM
#if defined(_LP64)
typedef long lagreg_t;
#else
typedef int lagreg_t;
#endif
struct _la_sparc_regs {
lagreg_t lr_rego0;
lagreg_t lr_rego1;
lagreg_t lr_rego2;
lagreg_t lr_rego3;
lagreg_t lr_rego4;
lagreg_t lr_rego5;
lagreg_t lr_rego6;
lagreg_t lr_rego7;
};
#if defined(_LP64)
typedef struct _la_sparc_regs La_sparcv9_regs;
typedef struct {
lagreg_t lr_rsp;
lagreg_t lr_rbp;
lagreg_t lr_rdi;
lagreg_t lr_rsi;
lagreg_t lr_rdx;
lagreg_t lr_rcx;
lagreg_t lr_r8;
lagreg_t lr_r9;
} La_amd64_regs;
#else
typedef struct _la_sparc_regs La_sparcv8_regs;
typedef struct {
lagreg_t lr_esp;
lagreg_t lr_ebp;
} La_i86_regs;
#endif
#if !defined(_SYS_INT_TYPES_H)
#if defined(_LP64)
typedef unsigned long uintptr_t;
#else
typedef unsigned int uintptr_t;
#endif
#endif
extern uint_t la_version(uint_t);
extern void la_activity(uintptr_t *, uint_t);
extern void la_preinit(uintptr_t *);
extern char *la_objsearch(const char *, uintptr_t *, uint_t);
extern uint_t la_objopen(Link_map *, Lmid_t, uintptr_t *);
extern uint_t la_objclose(uintptr_t *);
extern int la_objfilter(uintptr_t *, const char *, uintptr_t *,
uint_t);
#if defined(_LP64)
extern uintptr_t la_amd64_pltenter(Elf64_Sym *, uint_t, uintptr_t *,
uintptr_t *, La_amd64_regs *, uint_t *,
const char *);
extern uintptr_t la_symbind64(Elf64_Sym *, uint_t, uintptr_t *,
uintptr_t *, uint_t *, const char *);
extern uintptr_t la_sparcv9_pltenter(Elf64_Sym *, uint_t, uintptr_t *,
uintptr_t *, La_sparcv9_regs *, uint_t *,
const char *);
extern uintptr_t la_pltexit64(Elf64_Sym *, uint_t, uintptr_t *,
uintptr_t *, uintptr_t, const char *);
#else
extern uintptr_t la_symbind32(Elf32_Sym *, uint_t, uintptr_t *,
uintptr_t *, uint_t *);
extern uintptr_t la_sparcv8_pltenter(Elf32_Sym *, uint_t, uintptr_t *,
uintptr_t *, La_sparcv8_regs *, uint_t *);
extern uintptr_t la_i86_pltenter(Elf32_Sym *, uint_t, uintptr_t *,
uintptr_t *, La_i86_regs *, uint_t *);
extern uintptr_t la_pltexit(Elf32_Sym *, uint_t, uintptr_t *,
uintptr_t *, uintptr_t);
#endif
#ifdef _LP64
#define ElfW(type) Elf64_ ## type
#else
#define ElfW(type) Elf32_ ## type
#endif
struct dl_phdr_info {
ElfW(Addr) dlpi_addr;
const char *dlpi_name;
const ElfW(Phdr) *dlpi_phdr;
ElfW(Half) dlpi_phnum;
u_longlong_t dlpi_adds;
u_longlong_t dlpi_subs;
};
extern int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void *),
void *);
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif