#ifndef _RTLD_DB_H
#define _RTLD_DB_H
#pragma ident "@(#)rtld_db.h 1.19 08/05/27 SMI"
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(__APPLE__)
#include <sys/types.h>
#include <sys/lwp.h>
#include <sys/elf.h>
#include <link.h>
#include <proc_service.h>
#else
#include <sys/types.h>
#include "lwp.h"
#include <link.h>
#include <proc_service.h>
#endif
#define RD_VERSION1 1
#define RD_VERSION2 2
#define RD_VERSION3 3
#define RD_VERSION4 4
#define RD_VERSION RD_VERSION4
typedef enum {
RD_ERR,
RD_OK,
RD_NOCAPAB,
RD_DBERR,
RD_NOBASE,
RD_NODYNAM,
RD_NOMAPS
} rd_err_e;
typedef enum {
RD_NOTIFY_BPT,
RD_NOTIFY_AUTOBPT,
RD_NOTIFY_SYSCALL
} rd_notify_e;
typedef struct rd_notify {
rd_notify_e type;
union {
psaddr_t bptaddr;
long syscallno;
} u;
} rd_notify_t;
typedef enum {
RD_NOSTATE = 0,
RD_CONSISTENT,
RD_ADD,
RD_DELETE
} rd_state_e;
typedef struct rd_event_msg {
rd_event_e type;
union {
rd_state_e state;
} u;
} rd_event_msg_t;
typedef struct rd_loadobj {
psaddr_t rl_nameaddr;
unsigned rl_flags;
psaddr_t rl_base;
psaddr_t rl_data_base;
Lmid_t rl_lmident;
psaddr_t rl_refnameaddr;
psaddr_t rl_plt_base;
unsigned rl_plt_size;
psaddr_t rl_bend;
psaddr_t rl_padstart;
psaddr_t rl_padend;
psaddr_t rl_dynamic;
unsigned long rl_tlsmodid;
} rd_loadobj_t;
#define RD_FLG_MEM_OBJECT 0x0001
#define RD_CTL_SET_HELPPATH 0x01
typedef struct rd_agent rd_agent_t;
#ifdef __STDC__
typedef int rl_iter_f(const rd_loadobj_t *, void *);
#else
typedef int rl_iter_f();
#endif
typedef enum {
RD_RESOLVE_NONE,
RD_RESOLVE_STEP,
RD_RESOLVE_TARGET,
RD_RESOLVE_TARGET_STEP
} rd_skip_e;
typedef struct rd_plt_info {
rd_skip_e pi_skip_method;
long pi_nstep;
psaddr_t pi_target;
psaddr_t pi_baddr;
unsigned int pi_flags;
} rd_plt_info_t;
#define RD_FLG_PI_PLTBOUND 0x0001
struct ps_prochandle;
#ifdef __STDC__
extern void rd_delete(rd_agent_t *);
extern char *rd_errstr(rd_err_e rderr);
extern rd_err_e rd_event_addr(rd_agent_t *, rd_event_e, rd_notify_t *);
extern rd_err_e rd_event_enable(rd_agent_t *, int);
extern rd_err_e rd_event_getmsg(rd_agent_t *, rd_event_msg_t *);
extern rd_err_e rd_init(int);
extern rd_err_e rd_ctl(int, void *);
extern rd_err_e rd_loadobj_iter(rd_agent_t *, rl_iter_f *,
void *);
extern void rd_log(const int);
extern rd_agent_t *rd_new(struct ps_prochandle *);
extern rd_err_e rd_objpad_enable(struct rd_agent *, size_t);
extern rd_err_e rd_plt_resolution(rd_agent_t *, psaddr_t, lwpid_t,
psaddr_t, rd_plt_info_t *);
extern rd_err_e rd_get_dyns(rd_agent_t *, psaddr_t, void **, size_t *);
extern rd_err_e rd_reset(struct rd_agent *);
#else
extern void rd_delete();
extern char *rd_errstr();
extern rd_err_e rd_event_addr();
extern rd_err_e rd_event_enable();
extern rd_err_e rd_event_getmsg();
extern rd_err_e rd_init();
extern rd_err_e rd_ctl();
extern rd_err_e rd_loadobj_iter();
extern void rd_log();
extern rd_agent_t *rd_new();
extern rd_err_e rd_objpad_enable();
extern rd_err_e rd_plt_resolution();
extern rd_err_e rd_get_dyns();
extern rd_err_e rd_reset();
#endif
#ifdef __cplusplus
}
#endif
#endif