| .\" Copyright 1995 Yggdrasil Computing, Incorporated. |
| .\" and Copyright 2003, 2015 Michael Kerrisk <mtk.manpages@gmail.com> |
| .\" |
| .\" %%%LICENSE_START(GPLv2+_DOC_FULL) |
| .\" This is free documentation; you can redistribute it and/or |
| .\" modify it under the terms of the GNU General Public License as |
| .\" published by the Free Software Foundation; either version 2 of |
| .\" the License, or (at your option) any later version. |
| .\" |
| .\" The GNU General Public License's references to "object code" |
| .\" and "executables" are to be interpreted as the output of any |
| .\" document formatting or typesetting system, including |
| .\" intermediate and printed output. |
| .\" |
| .\" This manual is distributed in the hope that it will be useful, |
| .\" but WITHOUT ANY WARRANTY; without even the implied warranty of |
| .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| .\" GNU General Public License for more details. |
| .\" |
| .\" You should have received a copy of the GNU General Public |
| .\" License along with this manual; if not, see |
| .\" <http://www.gnu.org/licenses/>. |
| .\" %%%LICENSE_END |
| .\" |
| .TH DLSYM 3 2021-03-22 "Linux" "Linux Programmer's Manual" |
| .SH NAME |
| dlsym, dlvsym \- obtain address of a symbol in a shared object or executable |
| .SH SYNOPSIS |
| .nf |
| .B #include <dlfcn.h> |
| .PP |
| .BI "void *dlsym(void *restrict " handle ", const char *restrict " symbol ); |
| .PP |
| .B #define _GNU_SOURCE |
| .B #include <dlfcn.h> |
| .PP |
| .BI "void *dlvsym(void *restrict " handle ", const char *restrict " symbol , |
| .BI " const char *restrict " version ); |
| .PP |
| Link with \fI\-ldl\fP. |
| .fi |
| .SH DESCRIPTION |
| The function |
| .BR dlsym () |
| takes a "handle" of a dynamic loaded shared object returned by |
| .BR dlopen (3) |
| along with a null-terminated symbol name, |
| and returns the address where that symbol is |
| loaded into memory. |
| If the symbol is not found, in the specified |
| object or any of the shared objects that were automatically loaded by |
| .BR dlopen (3) |
| when that object was loaded, |
| .BR dlsym () |
| returns NULL. |
| (The search performed by |
| .BR dlsym () |
| is breadth first through the dependency tree of these shared objects.) |
| .PP |
| In unusual cases (see NOTES) the value of the symbol could actually be NULL. |
| Therefore, a NULL return from |
| .BR dlsym () |
| need not indicate an error. |
| The correct way to distinguish an error from a symbol whose value is NULL |
| is to call |
| .BR dlerror (3) |
| to clear any old error conditions, then call |
| .BR dlsym (), |
| and then call |
| .BR dlerror (3) |
| again, saving its return value into a variable, and check whether |
| this saved value is not NULL. |
| .PP |
| There are two special pseudo-handles that may be specified in |
| .IR handle : |
| .TP |
| .B RTLD_DEFAULT |
| Find the first occurrence of the desired symbol |
| using the default shared object search order. |
| The search will include global symbols in the executable |
| and its dependencies, |
| as well as symbols in shared objects that were dynamically loaded with the |
| .BR RTLD_GLOBAL |
| flag. |
| .TP |
| .BR RTLD_NEXT |
| Find the next occurrence of the desired symbol in the search order |
| after the current object. |
| This allows one to provide a wrapper |
| around a function in another shared object, so that, for example, |
| the definition of a function in a preloaded shared object |
| (see |
| .B LD_PRELOAD |
| in |
| .BR ld.so (8)) |
| can find and invoke the "real" function provided in another shared object |
| (or for that matter, the "next" definition of the function in cases |
| where there are multiple layers of preloading). |
| .PP |
| The |
| .B _GNU_SOURCE |
| feature test macro must be defined in order to obtain the |
| definitions of |
| .B RTLD_DEFAULT |
| and |
| .B RTLD_NEXT |
| from |
| .IR <dlfcn.h> . |
| .PP |
| The function |
| .BR dlvsym () |
| does the same as |
| .BR dlsym () |
| but takes a version string as an additional argument. |
| .SH RETURN VALUE |
| On success, |
| these functions return the address associated with |
| .IR symbol . |
| On failure, they return NULL; |
| the cause of the error can be diagnosed using |
| .BR dlerror (3). |
| .SH VERSIONS |
| .BR dlsym () |
| is present in glibc 2.0 and later. |
| .BR dlvsym () |
| first appeared in glibc 2.1. |
| .SH ATTRIBUTES |
| For an explanation of the terms used in this section, see |
| .BR attributes (7). |
| .ad l |
| .nh |
| .TS |
| allbox; |
| lbx lb lb |
| l l l. |
| Interface Attribute Value |
| T{ |
| .BR dlsym (), |
| .BR dlvsym () |
| T} Thread safety MT-Safe |
| .TE |
| .hy |
| .ad |
| .sp 1 |
| .SH CONFORMING TO |
| POSIX.1-2001 describes |
| .BR dlsym (). |
| The |
| .BR dlvsym () |
| function is a GNU extension. |
| .SH NOTES |
| There are several scenarios when the address of a global symbol is NULL. |
| For example, a symbol can be placed at zero address by the linker, via |
| a linker script or with |
| .I \-\-defsym |
| command-line option. Undefined weak symbols also have NULL value. |
| Finally, the symbol value may be the result of |
| a GNU indirect function (IFUNC) resolver function that returns |
| NULL as the resolved value. In the latter case, |
| .BR dlsym () |
| also returns NULL without error. However, in the former two cases, the |
| behavior of GNU dynamic linker is inconsistent: relocation processing |
| succeeds and the symbol can be observed to have NULL value, but |
| .BR dlsym () |
| fails and |
| .BR dlerror () |
| indicates a lookup error. |
| .\" |
| .SS History |
| The |
| .BR dlsym () |
| function is part of the dlopen API, derived from SunOS. |
| That system does not have |
| .BR dlvsym (). |
| .SH EXAMPLES |
| See |
| .BR dlopen (3). |
| .SH SEE ALSO |
| .BR dl_iterate_phdr (3), |
| .BR dladdr (3), |
| .BR dlerror (3), |
| .BR dlinfo (3), |
| .BR dlopen (3), |
| .BR ld.so (8) |