DLOPEN(3C)              Standard C Library Functions              DLOPEN(3C)
NAME
       dlopen, dlmopen - gain access to an executable object file
SYNOPSIS
       #include <dlfcn.h>
       #include <link.h>       
void *dlopen(
const char *pathname, 
int mode);       
void *dlmopen(
Lmid_t lmid, 
const char *pathname, 
int mode);
DESCRIPTION
       The 
dlopen() function makes an executable object file available to a
       running process. 
dlopen() returns to the process a 
handle that the
       process can use on subsequent calls to 
dlsym(3C), 
dladdr(3C),       
dlinfo(3C), and 
dlclose(3C). The value of this 
handle should not be
       interpreted in any way by the process. The 
pathname argument is the
       path name of the object to be opened. A path name containing an
       embedded 
'/' is interpreted as an absolute path or relative to the
       current directory. Otherwise, the set of search paths currently in
       effect by the runtime linker are used to locate the specified file.
       See 
NOTES.
       The 
dlopen() function also loads any dependencies recorded within       
pathname. These dependencies are searched in the order in which the
       dependencies were loaded to locate any additional dependencies. This
       process continues until all the dependencies of 
pathname are loaded.
       This dependency tree is referred to as a group.
       If the value of 
pathname is 
0, 
dlopen() provides a 
handle on a set of
       global symbol objects. These objects consist of the original program
       image file, any dependencies loaded at program startup, and any
       objects loaded using 
dlopen() with the 
RTLD_GLOBAL flag.  Because the
       latter set of objects can change during process execution, the set
       identified by 
handle can also change dynamically.
       The 
mode argument describes how 
dlopen() operates on 
pathname with
       respect to the processing of reference relocations. The 
mode also
       affects the scope of visibility of the symbols provided by 
pathname       and its dependencies. This visibility can affect how the resulting       
handle is used.
       When an object is loaded, the object can contain references to
       symbols whose addresses are not known until the object is loaded.
       These references must be relocated before the symbols can be
       accessed. References are categorized as either 
immediate or 
lazy.
       Immediate references are typically references to data items used by
       the object code. Immediate references include pointers to functions
       and calls to functions made from position-dependent shared objects.
       Lazy references are typically calls to global functions that are made
       from position-independent shared objects. The 
mode argument governs
       when these references take place. The 
mode argument can be one of the
       following values:       
RTLD_LAZY                    Only immediate symbol references are relocated when the
                    object is first loaded.  Lazy references are not
                    relocated until a given function is called for the first
                    time. This value for 
mode should improve performance,
                    since a process might not require all lazy references in
                    any given object. This behavior mimics the normal
                    loading of dependencies during process initialization.
                    See 
NOTES.       
RTLD_NOW                    All necessary relocations are performed when the object
                    is first loaded. This process might waste some
                    processing if relocations are performed for lazy
                    references that are never used. However, this mode
                    ensures that when an object is loaded, all symbols
                    referenced during execution are available. This behavior
                    mimics the loading of dependencies when the environment
                    variable 
LD_BIND_NOW is in effect.
       See the 
Linker and Libraries Guide for more information about symbol
       references.
       The visibility of symbols that are available for relocation can be
       affected by 
mode. To specify the scope of visibility for symbols that
       are loaded with a 
dlopen() call, 
mode should be a bitwise-inclusive
       OR with one of the following values:       
RTLD_GLOBAL                      The object's global symbols are made available for the
                      relocation processing of any other object. In
                      addition, symbol lookup using 
dlopen(0, mode) and an
                      associated 
dlsym() allows objects that are loaded with                      
RTLD_GLOBAL to be searched.       
RTLD_LOCAL                      The object's globals symbols are only available for
                      the relocation processing of other objects that
                      include the same group.
       The program image file and any objects loaded at program startup have
       the mode 
RTLD_GLOBAL. The mode 
RTLD_LOCAL is the default mode for any
       objects that are acquired with 
dlopen(). A local object can be a
       dependency of more than one group. Any object of mode 
RTLD_LOCAL that
       is referenced as a dependency of an object of mode 
RTLD_GLOBAL is
       promoted to 
RTLD_GLOBAL. In other words, the 
RTLD_LOCAL mode is
       ignored.
       Any object loaded by 
dlopen() that requires relocations against
       global symbols can reference the symbols in any 
RTLD_GLOBAL object.
       Objects of this mode are at least the program image file and any
       objects loaded at program startup. A loaded object can also reference
       symbols from itself, and from any dependencies the object references.
       However, the 
mode parameter can also be a bitwise-inclusive 
OR with
       one of the following values to affect the scope of symbol
       availability:       
RTLD_GROUP                      Only symbols from the associated group are made
                      available for relocation. A group is established from
                      the defined object and all the dependencies of that
                      object. A group must be completely self-contained. All
                      dependency relationships between the members of the
                      group must be sufficient to satisfy the relocation
                      requirements of each object that defines the group.       
RTLD_PARENT                      The symbols of the object initiating the 
dlopen() call
                      are made available to the objects obtained by                      
dlopen(). This option is useful when hierarchical                      
dlopen() families are created. Although the parent
                      object can supply symbols for the relocation of this
                      object, the parent object is not available to 
dlsym()                      through the returned 
handle.       
RTLD_WORLD                      Only symbols from 
RTLD_GLOBAL objects are made
                      available for relocation.
       The default modes for 
dlopen() are both 
RTLD_WORLD and 
RTLD_GROUP. If
       an object is requires additional modes, the 
