]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man3/dlopen.3
prctl.2: Simplify list of cases where "dumpable" attribute is reset
[thirdparty/man-pages.git] / man3 / dlopen.3
CommitLineData
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).
616c2730 4.\" and Copyright 2003, 2015 Michael Kerrisk <mtk.manpages@gmail.com>
fea681da 5.\"
1dd72f9c 6.\" %%%LICENSE_START(GPLv2+_DOC_FULL)
fea681da
MK
7.\" This is free documentation; you can redistribute it and/or
8.\" modify it under the terms of the GNU General Public License as
9.\" published by the Free Software Foundation; either version 2 of
10.\" the License, or (at your option) any later version.
11.\"
12.\" The GNU General Public License's references to "object code"
13.\" and "executables" are to be interpreted as the output of any
14.\" document formatting or typesetting system, including
15.\" intermediate and printed output.
16.\"
17.\" This manual is distributed in the hope that it will be useful,
18.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
19.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20.\" GNU General Public License for more details.
21.\"
22.\" You should have received a copy of the GNU General Public
c715f741
MK
23.\" License along with this manual; if not, see
24.\" <http://www.gnu.org/licenses/>.
6a8d8745 25.\" %%%LICENSE_END
fea681da
MK
26.\"
27.\" Modified by David A. Wheeler <dwheeler@dwheeler.com> 2000-11-28.
28.\" Applied patch by Terran Melconian, aeb, 2001-12-14.
29.\" Modified by Hacksaw <hacksaw@hacksaw.org> 2003-03-13.
30.\" Modified by Matt Domsch, 2003-04-09: _init and _fini obsolete
c11b1abf 31.\" Modified by Michael Kerrisk <mtk.manpages@gmail.com> 2003-05-16.
fea681da 32.\" Modified by Walter Harms: dladdr, dlvsym
27a61e86 33.\" Modified by Petr Baudis <pasky@suse.cz>, 2008-12-04: dladdr caveat
fea681da 34.\"
29b41e74 35.TH DLOPEN 3 2015-12-28 "Linux" "Linux Programmer's Manual"
fea681da 36.SH NAME
374b34d3
MK
37dlclose, dlopen, dlmopen \-
38open and close a shared object
fea681da
MK
39.SH SYNOPSIS
40.B #include <dlfcn.h>
41.sp
cf2789f1 42.BI "void *dlopen(const char *" filename ", int " flags );
fea681da 43.sp
fea681da 44.BI "int dlclose(void *" handle );
3f37321b 45.sp
3f4c09d0
MK
46.B #define _GNU_SOURCE
47.br
48.B #include <dlfcn.h>
49.sp
efdd68a5
MK
50.BI "void *dlmopen (Lmid_t " lmid ", const char *" filename ", int " flags );
51.sp
3f37321b 52Link with \fI\-ldl\fP.
fea681da 53.SH DESCRIPTION
73d8cece 54.SS dlopen()
fea681da 55The function
d355f1ed 56.BR dlopen ()
43151de3
MK
57loads the dynamic shared object (shared library)
58file named by the null-terminated
fea681da
MK
59string
60.I filename
43151de3 61and returns an opaque "handle" for the loaded object.
6ceba646
MK
62This handle is employed with other functions in the dlopen API, such as
63.BR dlsym (3),
64.BR dladdr (3),
65.BR dlinfo (3),
66and
67.BR dlclose ().
68
fea681da
MK
69If
70.I filename
6962fdf9
MK
71.\" FIXME On Solaris, when handle is NULL, we seem to get back
72.\" a handle for (something like) the root of the namespace.
73.\" The point here is that if we do a dlmopen(LM_ID_NEWLM), then
74.\" the filename==NULL case returns a different handle than
75.\" in the initial namespace. But, on glibc, the same handle is
76.\" returned. This is probably a bug in glibc.
77.\"
fea681da
MK
78is NULL, then the returned handle is for the main program.
79If
80.I filename
81contains a slash ("/"), then it is interpreted as a (relative
82or absolute) pathname.
43151de3 83Otherwise, the dynamic linker searches for the object as follows
fea681da
MK
84(see
85.BR ld.so (8)
86for further details):
86100362 87.IP o 4
fea681da
MK
88(ELF only) If the executable file for the calling program
89contains a DT_RPATH tag, and does not contain a DT_RUNPATH tag,
90then the directories listed in the DT_RPATH tag are searched.
91.IP o
65f6a3ee 92If, at the time that the program was started, the environment variable
0daa9e92 93.B LD_LIBRARY_PATH
65f6a3ee 94was defined to contain a colon-separated list of directories,
fea681da 95then these are searched.
8ac45f42 96(As a security measure, this variable is ignored for set-user-ID and
880f5b4b 97set-group-ID programs.)
fea681da
MK
98.IP o
99(ELF only) If the executable file for the calling program
100contains a DT_RUNPATH tag, then the directories listed in that tag
101are searched.
102.IP o
103The cache file
0daa9e92 104.I /etc/ld.so.cache
fea681da
MK
105(maintained by
106.BR ldconfig (8))
107is checked to see whether it contains an entry for
108.IR filename .
109.IP o
110The directories
c13182ef
MK
111.I /lib
112and
113.I /usr/lib
fea681da
MK
114are searched (in that order).
115.PP
43151de3
MK
116If the object specified by
117.I filename
118has dependencies on other shared objects,
fea681da 119then these are also automatically loaded by the dynamic linker
c13182ef
MK
120using the same rules.
121(This process may occur recursively,
43151de3 122if those objects in turn have dependencies, and so on.)
fea681da 123.PP
336e88f0 124One of the following two values must be included in
cf2789f1 125.IR flags :
336e88f0 126.TP
fea681da 127.B RTLD_LAZY
c13182ef 128Perform lazy binding.
a3a11667 129Only resolve symbols as the code that references them is executed.
336e88f0 130If the symbol is never referenced, then it is never resolved.
33a0ccb2 131(Lazy binding is performed only for function references;
336e88f0 132references to variables are always immediately bound when
43151de3 133the shared object is loaded.)
50008330
MK
134Since glibc 2.1.1,
135.\" commit 12b5b6b7f78ea111e89bbf638294a5413c791072
136this flag is overridden by the effect of the
137.B LD_BIND_NOW
138environment variable.
336e88f0 139.TP
fea681da 140.B RTLD_NOW
336e88f0 141If this value is specified, or the environment variable
fea681da 142.B LD_BIND_NOW
aa796481 143is set to a nonempty string,
43151de3 144all undefined symbols in the shared object are resolved before
d355f1ed 145.BR dlopen ()
c13182ef
MK
146returns.
147If this cannot be done, an error is returned.
fea681da 148.PP
dfacdd0a 149Zero or more of the following values may also be ORed in
cf2789f1 150.IR flags :
336e88f0 151.TP
fea681da 152.B RTLD_GLOBAL
43151de3 153The symbols defined by this shared object will be
fe854f15 154made available for symbol resolution of subsequently loaded shared objects.
c13182ef 155.TP
336e88f0 156.B RTLD_LOCAL
c13182ef 157This is the converse of
336e88f0
MK
158.BR RTLD_GLOBAL ,
159and the default if neither flag is specified.
43151de3
MK
160Symbols defined in this shared object are not made available to resolve
161references in subsequently loaded shared objects.
336e88f0 162.TP
c10859eb 163.BR RTLD_NODELETE " (since glibc 2.2)"
43151de3 164Do not unload the shared object during
336e88f0 165.BR dlclose ().
43151de3
MK
166Consequently, the object's static variables are not reinitialized
167if the object is reloaded with
336e88f0
MK
168.BR dlopen ()
169at a later time.
336e88f0 170.TP
c10859eb 171.BR RTLD_NOLOAD " (since glibc 2.2)"
43151de3
MK
172Don't load the shared object.
173This can be used to test if the object is already resident
336e88f0 174.RB ( dlopen ()
43151de3
MK
175returns NULL if it is not, or the object's handle if it is resident).
176This flag can also be used to promote the flags on a shared object
336e88f0 177that is already loaded.
43151de3 178For example, a shared object that was previously loaded with
336e88f0 179.B RTLD_LOCAL
3b777aff 180can be reopened with
336e88f0 181.BR RTLD_NOLOAD\ |\ RTLD_GLOBAL .
336e88f0 182.\"
bba06189
MK
183.TP
184.BR RTLD_DEEPBIND " (since glibc 2.3.4)"
c13182ef 185.\" Inimitably described by UD in
a3a11667 186.\" http://sources.redhat.com/ml/libc-hacker/2004-09/msg00083.html.
c13182ef 187Place the lookup scope of the symbols in this
43151de3
MK
188shared object ahead of the global scope.
189This means that a self-contained object will use
c13182ef 190its own symbols in preference to global symbols with the same name
43151de3 191contained in objects that have already been loaded.
fea681da
MK
192.PP
193If
194.I filename
b437fdd9 195is NULL, then the returned handle is for the main program.
fea681da 196When given to
d355f1ed 197.BR dlsym (),
fea681da 198this handle causes a search for a symbol in the main program,
43151de3
MK
199followed by all shared objects loaded at program startup,
200and then all shared objects loaded by
d355f1ed 201.BR dlopen ()
fea681da 202with the flag
a5e0a0e4 203.BR RTLD_GLOBAL .
fea681da 204.PP
43151de3
MK
205External references in the shared object are resolved using the
206shared objects in that object's dependency list and any other
207objects previously opened with the
fea681da
MK
208.B RTLD_GLOBAL
209flag.
2bc2f479
MK
210If the executable was linked with the flag "\-rdynamic"
211(or, synonymously, "\-\-export\-dynamic"),
fea681da 212then the global symbols in the executable will also be used
43151de3 213to resolve references in a dynamically loaded shared object.
fea681da 214.PP
43151de3 215If the same shared object is loaded again with
d355f1ed 216.BR dlopen (),
43151de3 217the same object handle is returned.
e83ed17d 218The dynamic linker maintains reference
43151de3 219counts for object handles, so a dynamically loaded shared object is not
fea681da 220deallocated until
d355f1ed 221.BR dlclose ()
fea681da 222has been called on it as many times as
d355f1ed 223.BR dlopen ()
c13182ef 224has succeeded on it.
c7c01315 225Any initialization returns (see below) are called just once.
b6779d1d
MK
226However, a subsequent
227.BR dlopen ()
228call that loads the same shared object with
fea681da 229.B RTLD_NOW
9c169754 230may force symbol resolution for a shared object earlier loaded with
fea681da
MK
231.BR RTLD_LAZY .
232.PP
233If
d355f1ed 234.BR dlopen ()
fea681da 235fails for any reason, it returns NULL.
9c169754 236.\"
efdd68a5
MK
237.SS dlmopen()
238This function performs the same task as
239.BR dlopen ()\(emthe
240.I filename
241and
242.I flags
65175b1d
MK
243arguments, as well as the return value, are the same,
244except for the differences noted below.
245
246The
247.BR dlmopen ()
248function differs from
249.BR dlopen ()
250primarily in that it accepts an additional argument,
efdd68a5 251.IR lmid ,
9c169754
MK
252that specifies the link-map list (also referred to as a
253.IR namespace )
254in which the shared object should be loaded.
efdd68a5
MK
255(By comparison,
256.BR dlopen ()
9c169754 257adds the dynamically loaded shared object to the same namespace as
efdd68a5
MK
258the shared object from which the
259.BR dlopen ()
260call is made.)
9c169754
MK
261The
262.I Lmid_t
263type is an opaque handle that refers to a namespace.
efdd68a5
MK
264
265The
266.I lmid
9c169754 267argument is either the ID of an existing namespace
efdd68a5
MK
268.\" FIXME: Is using dlinfo() RTLD_DI_LMID the right technique?
269(which can be obtained using the
270.BR dlinfo (3)
271.B RTLD_DI_LMID
272request) or one of the following special values:
273.TP
274.B LM_ID_BASE
9c169754
MK
275Load the shared object in the initial namespace
276(i.e., the application's namespace).
efdd68a5
MK
277.TP
278.B LM_ID_NEWLM
9c169754 279Create a new namespace and load the shared object in that namespace.
982eac0d 280The object must have been correctly linked
9c169754
MK
281to reference all of the other shared objects that it requires,
282since the new namespace is initially empty.
65175b1d 283.PP
65175b1d 284If
438168a2 285.I filename
65175b1d
MK
286is NULL, then the only permitted value for
287.I lmid
288is
289.BR LM_ID_BASE .
73d8cece 290.SS dlclose()
fea681da 291The function
d355f1ed 292.BR dlclose ()
43151de3
MK
293decrements the reference count on the
294dynamically loaded shared object referred to by
fea681da 295.IR handle .
4a1af09b 296If the reference count drops to zero,
43151de3 297then the object is unloaded.
cc2ddf2f
MK
298All shared objects that were automatically loaded when
299.BR dlopen ()
300was invoked on the object referred to by
301.I handle
302are recursively closed in the same manner.
747b2b0a
MK
303
304A successful return from
305.BR dlclose ()
306does not guarantee that the symbols associated with
307.I handle
308are removed from the caller's address space.
309In addition to references resulting from explicit
310.BR dlopen ()
311calls, a shared object may have been implicitly loaded
312(and reference counted) because of dependencies in other shared objects.
313Only when all references have been released can the shared object
314be removed from the address space.
982eac0d
MK
315.SH RETURN VALUE
316On success,
317.BR dlopen ()
318and
319.BR dlmopen ()
320return a non-NULL handle for the loaded library.
321On error
322(file could not be found, was not readable, had the wrong format,
323or caused errors during loading),
324these functions return NULL.
325
326On success,
d355f1ed 327.BR dlclose ()
9ebcbe13 328returns 0; on error, it returns a nonzero value.
982eac0d
MK
329
330Errors from these functions can be diagnosed using
331.BR dlerror (3).
6445992d 332.SH VERSIONS
374b34d3 333.BR dlopen ()
6445992d 334and
374b34d3 335.BR dlclose ()
6445992d 336are present in glibc 2.0 and later.
efdd68a5
MK
337.BR dlmopen ()
338first appeared in glibc 2.3.4.
b23510e5
MK
339.SH ATTRIBUTES
340For an explanation of the terms used in this section, see
341.BR attributes (7).
342.TS
343allbox;
344lbw30 lb lb
345l l l.
346Interface Attribute Value
347T{
348.BR dlopen (),
349.BR dlmopen (),
350.BR dlclose ()
351T} Thread safety MT-Safe
352.TE
47297adb 353.SH CONFORMING TO
2b2581ee 354POSIX.1-2001 describes
374b34d3 355.BR dlclose ()
2b2581ee 356and
896c71d0 357.BR dlopen ().
3f4c09d0 358The
efdd68a5 359.BR dlmopen ()
896c71d0 360function is a GNU extension.
e8a1758c
MK
361
362The
363.BR RTLD_NOLOAD ,
364.BR RTLD_NODELETE ,
365and
1a08b97b 366.BR RTLD_DEEPBIND
e8a1758c
MK
367flags are GNU extensions;
368the first two of these flags are also present on Solaris.
2b2581ee 369.SH NOTES
9c169754
MK
370.SS dlmopen() and namespaces
371A link-map list defines an isolated namespace for the
372resolution of symbols by the dynamic linker.
373Within a namespace,
374dependent shared objects are implicitly loaded according to the usual rules,
375and symbol references are likewise resolved according to the usual rules,
376but such resolution is confined to the definitions provided by the
377objects that have been (explicitly and implicitly) loaded into the namespace.
378
379The
380.BR dlmopen ()
381function permits object-load isolation\(emthe ability
382to load a shared object in a new namespace without
383exposing the rest of the application to the symbols
384made available by the new object.
385Note that the use of the
386.B RTLD_LOCAL
387flag is not sufficient for this purpose,
388since it prevents a shared object's symbols from being available to
389.I any
390other shared object.
391In some cases,
392we may want to make the symbols provided by a dynamically
43151de3 393loaded shared object available to (a subset of) other shared objects
9c169754 394without exposing those symbols to the entire application.
982eac0d
MK
395This can be achieved by using a separate namespace and the
396.B RTLD_GLOBAL
397flag.
9c169754 398
0fdbc114
MK
399The
400.BR dlmopen ()
401function also can be used to provide better isolation than the
402.BR RTLD_LOCAL
403flag.
8dbd75b8 404In particular, shared objects loaded with
0fdbc114
MK
405.BR RTLD_LOCAL
406may be promoted to
407.BR RTLD_GLOBAL
408if they are dependencies of another shared object loaded with
409.BR RTLD_GLOBAL .
410Thus,
411.BR RTLD_LOCAL
412is insufficient to isolate a loaded shared object except in the (uncommon)
413case where one has explicit control over all shared object dependencies.
414
9c169754
MK
415Possible uses of
416.BR dlmopen ()
417are plugins where the author of the plugin-loading framework
418can't trust the plugin authors and does not wish
419any undefined symbols from the plugin framework to be resolved to plugin
420symbols.
421Another use is to load the same object more than once.
422Without the use of
982eac0d 423.BR dlmopen (),
9c169754
MK
424this would require the creation of distinct copies of the shared object file.
425Using
982eac0d 426.BR dlmopen (),
9c169754
MK
427this can be achieved by loading the same shared object file into
428different namespaces.
982eac0d
MK
429
430The glibc implementation supports a maximum of
431.\" DL_NNS
43216 namespaces.
9c169754 433.\"
c7c01315
MK
434.SS Initialization and finalization functions
435Shared objects may export functions using the
436.B __attribute__((constructor))
437and
438.B __attribute__((destructor))
439function attributes.
440Constructor functions are executed before
441.BR dlopen ()
442returns, and destructor functions are executed before
443.BR dlclose ()
444returns.
445A shared object may export multiple constructors and destructors,
446and priorities can be associated with each function
447to determine the order in which they are executed.
448See the
449.BR gcc
450info pages (under "Function attributes")
451.\" info gcc "C Extensions" "Function attributes"
452for further information.
453
454An older method of (partially) achieving the same result is via the use of
455two special symbols recognized by the linker:
e8290357
MK
456.B _init
457and
458.BR _fini .
459If a dynamically loaded shared object exports a routine named
460.BR _init (),
c7c01315 461then that code is executed after loading a shared object, before
e8290357
MK
462.BR dlopen ()
463returns.
464If the shared object exports a routine named
465.BR _fini (),
466then that routine is called just before the object is unloaded.
c7c01315
MK
467In this case, one must avoid linking against the system startup files,
468which contain default versions of these files;
e8290357
MK
469this can be done by using the
470.BR gcc (1)
471.I \-nostartfiles
472command-line option.
473.LP
c7c01315
MK
474Use of
475.B _init
e8290357 476and
c7c01315
MK
477.BR _fini
478is now deprecated in favor of the aforementioned
479constructors and destructors,
480which among other advantages,
481permit multiple initialization and finalization functions to be defined.
482.\"
483.\" Using these routines, or the gcc
484.\" .B \-nostartfiles
485.\" or
486.\" .B \-nostdlib
487.\" options, is not recommended.
488.\" Their use may result in undesired behavior,
489.\" since the constructor/destructor routines will not be executed
490.\" (unless special measures are taken).
491.\" .\" void _init(void) __attribute__((constructor));
492.\" .\" void _fini(void) __attribute__((destructor));
e8290357 493.\"
b198e0ae
MK
494
495Since glibc 2.2.3,
496.BR atexit (3)
497can be used to register an exit handler that is automatically
498called when a shared object is unloaded.
2b2581ee 499.SS History
896c71d0 500These functions are part of the dlopen API, derived from SunOS.
82bd66b8
MK
501.SH BUGS
502As at glibc 2.21, specifying the
503.BR RTLD_GLOBAL
504flag when calling
505.BR dlmopen ()
506.\" dlerror(): "invalid mode"
507generates an error.
508Furthermore, specifying
509.BR RTLD_GLOBAL
510when calling
511.BR dlopen ()
512results in a program crash
513.RB ( SIGSEGV )
514if the call is made from any object loaded in a
515namespace other than the initial namespace.
fea681da 516.SH EXAMPLE
2e056718
MK
517The program below loads the (glibc) math library,
518looks up the address of the
519.BR cos (3)
520function, and prints the cosine of 2.0.
521The following is an example of building and running the program:
522
523.in +4n
524.nf
525$ \fBcc dlopen_demo.c \-ldl\fP
526$ \fB./a.out\fP
527\-0.416147
528.fi
529.in
530.SS Program source
fea681da 531.nf
9ff08aad 532
fea681da 533#include <stdio.h>
b28f7a67 534#include <stdlib.h>
fea681da 535#include <dlfcn.h>
b44cf4bc
MK
536#include <gnu/lib-names.h> /* Defines LIBM_SO (which will be a
537 string such as "libm.so.6") */
c13182ef 538int
4373ccc0 539main(void)
cf0a9ace 540{
fea681da
MK
541 void *handle;
542 double (*cosine)(double);
543 char *error;
544
b44cf4bc 545 handle = dlopen(LIBM_SO, RTLD_LAZY);
fea681da 546 if (!handle) {
31a6818e 547 fprintf(stderr, "%s\en", dlerror());
4c44ffe5 548 exit(EXIT_FAILURE);
fea681da
MK
549 }
550
551 dlerror(); /* Clear any existing error */
c73d7281 552
29965345 553 cosine = (double (*)(double)) dlsym(handle, "cos");
c73d7281 554
daf28a2b 555 /* According to the ISO C standard, casting between function
4318a7d0
MK
556 pointers and 'void *', as done above, produces undefined results.
557 POSIX.1-2003 and POSIX.1-2008 accepted this state of affairs and
558 proposed the following workaround:
29965345
MK
559
560 *(void **) (&cosine) = dlsym(handle, "cos");
561
4318a7d0
MK
562 This (clumsy) cast conforms with the ISO C standard and will
563 avoid any compiler warnings.
29965345 564
daf28a2b
MK
565 The 2013 Technical Corrigendum to POSIX.1-2008 (a.k.a.
566 POSIX.1-2013) improved matters by requiring that conforming
567 implementations support casting 'void *' to a function pointer.
568 Nevertheless, some compilers (e.g., gcc with the '-pedantic'
569 option) may complain about the cast used in this program. */
570.\" http://pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html#tag_03_112_08
571.\" http://pubs.opengroup.org/onlinepubs/9699919799/functions/dlsym.html#tag_16_96_07
5e0622ba 572.\" http://austingroupbugs.net/view.php?id=74
c73d7281 573
aefd6f89 574 error = dlerror();
3487d63b 575 if (error != NULL) {
31a6818e 576 fprintf(stderr, "%s\en", error);
4c44ffe5 577 exit(EXIT_FAILURE);
fea681da
MK
578 }
579
31a6818e 580 printf("%f\en", (*cosine)(2.0));
fea681da 581 dlclose(handle);
5bc8c34c 582 exit(EXIT_SUCCESS);
fea681da 583}
fea681da 584.fi
47297adb 585.SH SEE ALSO
fea681da
MK
586.BR ld (1),
587.BR ldd (1),
5d95b7d8 588.BR pldd (1),
fea681da 589.BR dl_iterate_phdr (3),
6c46d3bc 590.BR dladdr (3),
374b34d3 591.BR dlerror (3),
46db2df1 592.BR dlinfo (3),
896c71d0 593.BR dlsym (3),
c18ecec9 594.BR rtld-audit (7),
fea681da 595.BR ld.so (8),
173fe7e7
DP
596.BR ldconfig (8)
597
7e936c29 598gcc info pages, ld info pages