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 <errno.h>
22: #include <libintl.h>
23: #include <stddef.h>
24: #include <unistd.h>
25: #include <ldsodefs.h>
26:
27: #if !defined SHARED && defined IS_IN_libdl
28:
29: void *
30: dlmopen (Lmid_t nsid, const char *file, int mode)
31: {
32: return __dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
33: }
34: static_link_warning (dlmopen)
35:
36: #else
37:
38: struct dlmopen_args
39: {
40:
41: Lmid_t nsid;
42:
43: const char *file;
44: int mode;
45:
46: void *new;
47:
48: const void *caller;
49: };
50:
51: static void
52: dlmopen_doit (void *a)
53: {
54: struct dlmopen_args *args = (struct dlmopen_args *) a;
55:
56:
57: if (args->nsid != LM_ID_BASE)
58: {
59: # ifdef SHARED
60:
61:
62: if (args->file == NULL)
63: # endif
64: GLRO(dl_signal_error) (EINVAL, NULL, NULL, N_("invalid namespace"));
65:
66:
67:
68: if (__builtin_expect (args->mode & RTLD_GLOBAL, 0))
69: GLRO(dl_signal_error) (EINVAL, NULL, NULL, N_("invalid mode"));
70: }
71:
72: args->new = GLRO(dl_open) (args->file ?: "", args->mode | __RTLD_DLOPEN,
73: args->caller,
74: args->nsid, __dlfcn_argc, __dlfcn_argv,
75: __environ);
76: }
77:
78:
79: void *
80: __dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL)
81: {
82: # ifdef SHARED
83: if (__builtin_expect (_dlfcn_hook != NULL, 0))
84: return _dlfcn_hook->dlmopen (nsid, file, mode, RETURN_ADDRESS (0));
85: # endif
86:
87: struct dlmopen_args args;
88: args.nsid = nsid;
89: args.file = file;
90: args.mode = mode;
91: args.caller = DL_CALLER;
92:
93: # ifdef SHARED
94: return _dlerror_run (dlmopen_doit, &args) ? NULL : args.new;
95: # else
96: if (_dlerror_run (dlmopen_doit, &args))
97: return NULL;
98:
99: __libc_register_dl_open_hook ((struct link_map *) args.new);
100: __libc_register_dlfcn_hook ((struct link_map *) args.new);
101:
102: return args.new;
103: # endif
104: }
105: # ifdef SHARED
106: strong_alias (__dlmopen, dlmopen)
107: # endif
108: #endif