mode parameter can be the
       bitwise-inclusive OR of the required modes together with the default
       modes.
       The following modes provide additional capabilities outside of
       relocation processing:       
RTLD_NODELETE                        The specified object is tagged to prevent its
                        deletion from the address space as part of a                        
dlclose().       
RTLD_NOLOAD                        The specified object is not loaded as part of the                        
dlopen(). However, a valid 
handle is returned if the
                        object already exists as part of the process address
                        space. Additional modes can be specified as a
                        bitwise-inclusive OR with the present mode of the
                        object and its dependencies. The 
RTLD_NOLOAD mode
                        provides a means of querying the presence or
                        promoting the modes of an existing dependency.
       The default use of a 
handle with 
dlsym() allows a symbol search to
       inspect all objects that are associated with the group of objects
       that are loaded from 
dlopen(). The 
mode parameter can also be a
       bitwise-inclusive OR with the following value to restrict this symbol
       search:       
RTLD_FIRST                     Use of this 
handle with 
dlsym(), restricts the symbol
                     search to the first object associated with the 
handle.
       An object can be accessed from a process both with and without       
RTLD_FIRST. Although the object will only be loaded once, two
       different 
handles are created to provide for the different 
dlsym()       requirements.
       The 
dlmopen() function is identical to 
dlopen(), except that an
       identifying link-map ID 
(lmid) is provided. This link-map ID informs
       the dynamic linking facilities upon which link-map list to load the
       object. See the 
Linker and Libraries Guide for details about link-
       maps.
       The 
lmid passed to 
dlmopen() identifies the link-map list on which
       the object is loaded. This parameter can be any valid 
Lmid_t returned
       by 
dlinfo() or one of the following special values:       
LM_ID_BASE                      Load the object on the applications link-map list.       
LM_ID_LDSO                      Load the object on the dynamic linkers (
ld.so.1) link-
                      map list.       
LM_ID_NEWLM                      Cause the object to create a new link-map list as part
                      of loading. Objects that are opened on a new link-map
                      list must express all of their dependencies.
RETURN VALUES
       The 
dlopen() function returns 
NULL if 
pathname cannot be found,
       cannot be opened for reading, or is not a shared object or a
       relocatable object. 
dlopen() also returns 
NULL if an error occurs
       during the process of loading 
pathname or relocating its symbolic
       references. See 
NOTES. Additional diagnostic information is available
       through 
dlerror().
USAGE
       The 
dlopen() and 
dlmopen() functions are members of a family of
       functions that give the user direct access to the dynamic linking
       facilities.  This family of functions is available only to
       dynamically-linked processes. See the 
Linker and Libraries Guide.
ATTRIBUTES
       See 
attributes(7) for descriptions of the following attributes:
       +--------------------+-----------------+
       |  ATTRIBUTE TYPE    | ATTRIBUTE VALUE |
       +--------------------+-----------------+
       |Interface Stability | Standard        |
       +--------------------+-----------------+
       |MT-Level            | MT-Safe         |
       +--------------------+-----------------+
SEE ALSO
       ld(1), 
ld.so.1(1), 
dladdr(3C), 
dlclose(3C), 
dldump(3C), 
dlerror(3C),       
dlinfo(3C), 
dlsym(3C), 
attributes(7), 
standards(7)       Linker and Libraries GuideNOTES
       If 
pathname has dependencies on other objects, these objects are
       automatically loaded by 
dlopen(). The directory search path used to
       find 
pathname and any dependencies can be affected by setting the
       environment variable 
LD_LIBRARY_PATH. Any 
LD_LIBRARY_PATH variable is
       analyzed once at process startup. The search path can also be
       affected from a runpath setting within the object from which the call
       to 
dlopen() originates.  These search rules will only be applied to
       path names that do not contain an embedded 
'/'. Objects whose names
       resolve to the same absolute path name or relative path name can be
       opened any number of times using 
dlopen(). However, the object that
       is referenced will only be loaded once into the address space of the
       current process.
       When loading shared objects, the application should open a specific
       version of the shared object. Do not rely on the version of the
       shared object pointed to by the symbolic link.
       When building objects to be loaded on a new link-map list, some
       precautions need to be taken. In general, all dependencies must be
       included when building an object. Also, include       
/usr/lib/libmapmalloc.so.1 before 
/lib/libc.so.1 when building an
       object.
       When an object is loaded on a new link-map list, the object is
       isolated from the main running program. Certain global resources are
       only usable from one link-map list. A few examples are the 
sbrk()       based 
malloc(), 
libthread(), and the signal vectors. Care must be
       taken not to use any of these resources other than from the primary
       link-map list. These issues are discussed in further detail in the       
Linker and Libraries Guide.
       Some symbols defined in dynamic executables or shared objects can not
       be available to the runtime linker. The symbol table created by 
ld       for use by the runtime linker might contain only a subset of the
       symbols that are defined in the object.
       As part of loading a new object, initialization code within the
       object is called 
before the 
dlopen() returns. This initialization is
       user code, and as such, can produce errors that can not be caught by       
dlopen().  For example, an object loaded using 
RTLD_LAZY that
       attempts to call a function that can not be located results in
       process termination. Erroneous programming practices within the
       initialization code can also result in process termination. The
       runtime linkers debugging facility can offer help identifying these
       types of error. See the 
LD_DEBUG environment variable of 
ld.so.1(1).
       Loading relocatable objects is an expensive operation that requires
       converting the relocatable object into a shared object memory image.
       This capability may be useful in a debugging environment, but is not
       recommended for production software.
                                May 16, 2020                      DLOPEN(3C)