dlsym — get the address of a symbol from a symbol table handle
#include <dlfcn.h>
void *dlsym(void *restrict handle, const char *restrict name);
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(), converted from type pointer to void 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.
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().
No errors are defined.
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);
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.
None.
None.
dladdr, dlclose, dlerror, dlopen
XBD <dlfcn.h>
First released in Issue 5.
The restrict keyword is added to the dlsym() prototype for alignment with the ISO/IEC 9899:1999 standard.
The RTLD_DEFAULT and RTLD_NEXT flags are reserved for future use.
IEEE Std 1003.1-2001/Cor 1-2002, item XSH/TC1/D6/14 is applied, correcting an example, and adding text to the RATIONALE describing issues related to conversion of pointers to functions and back again.
The dlsym() function is moved from the XSI option to the Base.
POSIX.1-2008, Technical Corrigendum 1, XSH/TC1-2008/0074 [74] is applied.
Austin Group Defect 993 is applied, adding dladdr() to the SEE ALSO section.
Austin Group Defect 1644 is applied, clarifying that the return value from dlsym() can be converted from type pointer to void to a pointer to the type of the named symbol using any valid conversion method, not just casting.
return to top of page