]>
Commit | Line | Data |
---|---|---|
fea681da MK |
1 | .\" Copyright 1995 Yggdrasil Computing, Incorporated. |
2 | .\" written by Adam J. Richter (adam@yggdrasil.com), | |
3 | .\" with typesetting help from Daniel Quinlan (quinlan@yggdrasil.com). | |
c11b1abf | 4 | .\" and Copyright 2003 Michael Kerrisk (mtk.manpages@gmail.com). |
fea681da MK |
5 | .\" |
6 | .\" This is free documentation; you can redistribute it and/or | |
7 | .\" modify it under the terms of the GNU General Public License as | |
8 | .\" published by the Free Software Foundation; either version 2 of | |
9 | .\" the License, or (at your option) any later version. | |
10 | .\" | |
11 | .\" The GNU General Public License's references to "object code" | |
12 | .\" and "executables" are to be interpreted as the output of any | |
13 | .\" document formatting or typesetting system, including | |
14 | .\" intermediate and printed output. | |
15 | .\" | |
16 | .\" This manual is distributed in the hope that it will be useful, | |
17 | .\" but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 | .\" GNU General Public License for more details. | |
20 | .\" | |
21 | .\" You should have received a copy of the GNU General Public | |
22 | .\" License along with this manual; if not, write to the Free | |
23 | .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, | |
24 | .\" USA. | |
25 | .\" | |
26 | .\" Modified by David A. Wheeler <dwheeler@dwheeler.com> 2000-11-28. | |
27 | .\" Applied patch by Terran Melconian, aeb, 2001-12-14. | |
28 | .\" Modified by Hacksaw <hacksaw@hacksaw.org> 2003-03-13. | |
29 | .\" Modified by Matt Domsch, 2003-04-09: _init and _fini obsolete | |
c11b1abf | 30 | .\" Modified by Michael Kerrisk <mtk.manpages@gmail.com> 2003-05-16. |
fea681da | 31 | .\" Modified by Walter Harms: dladdr, dlvsym |
27a61e86 | 32 | .\" Modified by Petr Baudis <pasky@suse.cz>, 2008-12-04: dladdr caveat |
fea681da | 33 | .\" |
450c8386 | 34 | .TH DLOPEN 3 2008-12-06 "Linux" "Linux Programmer's Manual" |
fea681da MK |
35 | .SH NAME |
36 | dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym \- programming interface to | |
37 | dynamic linking loader | |
38 | .SH SYNOPSIS | |
39 | .B #include <dlfcn.h> | |
40 | .sp | |
41 | .BI "void *dlopen(const char *" filename ", int " flag ); | |
42 | .sp | |
0daa9e92 | 43 | .B "char *dlerror(void);" |
fea681da MK |
44 | .sp |
45 | .BI "void *dlsym(void *" handle ", const char *" symbol ); | |
46 | .sp | |
47 | .BI "int dlclose(void *" handle ); | |
3f37321b MK |
48 | .sp |
49 | Link with \fI\-ldl\fP. | |
fea681da MK |
50 | .SH DESCRIPTION |
51 | The four functions | |
d355f1ed MK |
52 | .BR dlopen (), |
53 | .BR dlsym (), | |
54 | .BR dlclose (), | |
55 | .BR dlerror () | |
fea681da | 56 | implement the interface to the dynamic linking loader. |
73d8cece | 57 | .SS dlerror() |
fea681da | 58 | The function |
d355f1ed | 59 | .BR dlerror () |
fea681da | 60 | returns a human readable string describing the most recent error |
c13182ef MK |
61 | that occurred from |
62 | .BR dlopen (), | |
63 | .BR dlsym () | |
64 | or | |
1e321034 | 65 | .BR dlclose () |
fea681da | 66 | since the last call to |
1368e847 | 67 | .BR dlerror (). |
fea681da MK |
68 | It returns NULL if no errors have occurred since initialization or since |
69 | it was last called. | |
73d8cece | 70 | .SS dlopen() |
fea681da | 71 | The function |
d355f1ed | 72 | .BR dlopen () |
fea681da MK |
73 | loads the dynamic library file named by the null-terminated |
74 | string | |
75 | .I filename | |
76 | and returns an opaque "handle" for the dynamic library. | |
77 | If | |
78 | .I filename | |
79 | is NULL, then the returned handle is for the main program. | |
80 | If | |
81 | .I filename | |
82 | contains a slash ("/"), then it is interpreted as a (relative | |
83 | or absolute) pathname. | |
84 | Otherwise, the dynamic linker searches for the library as follows | |
85 | (see | |
86 | .BR ld.so (8) | |
87 | for further details): | |
86100362 | 88 | .IP o 4 |
fea681da MK |
89 | (ELF only) If the executable file for the calling program |
90 | contains a DT_RPATH tag, and does not contain a DT_RUNPATH tag, | |
91 | then the directories listed in the DT_RPATH tag are searched. | |
92 | .IP o | |
65f6a3ee | 93 | If, at the time that the program was started, the environment variable |
0daa9e92 | 94 | .B LD_LIBRARY_PATH |
65f6a3ee | 95 | was defined to contain a colon-separated list of directories, |
fea681da | 96 | then these are searched. |
c13182ef | 97 | (As a security measure this variable is ignored for set-user-ID and |
880f5b4b | 98 | set-group-ID programs.) |
fea681da MK |
99 | .IP o |
100 | (ELF only) If the executable file for the calling program | |
101 | contains a DT_RUNPATH tag, then the directories listed in that tag | |
102 | are searched. | |
103 | .IP o | |
104 | The cache file | |
0daa9e92 | 105 | .I /etc/ld.so.cache |
fea681da MK |
106 | (maintained by |
107 | .BR ldconfig (8)) | |
108 | is checked to see whether it contains an entry for | |
109 | .IR filename . | |
110 | .IP o | |
111 | The directories | |
c13182ef MK |
112 | .I /lib |
113 | and | |
114 | .I /usr/lib | |
fea681da MK |
115 | are searched (in that order). |
116 | .PP | |
117 | If the library has dependencies on other shared libraries, | |
118 | then these are also automatically loaded by the dynamic linker | |
c13182ef MK |
119 | using the same rules. |
120 | (This process may occur recursively, | |
fea681da MK |
121 | if those libraries in turn have dependencies, and so on.) |
122 | .PP | |
336e88f0 MK |
123 | One of the following two values must be included in |
124 | .IR flag : | |
125 | .TP | |
fea681da | 126 | .B RTLD_LAZY |
c13182ef | 127 | Perform lazy binding. |
a3a11667 | 128 | Only resolve symbols as the code that references them is executed. |
336e88f0 MK |
129 | If the symbol is never referenced, then it is never resolved. |
130 | (Lazy binding is only performed for function references; | |
131 | references to variables are always immediately bound when | |
132 | the library is loaded.) | |
133 | .TP | |
fea681da | 134 | .B RTLD_NOW |
336e88f0 | 135 | If this value is specified, or the environment variable |
fea681da | 136 | .B LD_BIND_NOW |
aa796481 | 137 | is set to a nonempty string, |
fea681da | 138 | all undefined symbols in the library are resolved before |
d355f1ed | 139 | .BR dlopen () |
c13182ef MK |
140 | returns. |
141 | If this cannot be done, an error is returned. | |
fea681da | 142 | .PP |
dfacdd0a | 143 | Zero or more of the following values may also be ORed in |
336e88f0 MK |
144 | .IR flag : |
145 | .TP | |
fea681da | 146 | .B RTLD_GLOBAL |
a3a11667 | 147 | The symbols defined by this library will be |
fea681da | 148 | made available for symbol resolution of subsequently loaded libraries. |
c13182ef | 149 | .TP |
336e88f0 | 150 | .B RTLD_LOCAL |
c13182ef | 151 | This is the converse of |
336e88f0 MK |
152 | .BR RTLD_GLOBAL , |
153 | and the default if neither flag is specified. | |
154 | Symbols defined in this library are not made available to resolve | |
155 | references in subsequently loaded libraries. | |
156 | .TP | |
c10859eb | 157 | .BR RTLD_NODELETE " (since glibc 2.2)" |
336e88f0 MK |
158 | Do not unload the library during |
159 | .BR dlclose (). | |
d9bfdb9c | 160 | Consequently, the library's static variables are not reinitialized |
c13182ef | 161 | if the library is reloaded with |
336e88f0 MK |
162 | .BR dlopen () |
163 | at a later time. | |
164 | This flag is not specified in POSIX.1-2001. | |
165 | .\" (But it is present on Solaris.) | |
166 | .TP | |
c10859eb | 167 | .BR RTLD_NOLOAD " (since glibc 2.2)" |
336e88f0 MK |
168 | Don't load the library. |
169 | This can be used to test if the library is already resident | |
170 | .RB ( dlopen () | |
171 | returns NULL if it is not, or the library's handle if it is resident). | |
c13182ef | 172 | This flag can also be used to promote the flags on a library |
336e88f0 MK |
173 | that is already loaded. |
174 | For example, a library that was previously loaded with | |
175 | .B RTLD_LOCAL | |
3b777aff | 176 | can be reopened with |
336e88f0 MK |
177 | .BR RTLD_NOLOAD\ |\ RTLD_GLOBAL . |
178 | This flag is not specified in POSIX.1-2001. | |
179 | .\" (But it is present on Solaris.) | |
180 | .\" | |
bba06189 MK |
181 | .TP |
182 | .BR RTLD_DEEPBIND " (since glibc 2.3.4)" | |
c13182ef | 183 | .\" Inimitably described by UD in |
a3a11667 | 184 | .\" http://sources.redhat.com/ml/libc-hacker/2004-09/msg00083.html. |
c13182ef MK |
185 | Place the lookup scope of the symbols in this |
186 | library ahead of the global scope. | |
187 | This means that a self-contained library will use | |
188 | its own symbols in preference to global symbols with the same name | |
bba06189 MK |
189 | contained in libraries that have already been loaded. |
190 | This flag is not specified in POSIX.1-2001. | |
fea681da MK |
191 | .PP |
192 | If | |
193 | .I filename | |
194 | is a NULL pointer, then the returned handle is for the main program. | |
195 | When given to | |
d355f1ed | 196 | .BR dlsym (), |
fea681da MK |
197 | this handle causes a search for a symbol in the main program, |
198 | followed by all shared libraries loaded at program startup, | |
c13182ef | 199 | and then all shared libraries loaded by |
d355f1ed | 200 | .BR dlopen () |
fea681da | 201 | with the flag |
a5e0a0e4 | 202 | .BR RTLD_GLOBAL . |
fea681da MK |
203 | .PP |
204 | External references in the library are resolved using the libraries | |
205 | in that library's dependency list and any other libraries previously | |
c13182ef | 206 | opened with the |
fea681da MK |
207 | .B RTLD_GLOBAL |
208 | flag. | |
2bc2f479 MK |
209 | If the executable was linked with the flag "\-rdynamic" |
210 | (or, synonymously, "\-\-export\-dynamic"), | |
fea681da MK |
211 | then the global symbols in the executable will also be used |
212 | to resolve references in a dynamically loaded library. | |
213 | .PP | |
214 | If the same library is loaded again with | |
d355f1ed | 215 | .BR dlopen (), |
c13182ef MK |
216 | the same file handle is returned. |
217 | The dl library maintains reference | |
fea681da MK |
218 | counts for library handles, so a dynamic library is not |
219 | deallocated until | |
d355f1ed | 220 | .BR dlclose () |
fea681da | 221 | has been called on it as many times as |
d355f1ed | 222 | .BR dlopen () |
c13182ef MK |
223 | has succeeded on it. |
224 | The | |
86100362 | 225 | .BR _init () |
c13182ef MK |
226 | routine, if present, is only called once. |
227 | But a subsequent call with | |
fea681da MK |
228 | .B RTLD_NOW |
229 | may force symbol resolution for a library earlier loaded with | |
230 | .BR RTLD_LAZY . | |
231 | .PP | |
232 | If | |
d355f1ed | 233 | .BR dlopen () |
fea681da | 234 | fails for any reason, it returns NULL. |
73d8cece | 235 | .SS dlsym() |
fea681da | 236 | The function |
d355f1ed | 237 | .BR dlsym () |
c13182ef | 238 | takes a "handle" of a dynamic library returned by |
28d88c17 MK |
239 | .BR dlopen () |
240 | and the | |
241 | null-terminated symbol name, returning the address where that symbol is | |
c13182ef MK |
242 | loaded into memory. |
243 | If the symbol is not found, in the specified | |
fea681da | 244 | library or any of the libraries that were automatically loaded by |
d355f1ed | 245 | .BR dlopen () |
fea681da | 246 | when that library was loaded, |
d355f1ed | 247 | .BR dlsym () |
fea681da MK |
248 | returns NULL. |
249 | (The search performed by | |
d355f1ed | 250 | .BR dlsym () |
fea681da MK |
251 | is breadth first through the dependency tree of these libraries.) |
252 | Since the value of the symbol could actually be NULL (so that a | |
253 | NULL return from | |
d355f1ed | 254 | .BR dlsym () |
fea681da MK |
255 | need not indicate an error), the correct way to test for an error |
256 | is to call | |
d355f1ed | 257 | .BR dlerror () |
fea681da | 258 | to clear any old error conditions, then call |
d355f1ed | 259 | .BR dlsym (), |
fea681da | 260 | and then call |
d355f1ed | 261 | .BR dlerror () |
fea681da MK |
262 | again, saving its return value into a variable, and check whether |
263 | this saved value is not NULL. | |
264 | .PP | |
265 | There are two special pseudo-handles, | |
266 | .B RTLD_DEFAULT | |
267 | and | |
268 | .BR RTLD_NEXT . | |
269 | The former will find the first occurrence of the desired symbol | |
c13182ef MK |
270 | using the default library search order. |
271 | The latter | |
fea681da | 272 | will find the next occurrence of a function in the search order |
c13182ef MK |
273 | after the current library. |
274 | This allows one to provide a wrapper | |
fea681da | 275 | around a function in another shared library. |
73d8cece | 276 | .SS dlclose() |
fea681da | 277 | The function |
d355f1ed | 278 | .BR dlclose () |
fea681da MK |
279 | decrements the reference count on the dynamic library handle |
280 | .IR handle . | |
281 | If the reference count drops to zero and no other loaded libraries use | |
282 | symbols in it, then the dynamic library is unloaded. | |
283 | .LP | |
284 | The function | |
d355f1ed | 285 | .BR dlclose () |
c7094399 | 286 | returns 0 on success, and nonzero on error. |
73d8cece | 287 | .SS The obsolete symbols _init() and _fini() |
fea681da MK |
288 | The linker recognizes special symbols |
289 | .B _init | |
290 | and | |
291 | .BR _fini . | |
292 | If a dynamic library exports a routine named | |
86100362 | 293 | .BR _init (), |
fea681da | 294 | then that code is executed after the loading, before |
d355f1ed | 295 | .BR dlopen () |
c13182ef MK |
296 | returns. |
297 | If the dynamic library exports a routine named | |
86100362 | 298 | .BR _fini (), |
fea681da | 299 | then that routine is called just before the library is unloaded. |
0425de01 | 300 | In case you need to avoid linking against the system startup files, |
86100362 MK |
301 | this can be done by using the |
302 | .BR gcc (1) | |
ea5a4ee4 | 303 | .I \-nostartfiles |
86100362 | 304 | command-line option. |
fea681da MK |
305 | .LP |
306 | Using these routines, or the gcc | |
f242322f | 307 | .B \-nostartfiles |
fea681da MK |
308 | or |
309 | .B \-nostdlib | |
c13182ef MK |
310 | options, is not recommended. |
311 | Their use may result in undesired behavior, | |
fea681da MK |
312 | since the constructor/destructor routines will not be executed |
313 | (unless special measures are taken). | |
314 | .\" void _init(void) __attribute__((constructor)); | |
315 | .\" void _fini(void) __attribute__((destructor)); | |
316 | .LP | |
317 | Instead, libraries should export routines using the | |
0daa9e92 | 318 | .B __attribute__((constructor)) |
fea681da | 319 | and |
0daa9e92 | 320 | .B __attribute__((destructor)) |
c13182ef MK |
321 | function attributes. |
322 | See the gcc info pages for information on these. | |
fea681da | 323 | Constructor routines are executed before |
e511ffb6 | 324 | .BR dlopen () |
fea681da | 325 | returns, and destructor routines are executed before |
e511ffb6 | 326 | .BR dlclose () |
fea681da | 327 | returns. |
7b1efcab | 328 | .SS Glibc extensions: dladdr() and dlvsym() |
fea681da MK |
329 | Glibc adds two functions not described by POSIX, with prototypes |
330 | .sp | |
331 | .nf | |
b80f966b | 332 | .BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */" |
fea681da MK |
333 | .B #include <dlfcn.h> |
334 | .sp | |
335 | .BI "int dladdr(void *" addr ", Dl_info *" info ); | |
336 | .sp | |
337 | .BI "void *dlvsym(void *" handle ", char *" symbol ", char *" version ); | |
338 | .fi | |
339 | .PP | |
340 | The function | |
d355f1ed | 341 | .BR dladdr () |
fea681da | 342 | takes a function pointer and tries to resolve name |
c13182ef MK |
343 | and file where it is located. |
344 | Information is stored in the | |
86100362 MK |
345 | .I Dl_info |
346 | structure: | |
fea681da | 347 | .sp |
088a639b | 348 | .in +4n |
fea681da MK |
349 | .nf |
350 | typedef struct { | |
5744c9e1 MK |
351 | const char *dli_fname; /* Pathname of shared object that |
352 | contains address */ | |
353 | void *dli_fbase; /* Address at which shared object | |
354 | is loaded */ | |
355 | const char *dli_sname; /* Name of nearest symbol with address | |
356 | lower than \fIaddr\fP */ | |
357 | void *dli_saddr; /* Exact address of symbol named | |
358 | in \fIdli_sname\fP */ | |
fea681da MK |
359 | } Dl_info; |
360 | .fi | |
86100362 | 361 | .in |
5744c9e1 MK |
362 | .PP |
363 | If no symbol matching | |
364 | .I addr | |
365 | could be found, then | |
366 | .I dli_sname | |
367 | and | |
368 | .I dli_saddr | |
369 | are set to NULL. | |
370 | .PP | |
d355f1ed | 371 | .BR dladdr () |
c7094399 | 372 | returns 0 on error, and nonzero on success. |
fea681da MK |
373 | .PP |
374 | The function | |
c343e74c MK |
375 | .BR dlvsym (), |
376 | provided by glibc since version 2.1, | |
fea681da | 377 | does the same as |
d355f1ed MK |
378 | .BR dlsym () |
379 | but takes a version string as an additional argument. | |
47297adb | 380 | .SH CONFORMING TO |
2b2581ee MK |
381 | POSIX.1-2001 describes |
382 | .BR dlclose (), | |
383 | .BR dlerror (), | |
384 | .BR dlopen (), | |
385 | and | |
386 | .BR dlsym (). | |
387 | .SH NOTES | |
097585ed MK |
388 | The symbols |
389 | .B RTLD_DEFAULT | |
390 | and | |
391 | .B RTLD_NEXT | |
392 | are defined by | |
2b2581ee | 393 | .I <dlfcn.h> |
c3dfd2c8 MK |
394 | only when |
395 | .B _GNU_SOURCE | |
396 | was defined before including it. | |
2b2581ee MK |
397 | .\" .LP |
398 | .\" The string returned by | |
399 | .\" .BR dlerror () | |
400 | .\" should not be modified. | |
401 | .\" Some systems give the prototype as | |
402 | .\" .sp | |
403 | .\" .in +5 | |
404 | .\" .B "const char *dlerror(void);" | |
405 | .\" .in | |
406 | ||
407 | Since glibc 2.2.3, | |
408 | .BR atexit (3) | |
409 | can be used to register an exit handler that is automatically | |
410 | called when a library is unloaded. | |
411 | .SS History | |
412 | The dlopen interface standard comes from SunOS. | |
413 | That system also has | |
414 | .BR dladdr (), | |
415 | but not | |
416 | .BR dlvsym (). | |
27a61e86 PB |
417 | .SH BUGS |
418 | Sometimes, the function pointers you pass to | |
419 | .BR dladdr () | |
420 | may surprise you. | |
421 | On some architectures (notably i386 and x86_64), | |
422 | .I dli_fname | |
423 | and | |
424 | .I dli_fbase | |
425 | may end up pointing back at the object from which you called | |
426 | .BR dladdr (), | |
427 | even if the function used as an argument should come from | |
428 | a dynamically linked library. | |
429 | .PP | |
430 | The problem is that the function pointer will still be resolved | |
431 | at compile time, but merely point to the | |
432 | .I plt | |
450c8386 | 433 | (Procedure Linkage Table) |
27a61e86 PB |
434 | section of the original object (which dispatches the call after |
435 | asking the dynamic linker to resolve the symbol). | |
450c8386 PB |
436 | To work around this, |
437 | you can try to compile the code to be position-independent: | |
1d2c48b3 | 438 | then, the compiler cannot prepare the pointer |
27a61e86 PB |
439 | at compile time anymore and today's |
440 | .BR gcc (1) | |
450c8386 PB |
441 | will generate code that just loads the final symbol address from the |
442 | .I got | |
27a61e86 PB |
443 | (Global Offset Table) at run time before passing it to |
444 | .BR dladdr (). | |
fea681da | 445 | .SH EXAMPLE |
9ff08aad | 446 | Load the math library, and print the cosine of 2.0: |
fea681da | 447 | .nf |
9ff08aad | 448 | |
fea681da | 449 | #include <stdio.h> |
b28f7a67 | 450 | #include <stdlib.h> |
fea681da MK |
451 | #include <dlfcn.h> |
452 | ||
c13182ef MK |
453 | int |
454 | main(int argc, char **argv) | |
cf0a9ace | 455 | { |
fea681da MK |
456 | void *handle; |
457 | double (*cosine)(double); | |
458 | char *error; | |
459 | ||
cf0a9ace | 460 | handle = dlopen("libm.so", RTLD_LAZY); |
fea681da | 461 | if (!handle) { |
31a6818e | 462 | fprintf(stderr, "%s\en", dlerror()); |
4c44ffe5 | 463 | exit(EXIT_FAILURE); |
fea681da MK |
464 | } |
465 | ||
466 | dlerror(); /* Clear any existing error */ | |
c73d7281 MK |
467 | |
468 | /* Writing: cosine = (double (*)(double)) dlsym(handle, "cos"); | |
680415af MK |
469 | would seem more natural, but the C99 standard leaves |
470 | casting from "void *" to a function pointer undefined. | |
29059a65 | 471 | The assignment used below is the POSIX.1\-2003 (Technical |
c73d7281 MK |
472 | Corrigendum 1) workaround; see the Rationale for the |
473 | POSIX specification of dlsym(). */ | |
474 | ||
fea681da | 475 | *(void **) (&cosine) = dlsym(handle, "cos"); |
680415af | 476 | .\" But in fact "gcc -O2 -Wall" will complain about the preceding cast. |
c73d7281 | 477 | |
fea681da | 478 | if ((error = dlerror()) != NULL) { |
31a6818e | 479 | fprintf(stderr, "%s\en", error); |
4c44ffe5 | 480 | exit(EXIT_FAILURE); |
fea681da MK |
481 | } |
482 | ||
31a6818e | 483 | printf("%f\en", (*cosine)(2.0)); |
fea681da | 484 | dlclose(handle); |
5bc8c34c | 485 | exit(EXIT_SUCCESS); |
fea681da | 486 | } |
fea681da | 487 | .fi |
fea681da MK |
488 | .PP |
489 | If this program were in a file named "foo.c", you would build the program | |
490 | with the following command: | |
a6e2f128 | 491 | .in +4n |
fea681da | 492 | .LP |
f4398177 | 493 | gcc \-rdynamic \-o foo foo.c \-ldl |
a6e2f128 | 494 | .in |
fea681da | 495 | .PP |
86100362 MK |
496 | Libraries exporting |
497 | .BR _init () | |
988db661 | 498 | and |
86100362 MK |
499 | .BR _fini () |
500 | will want to be compiled as | |
501 | follows, using \fIbar.c\fP as the example name: | |
a6e2f128 | 502 | .in +4n |
fea681da | 503 | .LP |
f4398177 | 504 | gcc \-shared \-nostartfiles \-o bar bar.c |
a6e2f128 | 505 | .in |
47297adb | 506 | .SH SEE ALSO |
fea681da MK |
507 | .BR ld (1), |
508 | .BR ldd (1), | |
509 | .BR dl_iterate_phdr (3), | |
c18ecec9 | 510 | .BR rtld-audit (7), |
fea681da | 511 | .BR ld.so (8), |
173fe7e7 DP |
512 | .BR ldconfig (8) |
513 | ||
fea681da | 514 | ld.so info pages, gcc info pages, ld info pages |