1dlinfo(3) Library Functions Manual dlinfo(3)
2
3
4
6 dlinfo - obtain information about a dynamically loaded object
7
9 Dynamic linking library (libdl, -ldl)
10
12 #define _GNU_SOURCE
13 #include <link.h>
14 #include <dlfcn.h>
15
16 int dlinfo(void *restrict handle, int request, void *restrict info);
17
19 The dlinfo() function obtains information about the dynamically loaded
20 object referred to by handle (typically obtained by an earlier call to
21 dlopen(3) or dlmopen(3)). The request argument specifies which infor‐
22 mation is to be returned. The info argument is a pointer to a buffer
23 used to store information returned by the call; the type of this argu‐
24 ment depends on request.
25
26 The following values are supported for request (with the corresponding
27 type for info shown in parentheses):
28
29 RTLD_DI_LMID (Lmid_t *)
30 Obtain the ID of the link-map list (namespace) in which handle
31 is loaded.
32
33 RTLD_DI_LINKMAP (struct link_map **)
34 Obtain a pointer to the link_map structure corresponding to han‐
35 dle. The info argument points to a pointer to a link_map struc‐
36 ture, defined in <link.h> as:
37
38 struct link_map {
39 ElfW(Addr) l_addr; /* Difference between the
40 address in the ELF file and
41 the address in memory */
42 char *l_name; /* Absolute pathname where
43 object was found */
44 ElfW(Dyn) *l_ld; /* Dynamic section of the
45 shared object */
46 struct link_map *l_next, *l_prev;
47 /* Chain of loaded objects */
48
49 /* Plus additional fields private to the
50 implementation */
51 };
52
53 RTLD_DI_ORIGIN (char *)
54 Copy the pathname of the origin of the shared object correspond‐
55 ing to handle to the location pointed to by info.
56
57 RTLD_DI_SERINFO (Dl_serinfo *)
58 Obtain the library search paths for the shared object referred
59 to by handle. The info argument is a pointer to a Dl_serinfo
60 that contains the search paths. Because the number of search
61 paths may vary, the size of the structure pointed to by info can
62 vary. The RTLD_DI_SERINFOSIZE request described below allows
63 applications to size the buffer suitably. The caller must per‐
64 form the following steps:
65
66 (1) Use a RTLD_DI_SERINFOSIZE request to populate a Dl_serinfo
67 structure with the size (dls_size) of the structure needed
68 for the subsequent RTLD_DI_SERINFO request.
69
70 (2) Allocate a Dl_serinfo buffer of the correct size
71 (dls_size).
72
73 (3) Use a further RTLD_DI_SERINFOSIZE request to populate the
74 dls_size and dls_cnt fields of the buffer allocated in the
75 previous step.
76
77 (4) Use a RTLD_DI_SERINFO to obtain the library search paths.
78
79 The Dl_serinfo structure is defined as follows:
80
81 typedef struct {
82 size_t dls_size; /* Size in bytes of
83 the whole buffer */
84 unsigned int dls_cnt; /* Number of elements
85 in 'dls_serpath' */
86 Dl_serpath dls_serpath[1]; /* Actually longer,
87 'dls_cnt' elements */
88 } Dl_serinfo;
89
90 Each of the dls_serpath elements in the above structure is a
91 structure of the following form:
92
93 typedef struct {
94 char *dls_name; /* Name of library search
95 path directory */
96 unsigned int dls_flags; /* Indicates where this
97 directory came from */
98 } Dl_serpath;
99
100 The dls_flags field is currently unused, and always contains
101 zero.
102
103 RTLD_DI_SERINFOSIZE (Dl_serinfo *)
104 Populate the dls_size and dls_cnt fields of the Dl_serinfo
105 structure pointed to by info with values suitable for allocating
106 a buffer for use in a subsequent RTLD_DI_SERINFO request.
107
108 RTLD_DI_TLS_MODID (size_t *, since glibc 2.4)
109 Obtain the module ID of this shared object's TLS (thread-local
110 storage) segment, as used in TLS relocations. If this object
111 does not define a TLS segment, zero is placed in *info.
112
113 RTLD_DI_TLS_DATA (void **, since glibc 2.4)
114 Obtain a pointer to the calling thread's TLS block corresponding
115 to this shared object's TLS segment. If this object does not
116 define a PT_TLS segment, or if the calling thread has not allo‐
117 cated a block for it, NULL is placed in *info.
118
120 On success, dlinfo() returns 0. On failure, it returns -1; the cause
121 of the error can be diagnosed using dlerror(3).
122
124 For an explanation of the terms used in this section, see at‐
125 tributes(7).
126
127 ┌────────────────────────────────────────────┬───────────────┬─────────┐
128 │Interface │ Attribute │ Value │
129 ├────────────────────────────────────────────┼───────────────┼─────────┤
130 │dlinfo() │ Thread safety │ MT-Safe │
131 └────────────────────────────────────────────┴───────────────┴─────────┘
132
134 The sets of requests supported by the various implementations overlaps
135 only partially.
136
138 GNU.
139
141 glibc 2.3.3. Solaris.
142
144 The program below opens a shared objects using dlopen(3) and then uses
145 the RTLD_DI_SERINFOSIZE and RTLD_DI_SERINFO requests to obtain the
146 library search path list for the library. Here is an example of what
147 we might see when running the program:
148
149 $ ./a.out /lib64/libm.so.6
150 dls_serpath[0].dls_name = /lib64
151 dls_serpath[1].dls_name = /usr/lib64
152
153 Program source
154
155 #define _GNU_SOURCE
156 #include <dlfcn.h>
157 #include <link.h>
158 #include <stdio.h>
159 #include <stdlib.h>
160
161 int
162 main(int argc, char *argv[])
163 {
164 void *handle;
165 Dl_serinfo serinfo;
166 Dl_serinfo *sip;
167
168 if (argc != 2) {
169 fprintf(stderr, "Usage: %s <libpath>\n", argv[0]);
170 exit(EXIT_FAILURE);
171 }
172
173 /* Obtain a handle for shared object specified on command line. */
174
175 handle = dlopen(argv[1], RTLD_NOW);
176 if (handle == NULL) {
177 fprintf(stderr, "dlopen() failed: %s\n", dlerror());
178 exit(EXIT_FAILURE);
179 }
180
181 /* Discover the size of the buffer that we must pass to
182 RTLD_DI_SERINFO. */
183
184 if (dlinfo(handle, RTLD_DI_SERINFOSIZE, &serinfo) == -1) {
185 fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\n", dlerror());
186 exit(EXIT_FAILURE);
187 }
188
189 /* Allocate the buffer for use with RTLD_DI_SERINFO. */
190
191 sip = malloc(serinfo.dls_size);
192 if (sip == NULL) {
193 perror("malloc");
194 exit(EXIT_FAILURE);
195 }
196
197 /* Initialize the 'dls_size' and 'dls_cnt' fields in the newly
198 allocated buffer. */
199
200 if (dlinfo(handle, RTLD_DI_SERINFOSIZE, sip) == -1) {
201 fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\n", dlerror());
202 exit(EXIT_FAILURE);
203 }
204
205 /* Fetch and print library search list. */
206
207 if (dlinfo(handle, RTLD_DI_SERINFO, sip) == -1) {
208 fprintf(stderr, "RTLD_DI_SERINFO failed: %s\n", dlerror());
209 exit(EXIT_FAILURE);
210 }
211
212 for (size_t j = 0; j < serinfo.dls_cnt; j++)
213 printf("dls_serpath[%zu].dls_name = %s\n",
214 j, sip->dls_serpath[j].dls_name);
215
216 exit(EXIT_SUCCESS);
217 }
218
220 dl_iterate_phdr(3), dladdr(3), dlerror(3), dlopen(3), dlsym(3),
221 ld.so(8)
222
223
224
225Linux man-pages 6.05 2023-07-20 dlinfo(3)