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.\" 35645c4be3SJohn Polstra.Dd September 24, 1989 36a307d598SRuslan Ermilov.Os 37645c4be3SJohn Polstra.Dt DLOPEN 3 38645c4be3SJohn Polstra.Sh NAME 396d30b167SJohn Polstra.Nm dlopen , dlsym , dlerror , dlclose 40645c4be3SJohn Polstra.Nd programmatic interface to the dynamic linker 4125bb73e0SAlexey Zelkin.Sh LIBRARY 4225bb73e0SAlexey Zelkin.Lb libc 43645c4be3SJohn Polstra.Sh SYNOPSIS 4432eef9aeSRuslan Ermilov.In dlfcn.h 45645c4be3SJohn Polstra.Ft void * 46645c4be3SJohn Polstra.Fn dlopen "const char *path" "int mode" 47645c4be3SJohn Polstra.Ft void * 48645c4be3SJohn Polstra.Fn dlsym "void *handle" "const char *symbol" 49645c4be3SJohn Polstra.Ft const char * 50645c4be3SJohn Polstra.Fn dlerror "void" 51645c4be3SJohn Polstra.Ft int 52645c4be3SJohn Polstra.Fn dlclose "void *handle" 53645c4be3SJohn Polstra.Sh DESCRIPTION 54645c4be3SJohn PolstraThese functions provide a simple programmatic interface to the services of the 55645c4be3SJohn Polstradynamic linker. 56645c4be3SJohn PolstraOperations are provided to add new shared objects to a 57645c4be3SJohn Polstraprogram's address space, to obtain the address bindings of symbols 58645c4be3SJohn Polstradefined by such 59645c4be3SJohn Polstraobjects, and to remove such objects when their use is no longer required. 60645c4be3SJohn Polstra.Pp 61645c4be3SJohn Polstra.Fn dlopen 62645c4be3SJohn Polstraprovides access to the shared object in 63645c4be3SJohn Polstra.Fa path , 64645c4be3SJohn Polstrareturning a descriptor that can be used for later 65645c4be3SJohn Polstrareferences to the object in calls to 66645c4be3SJohn Polstra.Fn dlsym 67645c4be3SJohn Polstraand 68645c4be3SJohn Polstra.Fn dlclose . 69645c4be3SJohn PolstraIf 70645c4be3SJohn Polstra.Fa path 71645c4be3SJohn Polstrawas not in the address space prior to the call to 72645c4be3SJohn Polstra.Fn dlopen , 73645c4be3SJohn Polstrait is placed in the address space. 74645c4be3SJohn PolstraWhen an object is first loaded into the address space in this way, its 75645c4be3SJohn Polstrafunction 76645c4be3SJohn Polstra.Fn _init , 77645c4be3SJohn Polstraif any, is called by the dynamic linker. 78645c4be3SJohn PolstraIf 79645c4be3SJohn Polstra.Fa path 80645c4be3SJohn Polstrahas already been placed in the address space in a previous call to 81645c4be3SJohn Polstra.Fn dlopen , 82645c4be3SJohn Polstrait is not added a second time, although a reference count of 83645c4be3SJohn Polstra.Fn dlopen 84645c4be3SJohn Polstraoperations on 85645c4be3SJohn Polstra.Fa path 86645c4be3SJohn Polstrais maintained. 87645c4be3SJohn PolstraA null pointer supplied for 88645c4be3SJohn Polstra.Fa path 89645c4be3SJohn Polstrais interpreted as a reference to the main 90645c4be3SJohn Polstraexecutable of the process. 91645c4be3SJohn Polstra.Fa mode 92645c4be3SJohn Polstracontrols the way in which external function references from the 93645c4be3SJohn Polstraloaded object are bound to their referents. 9407f643a5SJohn PolstraIt must contain one of the following values, possibly ORed with 9507f643a5SJohn Polstraadditional flags which will be described subsequently: 96645c4be3SJohn Polstra.Bl -tag -width RTLD_LAZYX 97645c4be3SJohn Polstra.It Dv RTLD_LAZY 98645c4be3SJohn PolstraEach external function reference is resolved when the function is first 99645c4be3SJohn Polstracalled. 100645c4be3SJohn Polstra.It Dv RTLD_NOW 101645c4be3SJohn PolstraAll external function references are bound immediately by 102645c4be3SJohn Polstra.Fn dlopen . 103645c4be3SJohn Polstra.El 104645c4be3SJohn Polstra.Pp 105645c4be3SJohn Polstra.Dv RTLD_LAZY 106645c4be3SJohn Polstrais normally preferred, for reasons of efficiency. 107645c4be3SJohn PolstraHowever, 108645c4be3SJohn Polstra.Dv RTLD_NOW 109645c4be3SJohn Polstrais useful to ensure that any undefined symbols are discovered during the 110645c4be3SJohn Polstracall to 111645c4be3SJohn Polstra.Fn dlopen . 11207f643a5SJohn Polstra.Pp 11307f643a5SJohn PolstraOne of the following flags may be ORed into the 11407f643a5SJohn Polstra.Fa mode 11507f643a5SJohn Polstraargument: 11607f643a5SJohn Polstra.Bl -tag -width RTLD_GLOBALX 11707f643a5SJohn Polstra.It Dv RTLD_GLOBAL 11807f643a5SJohn PolstraSymbols from this shared object and its directed acyclic graph (DAG) 11907f643a5SJohn Polstraof needed objects will be available for resolving undefined references 12007f643a5SJohn Polstrafrom all other shared objects. 12107f643a5SJohn Polstra.It Dv RTLD_LOCAL 12207f643a5SJohn PolstraSymbols in this shared object and its DAG of needed objects will be 12307f643a5SJohn Polstraavailable for resolving undefined references only from other objects 12407f643a5SJohn Polstrain the same DAG. This is the default, but it may be specified 12507f643a5SJohn Polstraexplicitly with this flag. 12607f643a5SJohn Polstra.El 12707f643a5SJohn Polstra.Pp 128645c4be3SJohn PolstraIf 129645c4be3SJohn Polstra.Fn dlopen 130645c4be3SJohn Polstrafails, it returns a null pointer, and sets an error condition which may 131645c4be3SJohn Polstrabe interrogated with 132645c4be3SJohn Polstra.Fn dlerror . 133645c4be3SJohn Polstra.Pp 134645c4be3SJohn Polstra.Fn dlsym 135645c4be3SJohn Polstrareturns the address binding of the symbol described in the null-terminated 136645c4be3SJohn Polstracharacter string 137645c4be3SJohn Polstra.Fa symbol , 138645c4be3SJohn Polstraas it occurs in the shared object identified by 139645c4be3SJohn Polstra.Fa handle . 140645c4be3SJohn PolstraThe symbols exported by objects added to the address space by 141645c4be3SJohn Polstra.Fn dlopen 142645c4be3SJohn Polstracan be accessed only through calls to 143645c4be3SJohn Polstra.Fn dlsym . 144645c4be3SJohn PolstraSuch symbols do not supersede any definition of those symbols already present 145645c4be3SJohn Polstrain the address space when the object is loaded, nor are they available to 146645c4be3SJohn Polstrasatisfy normal dynamic linking references. 1477f244df8SJohn Polstra.Pp 1487f244df8SJohn PolstraIf 1497f244df8SJohn Polstra.Fn dlsym 1507f244df8SJohn Polstrais called with the special 151645c4be3SJohn Polstra.Fa handle 1527f244df8SJohn Polstra.Dv NULL , 1537f244df8SJohn Polstrait is interpreted as a reference to the executable or shared object 1547f244df8SJohn Polstrafrom which the call 155645c4be3SJohn Polstrais being made. Thus a shared object can reference its own symbols. 1567f244df8SJohn Polstra.Pp 1577f244df8SJohn PolstraIf 158645c4be3SJohn Polstra.Fn dlsym 1597f244df8SJohn Polstrais called with the special 1607f244df8SJohn Polstra.Fa handle 1617f244df8SJohn Polstra.Dv RTLD_DEFAULT , 1627f244df8SJohn Polstrathe search for the symbol follows the algorithm used for resolving 1637f244df8SJohn Polstraundefined symbols when objects are loaded. The objects searched are 1647f244df8SJohn Polstraas follows, in the given order: 1657f244df8SJohn Polstra.Bl -enum 1667f244df8SJohn Polstra.It 1677f244df8SJohn PolstraThe referencing object itself (or the object from which the call to 1687f244df8SJohn Polstra.Fn dlsym 1697f244df8SJohn Polstrais made), if that object was linked using the 1707f244df8SJohn Polstra.Fl Wsymbolic 1717f244df8SJohn Polstraoption to 1727f244df8SJohn Polstra.Xr ld 1 . 1737f244df8SJohn Polstra.It 1747f244df8SJohn PolstraAll objects loaded at program start-up. 1757f244df8SJohn Polstra.It 1767f244df8SJohn PolstraAll objects loaded via 1777f244df8SJohn Polstra.Fn dlopen 1787f244df8SJohn Polstrawhich are in needed-object DAGs that also contain the referencing object. 1797f244df8SJohn Polstra.It 1807f244df8SJohn PolstraAll objects loaded via 1817f244df8SJohn Polstra.Fn dlopen 1827f244df8SJohn Polstrawith the 1837f244df8SJohn Polstra.Dv RTLD_GLOBAL 1847f244df8SJohn Polstraflag set in the 1857f244df8SJohn Polstra.Fa mode 1867f244df8SJohn Polstraargument. 1877f244df8SJohn Polstra.El 188645c4be3SJohn Polstra.Pp 189645c4be3SJohn PolstraIf 190645c4be3SJohn Polstra.Fn dlsym 191645c4be3SJohn Polstrais called with the special 192645c4be3SJohn Polstra.Fa handle 193645c4be3SJohn Polstra.Dv RTLD_NEXT , 194645c4be3SJohn Polstrathen the search for the symbol is limited to the shared objects 195645c4be3SJohn Polstrawhich were loaded after the one issuing the call to 196645c4be3SJohn Polstra.Fn dlsym . 197645c4be3SJohn PolstraThus, if the function is called from the main program, all 198645c4be3SJohn Polstrathe shared libraries are searched. 199645c4be3SJohn PolstraIf it is called from a shared library, all subsequent shared 200645c4be3SJohn Polstralibraries are searched. 201645c4be3SJohn Polstra.Dv RTLD_NEXT 202645c4be3SJohn Polstrais useful for implementing wrappers around library functions. 203645c4be3SJohn PolstraFor example, a wrapper function 204645c4be3SJohn Polstra.Fn getpid 205645c4be3SJohn Polstracould access the 206645c4be3SJohn Polstra.Dq real 207645c4be3SJohn Polstra.Fn getpid 208645c4be3SJohn Polstrawith 209c786c636SJoerg Wunsch.Li dlsym(RTLD_NEXT, \&"getpid\&") . 210645c4be3SJohn Polstra.Pp 2117f244df8SJohn Polstra.Fn dlsym 2127f244df8SJohn Polstrareturns a null pointer if the symbol cannot be found, and sets an error 2137f244df8SJohn Polstracondition which may be queried with 2147f244df8SJohn Polstra.Fn dlerror . 2157f244df8SJohn Polstra.Pp 216645c4be3SJohn Polstra.Fn dlerror 217645c4be3SJohn Polstrareturns a null-terminated character string describing the last error that 218645c4be3SJohn Polstraoccurred during a call to 219645c4be3SJohn Polstra.Fn dlopen , 220645c4be3SJohn Polstra.Fn dlsym , 221645c4be3SJohn Polstraor 222645c4be3SJohn Polstra.Fn dlclose . 223645c4be3SJohn PolstraIf no such error has occurred, 224645c4be3SJohn Polstra.Fn dlerror 225645c4be3SJohn Polstrareturns a null pointer. 226645c4be3SJohn PolstraAt each call to 227645c4be3SJohn Polstra.Fn dlerror , 228645c4be3SJohn Polstrathe error indication is reset. Thus in the case of two calls 229645c4be3SJohn Polstrato 230645c4be3SJohn Polstra.Fn dlerror , 231645c4be3SJohn Polstrawhere the second call follows the first immediately, the second call 232645c4be3SJohn Polstrawill always return a null pointer. 233645c4be3SJohn Polstra.Pp 234645c4be3SJohn Polstra.Fn dlclose 235645c4be3SJohn Polstradeletes a reference to the shared object referenced by 236645c4be3SJohn Polstra.Fa handle . 237645c4be3SJohn PolstraIf the reference count drops to 0, the object is removed from the 238645c4be3SJohn Polstraaddress space, and 239645c4be3SJohn Polstra.Fa handle 240645c4be3SJohn Polstrais rendered invalid. 241645c4be3SJohn PolstraJust before removing a shared object in this way, the dynamic linker 242645c4be3SJohn Polstracalls the object's 243645c4be3SJohn Polstra.Fn _fini 244645c4be3SJohn Polstrafunction, if such a function is defined by the object. 245645c4be3SJohn PolstraIf 246645c4be3SJohn Polstra.Fn dlclose 247645c4be3SJohn Polstrais successful, it returns a value of 0. 248645c4be3SJohn PolstraOtherwise it returns -1, and sets an error condition that can be 249645c4be3SJohn Polstrainterrogated with 250645c4be3SJohn Polstra.Fn dlerror . 251645c4be3SJohn Polstra.Pp 252645c4be3SJohn PolstraThe object-intrinsic functions 253645c4be3SJohn Polstra.Fn _init 254645c4be3SJohn Polstraand 255645c4be3SJohn Polstra.Fn _fini 256645c4be3SJohn Polstraare called with no arguments, and are not expected to return values. 257f28529d7SJoseph Koshy.Sh NOTES 258f28529d7SJoseph KoshyELF executables need to be linked 259f28529d7SJoseph Koshyusing the 260f28529d7SJoseph Koshy.Fl export-dynamic 261f28529d7SJoseph Koshyoption to 262f28529d7SJoseph Koshy.Xr ld 1 263f28529d7SJoseph Koshyfor symbols defined in the executable to become visible to 264f28529d7SJoseph Koshy.Fn dlsym . 265c786c636SJoerg Wunsch.Pp 266c786c636SJoerg WunschIn previous implementations, it was necessary to prepend an underscore 267c786c636SJoerg Wunschto all external symbols in order to gain symbol 268c786c636SJoerg Wunschcompatibility with object code compiled from the C language. This is 269c786c636SJoerg Wunschstill the case when using the (obsolete) 270c786c636SJoerg Wunsch.Fl aout 271c786c636SJoerg Wunschoption to the C language compiler. 272645c4be3SJohn Polstra.Sh ERRORS 273645c4be3SJohn Polstra.Fn dlopen 274645c4be3SJohn Polstraand 275645c4be3SJohn Polstra.Fn dlsym 276645c4be3SJohn Polstrareturn the null pointer in the event of errors. 277645c4be3SJohn Polstra.Fn dlclose 278645c4be3SJohn Polstrareturns 0 on success, or -1 if an error occurred. 279645c4be3SJohn PolstraWhenever an error has been detected, a message detailing it can be 280645c4be3SJohn Polstraretrieved via a call to 281645c4be3SJohn Polstra.Fn dlerror . 282645c4be3SJohn Polstra.Sh SEE ALSO 283645c4be3SJohn Polstra.Xr ld 1 , 284645c4be3SJohn Polstra.Xr rtld 1 , 2854088069cSDima Dorfman.Xr dladdr 3 , 286645c4be3SJohn Polstra.Xr link 5 287