xref: /freebsd/lib/libc/gen/dlinfo.3 (revision aba60fa66b69fd0b78c16181babe2cc4d9e3f294)
18647a1edSAlexey Zelkin.\"
28647a1edSAlexey Zelkin.\" Copyright (c) 2003 Alexey Zelkin <phantom@FreeBSD.org>
38647a1edSAlexey Zelkin.\" All rights reserved.
48647a1edSAlexey Zelkin.\"
58647a1edSAlexey Zelkin.\" Redistribution and use in source and binary forms, with or without
68647a1edSAlexey Zelkin.\" modification, are permitted provided that the following conditions
78647a1edSAlexey Zelkin.\" are met:
88647a1edSAlexey Zelkin.\" 1. Redistributions of source code must retain the above copyright
98647a1edSAlexey Zelkin.\"    notice, this list of conditions and the following disclaimer.
108647a1edSAlexey Zelkin.\" 2. Redistributions in binary form must reproduce the above copyright
118647a1edSAlexey Zelkin.\"    notice, this list of conditions and the following disclaimer in the
128647a1edSAlexey Zelkin.\"    documentation and/or other materials provided with the distribution.
138647a1edSAlexey Zelkin.\"
148647a1edSAlexey Zelkin.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
158647a1edSAlexey Zelkin.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168647a1edSAlexey Zelkin.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
178647a1edSAlexey Zelkin.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
188647a1edSAlexey Zelkin.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
198647a1edSAlexey Zelkin.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
208647a1edSAlexey Zelkin.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
218647a1edSAlexey Zelkin.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
228647a1edSAlexey Zelkin.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
238647a1edSAlexey Zelkin.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
248647a1edSAlexey Zelkin.\" SUCH DAMAGE.
258647a1edSAlexey Zelkin.\"
268647a1edSAlexey Zelkin.\" $FreeBSD$
278647a1edSAlexey Zelkin.\"
288647a1edSAlexey Zelkin.Dd February 14, 2003
298647a1edSAlexey Zelkin.Os
308647a1edSAlexey Zelkin.Dt DLINFO 3
318647a1edSAlexey Zelkin.Sh NAME
328647a1edSAlexey Zelkin.Nm dlinfo
338647a1edSAlexey Zelkin.Nd information about dynamically loaded object
348647a1edSAlexey Zelkin.Sh LIBRARY
358647a1edSAlexey Zelkin.Lb libc
368647a1edSAlexey Zelkin.Sh SYNOPSIS
378647a1edSAlexey Zelkin.In link.h
388647a1edSAlexey Zelkin.In dlfcn.h
398647a1edSAlexey Zelkin.Ft int
408647a1edSAlexey Zelkin.Fn dlinfo "void * __restrict handle" "int request" "void * __restrict p"
418647a1edSAlexey Zelkin.Sh DESCRIPTION
428647a1edSAlexey ZelkinThe
438647a1edSAlexey Zelkin.Fn dlinfo
448647a1edSAlexey Zelkinfunction provides information about dynamically loaded object.
458647a1edSAlexey ZelkinThe action taken by
468647a1edSAlexey Zelkin.Fn dlinfo
478647a1edSAlexey Zelkinand exact meaning and type of
488647a1edSAlexey Zelkin.Fa p
498647a1edSAlexey Zelkinargument depend on value of the
508647a1edSAlexey Zelkin.Fa request
518647a1edSAlexey Zelkinargument provided by caller.
528647a1edSAlexey Zelkin.Pp
538647a1edSAlexey ZelkinA
548647a1edSAlexey Zelkin.Fa handle
558647a1edSAlexey Zelkinargument is either the value returned from a
568647a1edSAlexey Zelkin.Fn dlopen
578647a1edSAlexey Zelkinfunction call or special handle
588647a1edSAlexey Zelkin.Dv RTLD_SELF .
598647a1edSAlexey ZelkinIf handle is the value returned from
608647a1edSAlexey Zelkin.Fn dlopen
618647a1edSAlexey Zelkincall, the information returned by the
628647a1edSAlexey Zelkin.Fn dlinfo
638647a1edSAlexey Zelkinfunction is pertains the specified object.
648647a1edSAlexey ZelkinIf handle is the special handle
658647a1edSAlexey Zelkin.Dv RTLD_SELF ,
668647a1edSAlexey Zelkinthe information returned pertains to the caller itself.
678647a1edSAlexey Zelkin.Pp
688647a1edSAlexey ZelkinThe following are possible values for
698647a1edSAlexey Zelkin.Fa request
708647a1edSAlexey Zelkinargument to be passed into
718647a1edSAlexey Zelkin.Fn dlinfo :
728647a1edSAlexey Zelkin.Bl -tag -width Ds
738647a1edSAlexey Zelkin.It RTLD_DI_LINKMAP
748647a1edSAlexey ZelkinRetrieve the Link_map (or
758647a1edSAlexey Zelkin.Ft struct link_map )
768647a1edSAlexey Zelkinstructure pointer for
778647a1edSAlexey Zelkin.Fa handle
788647a1edSAlexey Zelkinspecified.
798647a1edSAlexey ZelkinOn successful return the
808647a1edSAlexey Zelkin.Fa p
818647a1edSAlexey Zelkinargument is filled with pointer to Link_map structure
828647a1edSAlexey Zelkin.Ft ( Link_map **p )
838647a1edSAlexey Zelkindescribing shared object specified by
848647a1edSAlexey Zelkin.Fa handle
858647a1edSAlexey Zelkinargument.
868647a1edSAlexey Zelkin.Ft Link_map
878647a1edSAlexey Zelkinstuctures are maintained as double-linked list by
888647a1edSAlexey Zelkin.Xr ld.so 1
898647a1edSAlexey Zelkinin same order as
908647a1edSAlexey Zelkin.Fn dlopen
918647a1edSAlexey Zelkinand
928647a1edSAlexey Zelkin.Fn dlclose
938647a1edSAlexey Zelkinare called.
948647a1edSAlexey ZelkinSee
958647a1edSAlexey Zelkin.Sx EXAMPLES
966bc55edbSAlexey Zelkin(Example 1.)
976bc55edbSAlexey Zelkin.Pp
986bc55edbSAlexey ZelkinThe
996bc55edbSAlexey Zelkin.Ft Link_map
1006bc55edbSAlexey Zelkinstructure is defined in <link.h> and have following members:
1016bc55edbSAlexey Zelkin.Pp
1026bc55edbSAlexey Zelkin.Bd -literal
1036bc55edbSAlexey Zelkin  caddr_t         l_addr;    /* Base Address of library */
1046bc55edbSAlexey Zelkin  const char      *l_name;   /* Absolute Path to Library */
1056bc55edbSAlexey Zelkin  const void      *l_ld;     /* Pointer to .dynamic in memory */
1066bc55edbSAlexey Zelkin  struct link_map *l_next,   /* linked list of of mapped libs */
1076bc55edbSAlexey Zelkin                  *l_prev;
1086bc55edbSAlexey Zelkin.Ed
1096bc55edbSAlexey Zelkin.Bl -tag -width Ds
1106bc55edbSAlexey Zelkin.It l_addr
1116bc55edbSAlexey ZelkinThe base address of the object loaded into memory.
1126bc55edbSAlexey Zelkin.It l_name
1136bc55edbSAlexey ZelkinThe full name of loaded shared object.
1146bc55edbSAlexey Zelkin.It l_ld
1156bc55edbSAlexey ZelkinThe address of dynamic linking information segment
1166bc55edbSAlexey Zelkin.Dv ( PT_DYNAMIC )
1176bc55edbSAlexey Zelkinloaded into memory.
1186bc55edbSAlexey Zelkin.It l_next
1196bc55edbSAlexey ZelkinThe next Link_map structure on the link-map list.
1206bc55edbSAlexey Zelkin.It l_prev
1216bc55edbSAlexey ZelkinThe previous Link_map structure on the link-map list.
1226bc55edbSAlexey Zelkin.El
1238647a1edSAlexey Zelkin.It RTLD_DI_SERINFO
1248647a1edSAlexey ZelkinRetrieve the library search paths associated with given
1258647a1edSAlexey Zelkin.Fa handle
1268647a1edSAlexey Zelkinargument.
1278647a1edSAlexey ZelkinThe
1288647a1edSAlexey Zelkin.Fa p
1298647a1edSAlexey Zelkinargument should point to
1308647a1edSAlexey Zelkin.Ft Dl_serinfo
1318647a1edSAlexey Zelkinstructure buffer
1328647a1edSAlexey Zelkin.Fa ( Dl_serinfo *p ) .
1338647a1edSAlexey Zelkin.Ft Dl_serinfo
1348647a1edSAlexey Zelkinstructure must be initialized first with a
1358647a1edSAlexey Zelkin.Dv RTLD_DI_SERINFOSIZE
1368647a1edSAlexey Zelkinrequest.
1378647a1edSAlexey Zelkin.Pp
1388647a1edSAlexey ZelkinThe returned
1398647a1edSAlexey Zelkin.Ft Dl_serinfo
1408647a1edSAlexey Zelkinstructure contains
1418647a1edSAlexey Zelkin.Dv dls_cnt
1428647a1edSAlexey Zelkin.Ft Dl_serpath
1438647a1edSAlexey Zelkinentries.
1448647a1edSAlexey ZelkinEach entry's
1458647a1edSAlexey Zelkin.Dv dlp_name
1468647a1edSAlexey Zelkinfield points to the search path.
1478647a1edSAlexey ZelkinThe corresponding
1488647a1edSAlexey Zelkin.Dv dlp_info
1498647a1edSAlexey Zelkinfield contains one of more flags indicating the origin of the path (see the
1508647a1edSAlexey Zelkin.Dv LA_SER_*
1518647a1edSAlexey Zelkinflags defined in <link.h> header file.)
1528647a1edSAlexey ZelkinSee
1538647a1edSAlexey Zelkin.Sx EXAMPLES
1548647a1edSAlexey Zelkin(Example 2) for usage example.
1558647a1edSAlexey Zelkin.It RTLD_DI_SERINFOSIZE
1568647a1edSAlexey ZelkinInitialize a
1578647a1edSAlexey Zelkin.Ft Dl_serinfo
1588647a1edSAlexey Zelkinstructure for use in a
1598647a1edSAlexey Zelkin.Dv RTLD_DI_SERINFO
1608647a1edSAlexey Zelkinrequest.
1618647a1edSAlexey ZelkinBoth the
1628647a1edSAlexey Zelkin.Dv dls_cnt
1638647a1edSAlexey Zelkinand
1648647a1edSAlexey Zelkin.Dv dls_size
1658647a1edSAlexey Zelkinfields are returned to indicate the number of search paths applicable
1668647a1edSAlexey Zelkinto the handle, and the total size of a
1678647a1edSAlexey Zelkin.Ft Dl_serinfo
1688647a1edSAlexey Zelkinbuffer required to hold
1698647a1edSAlexey Zelkin.Dv dls_cnt
1708647a1edSAlexey Zelkin.Ft Dl_serpath
1718647a1edSAlexey Zelkinentries and the associated search path strings.
1728647a1edSAlexey ZelkinSee
1738647a1edSAlexey Zelkin.Sx EXAMPLES
1748647a1edSAlexey Zelkin(Example 2) for usage example.
1758647a1edSAlexey Zelkin.It RTLD_DI_ORIGIN
1768647a1edSAlexey ZelkinRetrieve the origin of the dynamic object associated with the handle.
1778647a1edSAlexey ZelkinOn successful return
1788647a1edSAlexey Zelkin.Fa p
1798647a1edSAlexey Zelkinargument is filled with
1808647a1edSAlexey Zelkin.Ft char
1818647a1edSAlexey Zelkinpointer
1828647a1edSAlexey Zelkin.Ft ( char *p ) .
1838647a1edSAlexey Zelkin.El
1848647a1edSAlexey Zelkin.Sh EXAMPLES
185f7344926SAlexey ZelkinExample 1: Using
186f7344926SAlexey Zelkin.Fn dlinfo
187f7344926SAlexey Zelkinto retrieve Link_map structure.
188f7344926SAlexey Zelkin.Pp
189f7344926SAlexey ZelkinThe following example shows how dynamic library can detect the list
190f7344926SAlexey Zelkinof shared libraries loaded after caller's one.
191f7344926SAlexey ZelkinFor simplicity, error checking has been omitted.
192f7344926SAlexey Zelkin.Bd -literal
193f7344926SAlexey Zelkin     Link_map *map;
194f7344926SAlexey Zelkin
195f7344926SAlexey Zelkin     dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map);
196f7344926SAlexey Zelkin
197f7344926SAlexey Zelkin     while (map != NULL) {
198aba60fa6SRuslan Ermilov         printf("%p: %s\\n", map->l_addr, map->l_name);
199f7344926SAlexey Zelkin         map = map->l_next;
200f7344926SAlexey Zelkin     }
201f7344926SAlexey Zelkin.Ed
202f7344926SAlexey Zelkin.Pp
203f7344926SAlexey ZelkinExample 2: Using
204f7344926SAlexey Zelkin.Fn dlinfo
205f7344926SAlexey Zelkinto retrieve the library search paths.
206f7344926SAlexey Zelkin.Pp
207f7344926SAlexey ZelkinThe following example shows how a dynamic object can inspect the library
208f7344926SAlexey Zelkinsearch paths that would be used to locate a simple filename with
209f7344926SAlexey Zelkin.Fn dlopen .
210f7344926SAlexey ZelkinFor simplicity, error checking has been omitted.
211f7344926SAlexey Zelkin.Bd -literal
212f7344926SAlexey Zelkin      Dl_serinfo     _info, *info = &_info;
213f7344926SAlexey Zelkin      Dl_serpath     *path;
214f7344926SAlexey Zelkin      unsigned int    cnt;
215f7344926SAlexey Zelkin
216f7344926SAlexey Zelkin      /* determine search path count and required buffer size */
217f7344926SAlexey Zelkin      dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info);
218f7344926SAlexey Zelkin
219f7344926SAlexey Zelkin      /* allocate new buffer and initialize */
220f7344926SAlexey Zelkin      info = malloc(_info.dls_size);
221f7344926SAlexey Zelkin      info->dls_size = _info.dls_size;
222f7344926SAlexey Zelkin      info->dls_cnt = _info.dls_cnt;
223f7344926SAlexey Zelkin
224f7344926SAlexey Zelkin      /* obtain sarch path information */
225f7344926SAlexey Zelkin      dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info);
226f7344926SAlexey Zelkin
227f7344926SAlexey Zelkin      path = &info->dls_serpath[0];
228f7344926SAlexey Zelkin
229f7344926SAlexey Zelkin      for (cnt = 1; cnt <= info->dls_cnt; cnt++, path++) {
230aba60fa6SRuslan Ermilov          (void) printf("%2d: %s\\n", cnt, path->dls_name);
231f7344926SAlexey Zelkin      }
232f7344926SAlexey Zelkin.Ed
2338647a1edSAlexey Zelkin.Sh RETURN VALUES
234b43dc211SPhilippe CharnierThe
2358647a1edSAlexey Zelkin.Fn dlinfo
236b43dc211SPhilippe Charnierfunction returns 0 on success, or -1 if error occured.
2378647a1edSAlexey ZelkinWhenever an error has been detected, a message detailing it can
2388647a1edSAlexey Zelkinbe retrieved via a call to
2398647a1edSAlexey Zelkin.Fn dlerror .
2408647a1edSAlexey Zelkin.Sh SEE ALSO
2418647a1edSAlexey Zelkin.Xr rtld 1 ,
2428647a1edSAlexey Zelkin.Xr dladdr 3 ,
2438647a1edSAlexey Zelkin.Xr dlopen 3 ,
2448647a1edSAlexey Zelkin.Xr dlsym 3
2458647a1edSAlexey Zelkin.Sh HISTORY
2468647a1edSAlexey ZelkinThe
2478647a1edSAlexey Zelkin.Fn dlinfo
2488647a1edSAlexey Zelkinfunction first appeared in the Solaris operating system.
2498647a1edSAlexey ZelkinIn
2508647a1edSAlexey Zelkin.Fx
2518647a1edSAlexey Zelkinit first appeared in
2528647a1edSAlexey Zelkin.Fx 4.8 .
2538647a1edSAlexey Zelkin.Sh AUTHORS
2548647a1edSAlexey ZelkinThe
2556bc55edbSAlexey Zelkin.Fx
2566bc55edbSAlexey Zelkinimplementation of
2578647a1edSAlexey Zelkin.Fn dlinfo
2588647a1edSAlexey Zelkinfunction was originally written by
2598647a1edSAlexey Zelkin.An Alexey Zelkin
2608647a1edSAlexey Zelkin.Aq phantom@FreeBSD.org
2618647a1edSAlexey Zelkinand later extended and improved by
2628647a1edSAlexey Zelkin.An Alexander Kabaev
2638647a1edSAlexey Zelkin.Aq kan@FreeBSD.org .
2648647a1edSAlexey Zelkin.Pp
2658647a1edSAlexey ZelkinThe manual page for this function was written by
2668647a1edSAlexey Zelkin.An Alexey Zelkin
2678647a1edSAlexey Zelkin.Aq phantom@FreeBSD.org .
268