DLSYM(3P) POSIX Programmer's Manual DLSYM(3P)
PROLOG
This manual page is part of the POSIX Programmer's Manual. The Linux
implementation of this interface may differ (consult the corresponding
Linux manual page for details of Linux behavior), or the interface may
not be implemented on Linux.
NAME
dlsym -- get the address of a symbol from a symbol table handle
SYNOPSIS
#include <dlfcn.h>
void *dlsym(void *restrict handle, const char *restrict name);
DESCRIPTION
The dlsym() function shall obtain the address of a symbol (a function
identifier or a data object identifier) defined in the symbol table
identified by the handle argument. The handle argument is a symbol ta-
ble handle returned from a call to dlopen() (and which has not since
been released by a call to dlclose()), and name is the symbol's name as
a character string. The return value from dlsym(), cast to a pointer to
the type of the named symbol, can be used to call (in the case of a
function) or access the contents of (in the case of a data object) the
named symbol.
The dlsym() function shall search for the named symbol in the symbol
table referenced by handle. If the symbol table was created with lazy
loading (see RTLD_LAZY in dlopen()), load ordering shall be used in
dlsym() operations to relocate executable object files needed to
resolve the symbol. The symbol resolution algorithm used shall be
dependency order as described in dlopen().
The RTLD_DEFAULT and RTLD_NEXT symbolic constants (which may be defined
in <dlfcn.h>) are reserved for future use as special values that appli-
cations may be allowed to use for handle.
RETURN VALUE
Upon successful completion, if name names a function identifier,
dlsym() shall return the address of the function converted from type
pointer to function to type pointer to void; otherwise, dlsym() shall
return the address of the data object associated with the data object
identifier named by name converted from a pointer to the type of the
data object to a pointer to void. If handle does not refer to a valid
symbol table handle or if the symbol named by name cannot be found in
the symbol table associated with handle, dlsym() shall return a null
pointer.
More detailed diagnostic information shall be available through dler-
ror().
ERRORS
No errors are defined.
The following sections are informative.
EXAMPLES
The following example shows how dlopen() and dlsym() can be used to
access either a function or a data object. For simplicity, error check-
ing has been omitted.
void *handle;
int (*fptr)(int), *iptr, result;
/* open the needed symbol table */
handle = dlopen("/usr/home/me/libfoo.so", RTLD_LOCAL | RTLD_LAZY);
/* find the address of the function my_function */
fptr = (int (*)(int))dlsym(handle, "my_function");
/* find the address of the data object my_object */
iptr = (int *)dlsym(handle, "my_OBJ");
/* invoke my_function, passing the value of my_OBJ as the parameter */
result = (*fptr)(*iptr);
APPLICATION USAGE
The following special purpose values for handle are reserved for future
use and have the indicated meanings:
RTLD_DEFAULT
The identifier lookup happens in the normal global scope;
that is, a search for an identifier using handle would find
the same definition as a direct use of this identifier in
the program code.
RTLD_NEXT Specifies the next executable object file after this one
that defines name. This one refers to the executable
object file containing the invocation of dlsym(). The next
executable object file is the one found upon the applica-
tion of a load order symbol resolution algorithm (see
dlopen()). The next symbol is either one of global scope
(because it was introduced as part of the original process
image or because it was added with a dlopen() operation
including the RTLD_GLOBAL flag), or is in an executable
object file that was included in the same dlopen() opera-
tion that loaded this one.
The RTLD_NEXT flag is useful to navigate an intentionally created hier-
archy of multiply-defined symbols created through interposition. For
example, if a program wished to create an implementation of malloc()
that embedded some statistics gathering about memory allocations, such
an implementation could use the real malloc() definition to perform the
memory allocation -- and itself only embed the necessary logic to
implement the statistics gathering function.
Note that conversion from a void * pointer to a function pointer as in:
fptr = (int (*)(int))dlsym(handle, "my_function");
is not defined by the ISO C standard. This standard requires this con-
version to work correctly on conforming implementations.
RATIONALE
None.
FUTURE DIRECTIONS
None.
SEE ALSO
dlclose(), dlerror(), dlopen()
The Base Definitions volume of POSIX.1-2008, <dlfcn.h>
COPYRIGHT
Portions of this text are reprinted and reproduced in electronic form
from IEEE Std 1003.1, 2013 Edition, Standard for Information Technology
-- Portable Operating System Interface (POSIX), The Open Group Base
Specifications Issue 7, Copyright (C) 2013 by the Institute of Electri-
cal and Electronics Engineers, Inc and The Open Group. (This is
POSIX.1-2008 with the 2013 Technical Corrigendum 1 applied.) In the
event of any discrepancy between this version and the original IEEE and
The Open Group Standard, the original IEEE and The Open Group Standard
is the referee document. The original Standard can be obtained online
at http://www.unix.org/online.html .
Any typographical or formatting errors that appear in this page are
most likely to have been introduced during the conversion of the source
files to man page format. To report such errors, see https://www.ker-
nel.org/doc/man-pages/reporting_bugs.html .
IEEE/The Open Group 2013 DLSYM(3P)