1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <dlfcn.h>
21: #include <stddef.h>
22:
23: #include <ldsodefs.h>
24:
25: #if !defined SHARED && defined IS_IN_libdl
26:
27: void *
28: weak_function
29: dlvsym (void *handle, const char *name, const char *version_str)
30: {
31: return __dlvsym (handle, name, version_str, RETURN_ADDRESS (0));
32: }
33:
34: #else
35:
36: struct dlvsym_args
37: {
38:
39: void *handle;
40: const char *name;
41: const char *version;
42: void *who;
43:
44:
45: void *sym;
46: };
47:
48:
49: static void
50: dlvsym_doit (void *a)
51: {
52: struct dlvsym_args *args = (struct dlvsym_args *)a;
53:
54: args->sym = _dl_vsym (args->handle, args->name, args->version, args->who);
55: }
56:
57: void *
58: __dlvsym (void *handle, const char *name, const char *version_str
59: DL_CALLER_DECL)
60: {
61: # ifdef SHARED
62: if (__builtin_expect (_dlfcn_hook != NULL, 0))
63: return _dlfcn_hook->dlvsym (handle, name, version_str, DL_CALLER);
64: # endif
65:
66: struct dlvsym_args args;
67: args.handle = handle;
68: args.name = name;
69: args.who = DL_CALLER;
70: args.version = version_str;
71:
72:
73: __rtld_lock_lock_recursive (GL(dl_load_lock));
74:
75: void *result = (_dlerror_run (dlvsym_doit, &args) ? NULL : args.sym);
76:
77: __rtld_lock_unlock_recursive (GL(dl_load_lock));
78:
79: return result;
80: }
81: # ifdef SHARED
82: weak_alias (__dlvsym, dlvsym)
83: # endif
84: #endif