получить адрес символа из дескриптора таблицы символов (get the address of a symbol from a symbol table handle)
Пролог (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 table 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 applications 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
dlerror().
Ошибки (Error)
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 checking 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 application 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() operation that loaded this one.
The RTLD_NEXT flag is useful to navigate an intentionally created
hierarchy 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
conversion to work correctly on conforming implementations.
Обоснование (Rationale)
None.
Будущие направления (Future directions)
None.
Смотри также (See also)
dlclose(3p), dlerror(3p), dlopen(3p)
The Base Definitions volume of POSIX.1‐2017, dlfcn.h(0p)