Implementation status: to be implemented
void *dlsym(void *restrict handle, const char *restrict name);
dlopen() function gets the address of a symbol from a symbol table handle.
handle - the pointer to the symbol table,
name - the symbol's name.
dlsym() function returns 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 yet 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.
dlsym() function searches for the named symbol in the symbol table referenced by handle. If the symbol table was created with lazy loading (see
dlopen()), load ordering is used in
dlsym() operations to relocate executable object files needed to resolve the symbol. The symbol resolution algorithm used is dependency order as described in
if name names a function identifier - the address of the function converted from type pointer to function to type pointer to
void; a symbol table handle, otherwise it returns a null pointer.
if name names another symbol - 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
Otherwise 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() returns a null pointer.
No errors are defined.
The following example shows how
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);
- Implement the