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: dlsym (void *handle, const char *name)
29: {
30: return __dlsym (handle, name, RETURN_ADDRESS (0));
31: }
32:
33: #else
34:
35: struct dlsym_args
36: {
37:
38: void *handle;
39: const char *name;
40: void *who;
41:
42:
43: void *sym;
44: };
45:
46: static void
47: dlsym_doit (void *a)
48: {
49: struct dlsym_args *args = (struct dlsym_args *) a;
50:
51: args->sym = _dl_sym (args->handle, args->name, args->who);
52: }
53:
54:
55: void *
56: __dlsym (void *handle, const char *name DL_CALLER_DECL)
57: {
58: # ifdef SHARED
59: if (__builtin_expect (_dlfcn_hook != NULL, 0))
60: return _dlfcn_hook->dlsym (handle, name, DL_CALLER);
61: # endif
62:
63: struct dlsym_args args;
64: args.who = DL_CALLER;
65: args.handle = handle;
66: args.name = name;
67:
68:
69: __rtld_lock_lock_recursive (GL(dl_load_lock));
70:
71: void *result = (_dlerror_run (dlsym_doit, &args) ? NULL : args.sym);
72:
73: __rtld_lock_unlock_recursive (GL(dl_load_lock));
74:
75: return result;
76: }
77: # ifdef SHARED
78: strong_alias (__dlsym, dlsym)
79: # endif
80: #endif