Provided by: manpages-posix-dev_2017a-2_all bug

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().

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 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(), dlerror(), dlopen()

       The Base Definitions volume of POSIX.1‐2017, <dlfcn.h>

COPYRIGHT

       Portions of this text are reprinted and  reproduced  in  electronic  form  from  IEEE  Std
       1003.1-2017,  Standard  for  Information Technology -- Portable Operating System Interface
       (POSIX), The Open Group Base Specifications Issue 7, 2018 Edition, Copyright (C)  2018  by
       the  Institute  of  Electrical  and Electronics Engineers, Inc and The Open Group.  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.opengroup.org/unix/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.kernel.org/doc/man-pages/reporting_bugs.html .