DLINFO(3C) Standard C Library Functions DLINFO(3C)
NAME
dlinfo - dynamic load information
SYNOPSIS
#include <dlfcn.h>
#include <link.h>
#include <limits.h>
#include <sys/mman.h>
int dlinfo(
void *handle,
int request,
void *p);
DESCRIPTION
The
dlinfo() function sets or extracts information from the runtime
linker
ld.so.1(1). This function is loosely modeled after the
ioctl(2) function. The
request argument and a third argument of
varying type are passed to
dlinfo(). The action taken by
dlinfo() depends on the value of the
request that is provided.
The
handle argument is either the value that is returned from a
dlopen(3C) or
dlmopen() call, or the special handle
RTLD_SELF. A
handle argument is required for all requests except
RTLD_DI_CONFIGADDR,
RTLD_DI_GETSIGNAL, and
RTLD_DI_SETSIGNAL. If
handle is the value that is returned from a
dlopen() or
dlmopen() call, the information returned by the
dlinfo() call pertains to the
specified object. If
handle is the special handle
RTLD_SELF, the
information returned by the
dlinfo() call pertains to the caller.
The
request argument can take the following values:
RTLD_DI_ARGSINFO Obtain process argument information. The
p argument is a pointer
(
Dl_argsinfo_t *p). The following elements from this structure
are initialized:
dla_argc The number of arguments passed to the process.
dla_argv The argument array passed to the process.
dla_envp The active environment variable array that is
available to the process. This element initially
points to the environment variable array that is made
available to
exec(2). This element can be updated
should an alternative environment be established by
the process. See
putenv(3C).
dla_auxv The auxiliary vector array passed to the process.
A process can be established from executing the runtime linker
directly from the command line. See
ld.so.1(1). The
Dl_argsinfo_t information reflects the information that is made available to
the application regardless of how the runtime linker has been
invoked.
RTLD_DI_CONFIGADDR Obtain the configuration file information. The
p argument is a
Dl_info_t pointer (
Dl_info_t *p). The following elements from
this structure are initialized:
dli_fname The full name of the configuration file.
dli_fbase The base address of the configuration file loaded
into memory.
RTLD_DI_LINKMAP Obtain the
Link_map for the
handle that is specified. The
p argument points to a
Link_map pointer (
Link_map **p). The actual
storage for the
Link_map structure is maintained by
ld.so.1.
The
Link_map structure includes the following members:
unsigned long l_addr; /* base address */
char *l_name; /* object name */
Elf32_Dyn *l_ld; /* .dynamic section */
Link_map *l_next; /* next link object */
Link_map *l_prev; /* previous link object */
char *l_refname; /* filter reference name */
l_addr The base address of the object loaded into memory.
l_name The full name of the loaded object. This full name
is the filename of the object as referenced by
ld.so.1.
l_ld Points to the
SHT_DYNAMIC structure.
l_next The next
Link_map on the link-map list. Other
objects on the same link-map list as the current
object can be examined by following the
l_next and
l_prev members.
l_prev The previous
Link_map on the link-map list.
l_refname If the object that is referenced is a
filter, this
member points to the name of the object being
filtered. If the object is not a
filter, this member
is
0. See the
Linker and Libraries Guide.
RTLD_DI_LMID Obtain the
ID for the link-map list upon which the
handle is
loaded. The
p argument is a
Lmid_t pointer (
Lmid_t *p).
RTLD_DI_MMAPCNT Determine the number of segment mappings for the
handle that is
specified, for use in a
RTLD_DI_MMAPS request. The
p argument is
a
uint_t pointer (
uint_t *p). On return from a
RTLD_DI_MMAPCNT request, the
uint_t value that is pointed to by
p contains the
number of segment mappings that the associated object uses.
To obtain the complete mapping information for an object, a
mmapobj_result_t array for
RTLD_DI_MMAPCNT entries must be
provided. This array is assigned to the
dlm_maps member, and the
number of entries available in the array are assigned to the
dlm_acnt member. This initialized structure is then passed to a
RTLD_DI_MMAPS request. See
EXAMPLES.
RTLD_DI_MMAPS Obtain segment mapping information for the
handle that is
specified. The
p argument is a
Dl_mapinfo_t pointer (
Dl_mapinfo_t *p). This structure can be initialized from the mapping count
obtained from a previous
RTLD_DI_MMAPCNT request.
Segment mapping information is provided in an array of
mmapobj_result_t structures that originate from the
mmapobj(2) of
the associated object. The
dlm_acnt member, typically
initialized from a previous
RTLD_DI_MMAPCNT request, indicates
the number of entries in a
mmapobj_result_t array. This array is
assigned to the
dlm_maps member. This initialized structure is
then passed to a
RTLD_DI_MMAPS request, where the segment mapping
information is copied to the
mmapobj_result_t array. The
dlm_rcnt member indicates the number of
mmapobj_result_t element entries
that are returned. See
EXAMPLES.
RTLD_DI_SERINFO Obtain the library search paths for the
handle that is specified.
The
p argument is a
Dl_serinfo_t pointer (
Dl_serinfo_t *p). A
user must first initialize the
Dl_serinfo_t structure with a
RTLD_DI_SERINFOSIZE request. See
EXAMPLES.
The returned
Dl_serinfo_t structure contains
dls_cnt Dl_serpath_t entries. Each entry's
dlp_name member points to the search path.
The corresponding
dlp_info member contains one of more flags
indicating the origin of the path. See the
LA_SER_* flags that
are defined in <
link.h>.
RTLD_DI_SERINFOSIZE Initialize a
Dl_serinfo_t structure for the
handle that is
specified, for use in a
RTLD_DI_SERINFO request. Both the
dls_cnt and
dls_size members are returned. The
dls_cnt member indicates
the number of search paths that are applicable to the
handle. The
dls_size member indicates the total size of a
Dl_serinfo_t buffer
required to hold
dls_cnt Dl_serpath_t entries and the associated
search path strings. The
p argument is a
Dl_serinfo_t pointer
(
Dl_serinfo_t *p).
To obtain the complete path information, a new
Dl_serinfo_t buffer of size
dls_size should be allocated. This new buffer
should be initialized with the
dls_cnt and
dls_size entries. The
initialized buffer is then passed to a
RTLD_DI_SERINFO request.
See
EXAMPLES.
RTLD_DI_ORIGIN Obtain the origin of the dynamic object that is associated with
the
handle. The
p argument is a
char pointer (
char *p). The
dirname(3C) of the associated object's
realpath(3C), which can be
no larger than {
PATH_MAX}, is copied to the pointer
p.
RTLD_DI_GETSIGNAL Obtain the numeric signal number used by the runtime linker to
kill the process in the event of a fatal runtime error. The
p argument is an
int pointer (
int *p). The signal number is copied
to the pointer
p.
By default, the signal used by the runtime linker to terminate a
process is
SIGKILL. See
thr_kill(3C). This default can be changed
by calling
dlinfo() with
RTLD_DI_SETSIGNAL or by setting the
environment variable
LD_SIGNAL. See
ld.so.1(1).
RTLD_DI_SETSIGNAL Provide a numeric signal number used by the runtime linker to
kill the process in the event of a fatal runtime error. The
p argument is an
int pointer (
int *p). The value pointed to by
p is
established as the terminating signal value.
The current signal number used by the runtime linker to terminate
a process can be obtained from
dlinfo() using
RTLD_DI_GETSIGNAL.
Use of the
RTLD_DI_SETSIGNAL option is equivalent to setting the
environment variable
LD_SIGNAL. See
ld.so.1(1).
RETURN VALUES
The
dlinfo() function returns -1 if the
request is invalid, the
parameter
p is
NULL, or the
Dl_serinfo_t structure is uninitialized
for a
RTLD_DI_SERINFO request.
dlinfo() also returns -1 if the
handle argument does not refer to a valid object opened by
dlopen(), or is
not the special handle
RTLD_SELF. Detailed diagnostic information is
available with
dlerror(3C).
EXAMPLES
Example 1: Use dlinfo() to obtain library search paths.
The following example demonstrates how a dynamic object can inspect
the library search paths that would be used to locate a simple
filename with
dlopen(). For simplicity, error checking has been
omitted.
Dl_serinfo_t _info, *info = &_info;
Dl_serpath_t *path;
uint_t cnt;
/* determine search path count and required buffer size */
dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, info);
/* allocate new buffer and initialize */
info = malloc(_info.dls_size);
info->dls_size = _info.dls_size;
info->dls_cnt = _info.dls_cnt;
/* obtain search path information */
dlinfo(RTLD_SELF, RTLD_DI_SERINFO, info);
path = &info->dls_serpath[0];
for (cnt = 1; cnt <= info->dls_cnt; cnt++, path++) {
(void) printf("%2d: %s\n", cnt, path->dls_name);
}
Example 2: Use dlinfo() to obtain segment information.
The following example demonstrates how a dynamic object can inspect
its segment mapping information. For simplicity, error checking has
been omitted
Dl_mapinfo_t mi;
uint_t cnt;
/* determine the number of segment mappings */
dlinfo(RTLD_SELF, RTLD_DI_MMAPCNT, &mi.dlm_acnt);
/* allocate the appropriate mapping array */
mi.dlm_maps = malloc(mi.dlm_acnt * sizeof (mmapobj_result_t));
/* obtain the mapping information */
dlinfo(RTLD_SELF, RTLD_DI_MMAPS, &mi);
for (cnt = 0; cnt < mi.dlm_rcnt; cnt++) {
(void) printf("addr=%x - memory size=%x\n",
mi.dlm_maps[cnt].mr_addr, mi.dlm_maps[cnt].mr_msize);
}
USAGE
The
dlinfo() function is one of a family of functions that give the
user direct access to the dynamic linking facilities. These
facilities are available to dynamically-linked processes only. See
the
Linker and Libraries Guide.
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Stable |
+--------------------+-----------------+
|MT-Level | MT-Safe |
+--------------------+-----------------+
SEE ALSO
ld(1),
ld.so.1(1),
exec(2),
ioctl(2),
mmapobj(2),
dirname(3C),
dlclose(3C),
dldump(3C),
dlerror(3C),
dlopen(3C),
dlsym(3C),
putenv(3C),
realpath(3C),
thr_kill(3C),
attributes(7) Linker and Libraries Guide February 17, 2023 DLINFO(3C)