2 .\" Copyright (c) 2003 Alexey Zelkin <phantom@FreeBSD.org>
3 .\" All rights reserved.
5 .\" Redistribution and use in source and binary forms, with or without
6 .\" modification, are permitted provided that the following conditions
8 .\" 1. Redistributions of source code must retain the above copyright
9 .\" notice, this list of conditions and the following disclaimer.
10 .\" 2. Redistributions in binary form must reproduce the above copyright
11 .\" notice, this list of conditions and the following disclaimer in the
12 .\" documentation and/or other materials provided with the distribution.
14 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 .Nd information about dynamically loaded object
40 .Fn dlinfo "void * restrict handle" "int request" "void * restrict p"
44 function provides information about dynamically loaded object.
47 and exact meaning and type of
49 argument depend on value of the
51 argument provided by caller.
55 argument is either the value returned from the
57 function call or special handle
61 is the value returned from
63 the information returned by the
65 function pertains to the specified object.
66 If handle is the special handle
68 the information returned pertains to the caller itself.
70 Possible values for the
73 .Bl -tag -width indent
74 .It Dv RTLD_DI_LINKMAP
77 .Pq Vt "struct link_map"
78 structure pointer for the specified
80 On successful return, the
82 argument is filled with the pointer to the
86 describing a shared object specified by the
91 structures are maintained as a doubly linked list by
104 structure is defined in
106 and has the following members:
107 .Bd -literal -offset indent
108 caddr_t l_addr; /* Load Offset of library */
109 const char *l_name; /* Absolute Path to Library */
110 const void *l_ld; /* Pointer to .dynamic in memory */
111 struct link_map *l_next, /* linked list of mapped libs */
114 .Bl -tag -width ".Va l_addr"
116 The load offset of the object, that is, the difference between
117 the actual load address and the base virtual address the object
120 The full name of the loaded shared object.
122 The address of the dynamic linking information segment
128 structure on the link-map list.
132 structure on the link-map list.
134 .It Dv RTLD_DI_SERINFO
135 Retrieve the library search paths associated with the given
140 argument should point to
143 .Pq Fa "Dl_serinfo *p" .
146 structure must be initialized first with the
147 .Dv RTLD_DI_SERINFOSIZE
158 field points to the search path.
161 field contains one of more flags indicating the origin of the path (see the
168 example 2, for a usage example.
169 .It Dv RTLD_DI_SERINFOSIZE
172 structure for use in a
179 fields are returned to indicate the number of search paths applicable
180 to the handle, and the total size of a
182 buffer required to hold
185 entries and the associated search path strings.
188 example 2, for a usage example.
189 .It Va RTLD_DI_ORIGIN
190 Retrieve the origin of the dynamic object associated with the handle.
191 On successful return,
193 argument is filled with the
201 function returns 0 on success, or \-1 if an error occurred.
202 Whenever an error has been detected, a message detailing it can
203 be retrieved via a call to
212 The following example shows how dynamic library can detect the list
213 of shared libraries loaded after caller's one.
214 For simplicity, error checking has been omitted.
215 .Bd -literal -offset indent
218 dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map);
220 while (map != NULL) {
221 printf("%p: %s\\n", map->l_addr, map->l_name);
228 to retrieve the library search paths.
230 The following example shows how a dynamic object can inspect the library
231 search paths that would be used to locate a simple filename with
233 For simplicity, error checking has been omitted.
234 .Bd -literal -offset indent
235 Dl_serinfo _info, *info = &_info;
239 /* determine search path count and required buffer size */
240 dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info);
242 /* allocate new buffer and initialize */
243 info = malloc(_info.dls_size);
244 info->dls_size = _info.dls_size;
245 info->dls_cnt = _info.dls_cnt;
247 /* obtain sarch path information */
248 dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info);
250 path = &info->dls_serpath[0];
252 for (cnt = 1; cnt <= info->dls_cnt; cnt++, path++) {
253 (void) printf("%2d: %s\\n", cnt, path->dls_name);
264 function first appeared in the Solaris operating system.
273 implementation of the
275 function was originally written by
276 .An Alexey Zelkin Aq Mt phantom@FreeBSD.org
277 and later extended and improved by
278 .An Alexander Kabaev Aq Mt kan@FreeBSD.org .
280 The manual page for this function was written by
281 .An Alexey Zelkin Aq Mt phantom@FreeBSD.org .