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)