1645c4be3SJohn Polstra.\" This source code is a product of Sun Microsystems, Inc. and is provided 2645c4be3SJohn Polstra.\" for unrestricted use provided that this legend is included on all tape 3645c4be3SJohn Polstra.\" media and as a part of the software program in whole or part. Users 4645c4be3SJohn Polstra.\" may copy or modify this source code without charge, but are not authorized 5645c4be3SJohn Polstra.\" to license or distribute it to anyone else except as part of a product or 6645c4be3SJohn Polstra.\" program developed by the user. 7645c4be3SJohn Polstra.\" 8645c4be3SJohn Polstra.\" THIS PROGRAM CONTAINS SOURCE CODE COPYRIGHTED BY SUN MICROSYSTEMS, INC. 9645c4be3SJohn Polstra.\" SUN MICROSYSTEMS, INC., MAKES NO REPRESENTATIONS ABOUT THE SUITABLITY 10645c4be3SJohn Polstra.\" OF SUCH SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT 11645c4be3SJohn Polstra.\" EXPRESS OR IMPLIED WARRANTY OF ANY KIND. SUN MICROSYSTEMS, INC. DISCLAIMS 12645c4be3SJohn Polstra.\" ALL WARRANTIES WITH REGARD TO SUCH SOURCE CODE, INCLUDING ALL IMPLIED 13645c4be3SJohn Polstra.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN 14645c4be3SJohn Polstra.\" NO EVENT SHALL SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT, 15645c4be3SJohn Polstra.\" INCIDENTAL, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 16645c4be3SJohn Polstra.\" FROM USE OF SUCH SOURCE CODE, REGARDLESS OF THE THEORY OF LIABILITY. 17645c4be3SJohn Polstra.\" 18645c4be3SJohn Polstra.\" This source code is provided with no support and without any obligation on 19645c4be3SJohn Polstra.\" the part of Sun Microsystems, Inc. to assist in its use, correction, 20645c4be3SJohn Polstra.\" modification or enhancement. 21645c4be3SJohn Polstra.\" 22645c4be3SJohn Polstra.\" SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 23645c4be3SJohn Polstra.\" INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS 24645c4be3SJohn Polstra.\" SOURCE CODE OR ANY PART THEREOF. 25645c4be3SJohn Polstra.\" 26645c4be3SJohn Polstra.\" Sun Microsystems, Inc. 27645c4be3SJohn Polstra.\" 2550 Garcia Avenue 28645c4be3SJohn Polstra.\" Mountain View, California 94043 29645c4be3SJohn Polstra.\" 30645c4be3SJohn Polstra.\" Copyright (c) 1991 Sun Microsystems, Inc. 31645c4be3SJohn Polstra.\" 32645c4be3SJohn Polstra.\" @(#) dlopen.3 1.6 90/01/31 SMI 337f3dea24SPeter Wemm.\" $FreeBSD$ 34fbc400a6SNik Clayton.\" 35a4a96c81SMike Barcroft.Dd September 10, 2002 36a307d598SRuslan Ermilov.Os 37645c4be3SJohn Polstra.Dt DLOPEN 3 38645c4be3SJohn Polstra.Sh NAME 397ec37597SAlexey Zelkin.Nm dlopen , 407ec37597SAlexey Zelkin.Nm dlsym , 417ec37597SAlexey Zelkin.Nm dlfunc , 427ec37597SAlexey Zelkin.Nm dlerror , 437ec37597SAlexey Zelkin.Nm dlclose 44645c4be3SJohn Polstra.Nd programmatic interface to the dynamic linker 4525bb73e0SAlexey Zelkin.Sh LIBRARY 4625bb73e0SAlexey Zelkin.Lb libc 47645c4be3SJohn Polstra.Sh SYNOPSIS 4832eef9aeSRuslan Ermilov.In dlfcn.h 49645c4be3SJohn Polstra.Ft void * 50645c4be3SJohn Polstra.Fn dlopen "const char *path" "int mode" 51645c4be3SJohn Polstra.Ft void * 52a4a96c81SMike Barcroft.Fn dlsym "void * restrict handle" "const char * restrict symbol" 53fda23019SGarrett Wollman.Ft dlfunc_t 54a4a96c81SMike Barcroft.Fn dlfunc "void * restrict handle" "const char * restrict symbol" 55645c4be3SJohn Polstra.Ft const char * 56645c4be3SJohn Polstra.Fn dlerror "void" 57645c4be3SJohn Polstra.Ft int 58645c4be3SJohn Polstra.Fn dlclose "void *handle" 59645c4be3SJohn Polstra.Sh DESCRIPTION 60645c4be3SJohn PolstraThese functions provide a simple programmatic interface to the services of the 61645c4be3SJohn Polstradynamic linker. 62645c4be3SJohn PolstraOperations are provided to add new shared objects to a 63645c4be3SJohn Polstraprogram's address space, to obtain the address bindings of symbols 64645c4be3SJohn Polstradefined by such 65645c4be3SJohn Polstraobjects, and to remove such objects when their use is no longer required. 66645c4be3SJohn Polstra.Pp 6795f4226bSRuslan ErmilovThe 68645c4be3SJohn Polstra.Fn dlopen 6995f4226bSRuslan Ermilovfunction 70645c4be3SJohn Polstraprovides access to the shared object in 71645c4be3SJohn Polstra.Fa path , 72645c4be3SJohn Polstrareturning a descriptor that can be used for later 73645c4be3SJohn Polstrareferences to the object in calls to 74645c4be3SJohn Polstra.Fn dlsym 75645c4be3SJohn Polstraand 76645c4be3SJohn Polstra.Fn dlclose . 77645c4be3SJohn PolstraIf 78645c4be3SJohn Polstra.Fa path 79645c4be3SJohn Polstrawas not in the address space prior to the call to 80645c4be3SJohn Polstra.Fn dlopen , 81645c4be3SJohn Polstrait is placed in the address space. 82645c4be3SJohn PolstraWhen an object is first loaded into the address space in this way, its 83645c4be3SJohn Polstrafunction 84645c4be3SJohn Polstra.Fn _init , 85645c4be3SJohn Polstraif any, is called by the dynamic linker. 86645c4be3SJohn PolstraIf 87645c4be3SJohn Polstra.Fa path 88645c4be3SJohn Polstrahas already been placed in the address space in a previous call to 89645c4be3SJohn Polstra.Fn dlopen , 90645c4be3SJohn Polstrait is not added a second time, although a reference count of 91645c4be3SJohn Polstra.Fn dlopen 92645c4be3SJohn Polstraoperations on 93645c4be3SJohn Polstra.Fa path 94645c4be3SJohn Polstrais maintained. 95645c4be3SJohn PolstraA null pointer supplied for 96645c4be3SJohn Polstra.Fa path 97645c4be3SJohn Polstrais interpreted as a reference to the main 98645c4be3SJohn Polstraexecutable of the process. 992efeeba5SRuslan ErmilovThe 100645c4be3SJohn Polstra.Fa mode 1012efeeba5SRuslan Ermilovargument 102645c4be3SJohn Polstracontrols the way in which external function references from the 103645c4be3SJohn Polstraloaded object are bound to their referents. 10407f643a5SJohn PolstraIt must contain one of the following values, possibly ORed with 10507f643a5SJohn Polstraadditional flags which will be described subsequently: 106645c4be3SJohn Polstra.Bl -tag -width RTLD_LAZYX 107645c4be3SJohn Polstra.It Dv RTLD_LAZY 108645c4be3SJohn PolstraEach external function reference is resolved when the function is first 109645c4be3SJohn Polstracalled. 110645c4be3SJohn Polstra.It Dv RTLD_NOW 111645c4be3SJohn PolstraAll external function references are bound immediately by 112645c4be3SJohn Polstra.Fn dlopen . 113645c4be3SJohn Polstra.El 114645c4be3SJohn Polstra.Pp 115645c4be3SJohn Polstra.Dv RTLD_LAZY 116645c4be3SJohn Polstrais normally preferred, for reasons of efficiency. 117645c4be3SJohn PolstraHowever, 118645c4be3SJohn Polstra.Dv RTLD_NOW 119645c4be3SJohn Polstrais useful to ensure that any undefined symbols are discovered during the 120645c4be3SJohn Polstracall to 121645c4be3SJohn Polstra.Fn dlopen . 12207f643a5SJohn Polstra.Pp 12307f643a5SJohn PolstraOne of the following flags may be ORed into the 12407f643a5SJohn Polstra.Fa mode 12507f643a5SJohn Polstraargument: 12607f643a5SJohn Polstra.Bl -tag -width RTLD_GLOBALX 12707f643a5SJohn Polstra.It Dv RTLD_GLOBAL 12807f643a5SJohn PolstraSymbols from this shared object and its directed acyclic graph (DAG) 12907f643a5SJohn Polstraof needed objects will be available for resolving undefined references 13007f643a5SJohn Polstrafrom all other shared objects. 13107f643a5SJohn Polstra.It Dv RTLD_LOCAL 13207f643a5SJohn PolstraSymbols in this shared object and its DAG of needed objects will be 13307f643a5SJohn Polstraavailable for resolving undefined references only from other objects 134760d9686SRuslan Ermilovin the same DAG. 135760d9686SRuslan ErmilovThis is the default, but it may be specified 13607f643a5SJohn Polstraexplicitly with this flag. 137c6de4ce7SMaxim Sobolev.It Dv RTLD_TRACE 138c6de4ce7SMaxim SobolevWhen set, causes dynamic linker to exit after loading all objects 139c6de4ce7SMaxim Sobolevneeded by this shared object and printing a summary which includes 140c6de4ce7SMaxim Sobolevthe absolute pathnames of all objects, to standard output. 141c6de4ce7SMaxim SobolevWith this flag 142c6de4ce7SMaxim Sobolev.Fn dlopen 143c6de4ce7SMaxim Sobolevwill return to the caller only in the case of error. 14407f643a5SJohn Polstra.El 14507f643a5SJohn Polstra.Pp 146645c4be3SJohn PolstraIf 147645c4be3SJohn Polstra.Fn dlopen 148645c4be3SJohn Polstrafails, it returns a null pointer, and sets an error condition which may 149645c4be3SJohn Polstrabe interrogated with 150645c4be3SJohn Polstra.Fn dlerror . 151645c4be3SJohn Polstra.Pp 15295f4226bSRuslan ErmilovThe 153645c4be3SJohn Polstra.Fn dlsym 15495f4226bSRuslan Ermilovfunction 155645c4be3SJohn Polstrareturns the address binding of the symbol described in the null-terminated 156645c4be3SJohn Polstracharacter string 157645c4be3SJohn Polstra.Fa symbol , 158645c4be3SJohn Polstraas it occurs in the shared object identified by 159645c4be3SJohn Polstra.Fa handle . 160645c4be3SJohn PolstraThe symbols exported by objects added to the address space by 161645c4be3SJohn Polstra.Fn dlopen 162645c4be3SJohn Polstracan be accessed only through calls to 163645c4be3SJohn Polstra.Fn dlsym . 164645c4be3SJohn PolstraSuch symbols do not supersede any definition of those symbols already present 165645c4be3SJohn Polstrain the address space when the object is loaded, nor are they available to 166645c4be3SJohn Polstrasatisfy normal dynamic linking references. 1677f244df8SJohn Polstra.Pp 1687f244df8SJohn PolstraIf 1697f244df8SJohn Polstra.Fn dlsym 1707f244df8SJohn Polstrais called with the special 171645c4be3SJohn Polstra.Fa handle 1727f244df8SJohn Polstra.Dv NULL , 1737f244df8SJohn Polstrait is interpreted as a reference to the executable or shared object 1747f244df8SJohn Polstrafrom which the call 175760d9686SRuslan Ermilovis being made. 176760d9686SRuslan ErmilovThus a shared object can reference its own symbols. 1777f244df8SJohn Polstra.Pp 1787f244df8SJohn PolstraIf 179645c4be3SJohn Polstra.Fn dlsym 1807f244df8SJohn Polstrais called with the special 1817f244df8SJohn Polstra.Fa handle 1827f244df8SJohn Polstra.Dv RTLD_DEFAULT , 1837f244df8SJohn Polstrathe search for the symbol follows the algorithm used for resolving 184760d9686SRuslan Ermilovundefined symbols when objects are loaded. 185760d9686SRuslan ErmilovThe objects searched are 1867f244df8SJohn Polstraas follows, in the given order: 1877f244df8SJohn Polstra.Bl -enum 1887f244df8SJohn Polstra.It 1897f244df8SJohn PolstraThe referencing object itself (or the object from which the call to 1907f244df8SJohn Polstra.Fn dlsym 1917f244df8SJohn Polstrais made), if that object was linked using the 1927f244df8SJohn Polstra.Fl Wsymbolic 1937f244df8SJohn Polstraoption to 1947f244df8SJohn Polstra.Xr ld 1 . 1957f244df8SJohn Polstra.It 1967f244df8SJohn PolstraAll objects loaded at program start-up. 1977f244df8SJohn Polstra.It 1987f244df8SJohn PolstraAll objects loaded via 1997f244df8SJohn Polstra.Fn dlopen 2007f244df8SJohn Polstrawhich are in needed-object DAGs that also contain the referencing object. 2017f244df8SJohn Polstra.It 2027f244df8SJohn PolstraAll objects loaded via 2037f244df8SJohn Polstra.Fn dlopen 2047f244df8SJohn Polstrawith the 2057f244df8SJohn Polstra.Dv RTLD_GLOBAL 2067f244df8SJohn Polstraflag set in the 2077f244df8SJohn Polstra.Fa mode 2087f244df8SJohn Polstraargument. 2097f244df8SJohn Polstra.El 210645c4be3SJohn Polstra.Pp 211645c4be3SJohn PolstraIf 212645c4be3SJohn Polstra.Fn dlsym 213645c4be3SJohn Polstrais called with the special 214645c4be3SJohn Polstra.Fa handle 215645c4be3SJohn Polstra.Dv RTLD_NEXT , 216645c4be3SJohn Polstrathen the search for the symbol is limited to the shared objects 217645c4be3SJohn Polstrawhich were loaded after the one issuing the call to 218645c4be3SJohn Polstra.Fn dlsym . 219645c4be3SJohn PolstraThus, if the function is called from the main program, all 220645c4be3SJohn Polstrathe shared libraries are searched. 221645c4be3SJohn PolstraIf it is called from a shared library, all subsequent shared 222645c4be3SJohn Polstralibraries are searched. 223645c4be3SJohn Polstra.Dv RTLD_NEXT 224645c4be3SJohn Polstrais useful for implementing wrappers around library functions. 225645c4be3SJohn PolstraFor example, a wrapper function 226645c4be3SJohn Polstra.Fn getpid 227645c4be3SJohn Polstracould access the 228645c4be3SJohn Polstra.Dq real 229645c4be3SJohn Polstra.Fn getpid 230645c4be3SJohn Polstrawith 231c786c636SJoerg Wunsch.Li dlsym(RTLD_NEXT, \&"getpid\&") . 232dc12134aSGarrett Wollman(Actually, the 233dc12134aSGarrett Wollman.Fn dlfunc 234dc12134aSGarrett Wollmaninterface, below, should be used, since 235dc12134aSGarrett Wollman.Fn getpid 236dc12134aSGarrett Wollmanis a function and not a data object.) 237645c4be3SJohn Polstra.Pp 2387ec37597SAlexey ZelkinIf 2397ec37597SAlexey Zelkin.Fn dlsym 2407ec37597SAlexey Zelkinis called with the special 2417ec37597SAlexey Zelkin.Fa handle 2427ec37597SAlexey Zelkin.Dv RTLD_SELF , 2437ec37597SAlexey Zelkinthen the search for the symbol is limited to the shared object 2447ec37597SAlexey Zelkinissuing the call to 2457ec37597SAlexey Zelkin.Fn dlsym 2467ec37597SAlexey Zelkinand those shared objects which were loaded after it. 2477ec37597SAlexey Zelkin.Pp 24895f4226bSRuslan ErmilovThe 2497f244df8SJohn Polstra.Fn dlsym 25095f4226bSRuslan Ermilovfunction 2517f244df8SJohn Polstrareturns a null pointer if the symbol cannot be found, and sets an error 2527f244df8SJohn Polstracondition which may be queried with 2537f244df8SJohn Polstra.Fn dlerror . 2547f244df8SJohn Polstra.Pp 25595f4226bSRuslan ErmilovThe 256dc12134aSGarrett Wollman.Fn dlfunc 25795f4226bSRuslan Ermilovfunction 258dc12134aSGarrett Wollmanimplements all of the behavior of 259dc12134aSGarrett Wollman.Fn dlsym , 260dc12134aSGarrett Wollmanbut has a return type which can be cast to a function pointer without 261dc12134aSGarrett Wollmantriggering compiler diagnostics. 26295f4226bSRuslan Ermilov(The 26395f4226bSRuslan Ermilov.Fn dlsym 26495f4226bSRuslan Ermilovfunction 265dc12134aSGarrett Wollmanreturns a data pointer; in the C standard, conversions between 266760d9686SRuslan Ermilovdata and function pointer types are undefined. 267760d9686SRuslan ErmilovSome compilers and 268dc12134aSGarrett Wollman.Xr lint 1 269760d9686SRuslan Ermilovutilities warn about such casts.) 270dc12134aSGarrett WollmanThe precise return type of 271dc12134aSGarrett Wollman.Fn dlfunc 272dc12134aSGarrett Wollmanis unspecified; applications must cast it to an appropriate function pointer 273dc12134aSGarrett Wollmantype. 274dc12134aSGarrett Wollman.Pp 27595f4226bSRuslan ErmilovThe 276645c4be3SJohn Polstra.Fn dlerror 27795f4226bSRuslan Ermilovfunction 278645c4be3SJohn Polstrareturns a null-terminated character string describing the last error that 279645c4be3SJohn Polstraoccurred during a call to 280645c4be3SJohn Polstra.Fn dlopen , 281645c4be3SJohn Polstra.Fn dlsym , 282dc12134aSGarrett Wollman.Fn dlfunc , 283645c4be3SJohn Polstraor 284645c4be3SJohn Polstra.Fn dlclose . 285645c4be3SJohn PolstraIf no such error has occurred, 286645c4be3SJohn Polstra.Fn dlerror 287645c4be3SJohn Polstrareturns a null pointer. 288645c4be3SJohn PolstraAt each call to 289645c4be3SJohn Polstra.Fn dlerror , 290760d9686SRuslan Ermilovthe error indication is reset. 291760d9686SRuslan ErmilovThus in the case of two calls 292645c4be3SJohn Polstrato 293645c4be3SJohn Polstra.Fn dlerror , 294645c4be3SJohn Polstrawhere the second call follows the first immediately, the second call 295645c4be3SJohn Polstrawill always return a null pointer. 296645c4be3SJohn Polstra.Pp 29795f4226bSRuslan ErmilovThe 298645c4be3SJohn Polstra.Fn dlclose 29995f4226bSRuslan Ermilovfunction 300645c4be3SJohn Polstradeletes a reference to the shared object referenced by 301645c4be3SJohn Polstra.Fa handle . 302645c4be3SJohn PolstraIf the reference count drops to 0, the object is removed from the 303645c4be3SJohn Polstraaddress space, and 304645c4be3SJohn Polstra.Fa handle 305645c4be3SJohn Polstrais rendered invalid. 306645c4be3SJohn PolstraJust before removing a shared object in this way, the dynamic linker 307645c4be3SJohn Polstracalls the object's 308645c4be3SJohn Polstra.Fn _fini 309645c4be3SJohn Polstrafunction, if such a function is defined by the object. 310645c4be3SJohn PolstraIf 311645c4be3SJohn Polstra.Fn dlclose 312645c4be3SJohn Polstrais successful, it returns a value of 0. 313645c4be3SJohn PolstraOtherwise it returns -1, and sets an error condition that can be 314645c4be3SJohn Polstrainterrogated with 315645c4be3SJohn Polstra.Fn dlerror . 316645c4be3SJohn Polstra.Pp 317645c4be3SJohn PolstraThe object-intrinsic functions 318645c4be3SJohn Polstra.Fn _init 319645c4be3SJohn Polstraand 320645c4be3SJohn Polstra.Fn _fini 321645c4be3SJohn Polstraare called with no arguments, and are not expected to return values. 322f28529d7SJoseph Koshy.Sh NOTES 323f28529d7SJoseph KoshyELF executables need to be linked 324f28529d7SJoseph Koshyusing the 325f28529d7SJoseph Koshy.Fl export-dynamic 326f28529d7SJoseph Koshyoption to 327f28529d7SJoseph Koshy.Xr ld 1 328f28529d7SJoseph Koshyfor symbols defined in the executable to become visible to 329f28529d7SJoseph Koshy.Fn dlsym . 330c786c636SJoerg Wunsch.Pp 331c786c636SJoerg WunschIn previous implementations, it was necessary to prepend an underscore 332c786c636SJoerg Wunschto all external symbols in order to gain symbol 333760d9686SRuslan Ermilovcompatibility with object code compiled from the C language. 334760d9686SRuslan ErmilovThis is 335c786c636SJoerg Wunschstill the case when using the (obsolete) 336c786c636SJoerg Wunsch.Fl aout 337c786c636SJoerg Wunschoption to the C language compiler. 338645c4be3SJohn Polstra.Sh ERRORS 33995f4226bSRuslan ErmilovThe 340dc12134aSGarrett Wollman.Fn dlopen , 341dc12134aSGarrett Wollman.Fn dlsym , 342645c4be3SJohn Polstraand 343dc12134aSGarrett Wollman.Fn dlfunc 34495f4226bSRuslan Ermilovfunctions 345dc12134aSGarrett Wollmanreturn a null pointer in the event of errors. 34695f4226bSRuslan ErmilovThe 347645c4be3SJohn Polstra.Fn dlclose 34895f4226bSRuslan Ermilovfunction 349645c4be3SJohn Polstrareturns 0 on success, or -1 if an error occurred. 350645c4be3SJohn PolstraWhenever an error has been detected, a message detailing it can be 351645c4be3SJohn Polstraretrieved via a call to 352645c4be3SJohn Polstra.Fn dlerror . 353645c4be3SJohn Polstra.Sh SEE ALSO 354645c4be3SJohn Polstra.Xr ld 1 , 355645c4be3SJohn Polstra.Xr rtld 1 , 3564088069cSDima Dorfman.Xr dladdr 3 , 3577ec37597SAlexey Zelkin.Xr dlinfo 3 , 358645c4be3SJohn Polstra.Xr link 5 359