xref: /dragonfly/lib/libc/gen/dlinfo.3 (revision 2cd2d2b5)
1.\"
2.\" Copyright (c) 2003 Alexey Zelkin <phantom@FreeBSD.org>
3.\" All rights reserved.
4.\"
5.\" Redistribution and use in source and binary forms, with or without
6.\" modification, are permitted provided that the following conditions
7.\" are met:
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.
13.\"
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
24.\" SUCH DAMAGE.
25.\"
26.\" $FreeBSD: src/lib/libc/gen/dlinfo.3,v 1.3.2.1 2003/02/20 20:42:45 kan Exp $
27.\" $DragonFly: src/lib/libc/gen/dlinfo.3,v 1.2 2003/06/17 04:26:42 dillon Exp $
28.\"
29.Dd February 14, 2003
30.Os
31.Dt DLINFO 3
32.Sh NAME
33.Nm dlinfo
34.Nd information about dynamically loaded object
35.Sh LIBRARY
36.Lb libc
37.Sh SYNOPSIS
38.In link.h
39.In dlfcn.h
40.Ft int
41.Fn dlinfo "void * __restrict handle" "int request" "void * __restrict p"
42.Sh DESCRIPTION
43The
44.Fn dlinfo
45function provides information about dynamically loaded object.
46The action taken by
47.Fn dlinfo
48and exact meaning and type of
49.Fa p
50argument depend on value of the
51.Fa request
52argument provided by caller.
53.Pp
54A
55.Fa handle
56argument is either the value returned from a
57.Fn dlopen
58function call or special handle
59.Dv RTLD_SELF .
60If handle is the value returned from
61.Fn dlopen
62call, the information returned by the
63.Fn dlinfo
64function is pertains the specified object.
65If handle is the special handle
66.Dv RTLD_SELF ,
67the information returned pertains to the caller itself.
68.Pp
69The following are possible values for
70.Fa request
71argument to be passed into
72.Fn dlinfo :
73.Bl -tag -width Ds
74.It RTLD_DI_LINKMAP
75Retrieve the Link_map (or
76.Ft struct link_map )
77structure pointer for
78.Fa handle
79specified.
80On successful return the
81.Fa p
82argument is filled with pointer to Link_map structure
83.Ft ( Link_map **p )
84describing shared object specified by
85.Fa handle
86argument.
87.Ft Link_map
88stuctures are maintained as double-linked list by
89.Xr ld.so 1
90in same order as
91.Fn dlopen
92and
93.Fn dlclose
94are called.
95See
96.Sx EXAMPLES
97(Example 1.)
98.Pp
99The
100.Ft Link_map
101structure is defined in <link.h> and have following members:
102.Pp
103.Bd -literal
104  caddr_t         l_addr;    /* Base Address of library */
105  const char      *l_name;   /* Absolute Path to Library */
106  const void      *l_ld;     /* Pointer to .dynamic in memory */
107  struct link_map *l_next,   /* linked list of of mapped libs */
108                  *l_prev;
109.Ed
110.Bl -tag -width Ds
111.It l_addr
112The base address of the object loaded into memory.
113.It l_name
114The full name of loaded shared object.
115.It l_ld
116The address of dynamic linking information segment
117.Dv ( PT_DYNAMIC )
118loaded into memory.
119.It l_next
120The next Link_map structure on the link-map list.
121.It l_prev
122The previous Link_map structure on the link-map list.
123.El
124.It RTLD_DI_SERINFO
125Retrieve the library search paths associated with given
126.Fa handle
127argument.
128The
129.Fa p
130argument should point to
131.Ft Dl_serinfo
132structure buffer
133.Fa ( Dl_serinfo *p ) .
134.Ft Dl_serinfo
135structure must be initialized first with a
136.Dv RTLD_DI_SERINFOSIZE
137request.
138.Pp
139The returned
140.Ft Dl_serinfo
141structure contains
142.Dv dls_cnt
143.Ft Dl_serpath
144entries.
145Each entry's
146.Dv dlp_name
147field points to the search path.
148The corresponding
149.Dv dlp_info
150field contains one of more flags indicating the origin of the path (see the
151.Dv LA_SER_*
152flags defined in <link.h> header file.)
153See
154.Sx EXAMPLES
155(Example 2) for usage example.
156.It RTLD_DI_SERINFOSIZE
157Initialize a
158.Ft Dl_serinfo
159structure for use in a
160.Dv RTLD_DI_SERINFO
161request.
162Both the
163.Dv dls_cnt
164and
165.Dv dls_size
166fields are returned to indicate the number of search paths applicable
167to the handle, and the total size of a
168.Ft Dl_serinfo
169buffer required to hold
170.Dv dls_cnt
171.Ft Dl_serpath
172entries and the associated search path strings.
173See
174.Sx EXAMPLES
175(Example 2) for usage example.
176.It RTLD_DI_ORIGIN
177Retrieve the origin of the dynamic object associated with the handle.
178On successful return
179.Fa p
180argument is filled with
181.Ft char
182pointer
183.Ft ( char *p ) .
184.El
185.Sh EXAMPLES
186Example 1: Using
187.Fn dlinfo
188to retrieve Link_map structure.
189.Pp
190The following example shows how dynamic library can detect the list
191of shared libraries loaded after caller's one.
192For simplicity, error checking has been omitted.
193.Bd -literal
194     Link_map *map;
195
196     dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map);
197
198     while (map != NULL) {
199         printf("%p: %s\n", map->l_addr, map->l_name);
200         map = map->l_next;
201     }
202.Ed
203.Pp
204Example 2: Using
205.Fn dlinfo
206to retrieve the library search paths.
207.Pp
208The following example shows how a dynamic object can inspect the library
209search paths that would be used to locate a simple filename with
210.Fn dlopen .
211For simplicity, error checking has been omitted.
212.Bd -literal
213      Dl_serinfo     _info, *info = &_info;
214      Dl_serpath     *path;
215      unsigned int    cnt;
216
217      /* determine search path count and required buffer size */
218      dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info);
219
220      /* allocate new buffer and initialize */
221      info = malloc(_info.dls_size);
222      info->dls_size = _info.dls_size;
223      info->dls_cnt = _info.dls_cnt;
224
225      /* obtain sarch path information */
226      dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info);
227
228      path = &info->dls_serpath[0];
229
230      for (cnt = 1; cnt <= info->dls_cnt; cnt++, path++) {
231          (void) printf("%2d: %s\n", cnt, path->dls_name);
232      }
233.Ed
234.Sh RETURN VALUES
235.Fn dlinfo
236returns 0 on success, or -1 if error occured.
237Whenever an error has been detected, a message detailing it can
238be retrieved via a call to
239.Fn dlerror .
240.Sh SEE ALSO
241.Xr rtld 1 ,
242.Xr dladdr 3 ,
243.Xr dlopen 3 ,
244.Xr dlsym 3
245.Sh HISTORY
246The
247.Fn dlinfo
248function first appeared in the Solaris operating system.
249In
250.Fx
251it first appeared in
252.Fx 4.8 .
253.Sh AUTHORS
254The
255.Fx
256implementation of
257.Fn dlinfo
258function was originally written by
259.An Alexey Zelkin
260.Aq phantom@FreeBSD.org
261and later extended and improved by
262.An Alexander Kabaev
263.Aq kan@FreeBSD.org .
264.Pp
265The manual page for this function was written by
266.An Alexey Zelkin
267.Aq phantom@FreeBSD.org .
268