Debugger Import Interface
The imported interface that a controlling process must provide to
librtld_db.so.1
is defined in
/usr/include/proc_service.h
. A sample implementation of
these proc_service
functions can be found in the
rdb
demonstration debugger. The
rtld-debugger interface uses only a subset of the
proc_service
interfaces available. Future versions of the
rtld-debugger interface might take advantage of additional
proc_service
interfaces without creating an incompatible
change.
The following interfaces are currently being used by the rtld-debugger interface.
-
ps_pauxv
() -
This function returns a pointer to a copy of the
auxv
vector.ps_err_e ps_pauxv(const struct ps_prochandle *ph, auxv_t **aux);
Because the
auxv
vector information is copied to an allocated structure, the pointer remains as long as theps_prochandle
is valid. -
ps_pread
() -
This function reads data from the target process.
ps_err_e ps_pread(const struct ps_prochandle *ph, paddr_t addr, char *buf, int size);
From address
addr
in the target process,size
bytes are copied tobuf
. -
ps_pwrite
() -
This function writes data to the target process.
ps_err_e ps_pwrite(const struct ps_prochandle *ph, paddr_t addr, char *buf, int size);
size
bytes frombuf
are copied into the target process at addressaddr
. -
ps_plog
() -
This function is called with additional diagnostic information from the rtld-debugger interface.
void ps_plog(const char *fmt, ....);
The controlling process determines where, or if, to log this diagnostic information. The arguments to
ps_plog
() follow theprintf
(3C) format. -
ps_pglobal_lookup
() -
This function searches for the symbol in the target process.
ps_err_e ps_pglobal_lookup(const struct ps_prochandle *ph, const char *obj, const char *name, ulong_t *sym_addr);
The symbol named
name
is searched for within the object namedobj
within the target processph
. If the symbol is found, the symbol address is stored insym_addr
. -
ps_pglobal_sym
() -
This function searches for the symbol in the target process.
ps_err_e ps_pglobal_sym(const struct ps_prochandle *ph, const char *obj, const char *name, ps_sym_t *sym_desc);
The symbol named
name
is searched for within the object namedobj
within the target processph
. If the symbol is found, the symbol descriptor is stored insym_desc
.
In the event that the rtld-debugger interface needs to find
symbols within the application or runtime linker prior to any link-map creation, the
following reserved values for obj
are available.
#define PS_OBJ_EXEC ((const char *)0x0) /* application id */ #define PS_OBJ_LDSO ((const char *)0x1) /* runtime linker id */
The controlling process can use the procfs
file system for
these objects, using the following pseudo code.
ioctl(...., PIOCNAUXV, ....) - obtain AUX vectors ldsoaddr = auxv[AT_BASE]; ldsofd = ioctl(...., PIOCOPENM, &ldsoaddr); /* process elf information found in ldsofd .... */ execfd = ioctl(...., PIOCOPENM, 0); /* process elf information found in execfd .... */
Once the file descriptors are found, the ELF files can be examined for their symbol information by the controlling program.