1 /**
2 * D header file for POSIX.
3 *
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Sean Kelly, Alex Rønne Petersen
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8 */
9
10 /* Copyright Sean Kelly 2005 - 2009.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
14 */
15 module core.sys.posix.dlfcn;
16
17 private import core.sys.posix.config;
18
19 version (OSX)
20 version = Darwin;
21 else version (iOS)
22 version = Darwin;
23 else version (TVOS)
24 version = Darwin;
25 else version (WatchOS)
26 version = Darwin;
27
28 version (ARM) version = ARM_Any;
29 version (AArch64) version = ARM_Any;
30 version (HPPA) version = HPPA_Any;
31 version (MIPS32) version = MIPS_Any;
32 version (MIPS64) version = MIPS_Any;
33 version (PPC) version = PPC_Any;
34 version (PPC64) version = PPC_Any;
35 version (RISCV32) version = RISCV_Any;
36 version (RISCV64) version = RISCV_Any;
37 version (S390) version = IBMZ_Any;
38 version (SPARC) version = SPARC_Any;
39 version (SPARC64) version = SPARC_Any;
40 version (SystemZ) version = IBMZ_Any;
41 version (X86) version = X86_Any;
42 version (X86_64) version = X86_Any;
43
version(Posix)44 version (Posix):
45 extern (C):
46 nothrow:
47 @nogc:
48
49 //
50 // XOpen (XSI)
51 //
52 /*
53 RTLD_LAZY
54 RTLD_NOW
55 RTLD_GLOBAL
56 RTLD_LOCAL
57
58 int dlclose(void*);
59 char* dlerror();
60 void* dlopen(in char*, int);
61 void* dlsym(void*, in char*);
62 */
63
64 version (CRuntime_Glibc)
65 {
66 version (X86_Any)
67 {
68 enum RTLD_LAZY = 0x00001;
69 enum RTLD_NOW = 0x00002;
70 enum RTLD_GLOBAL = 0x00100;
71 enum RTLD_LOCAL = 0x00000;
72 }
73 else version (HPPA_Any)
74 {
75 enum RTLD_LAZY = 0x0001;
76 enum RTLD_NOW = 0x0002;
77 enum RTLD_GLOBAL = 0x0100;
78 enum RTLD_LOCAL = 0;
79 }
80 else version (MIPS_Any)
81 {
82 enum RTLD_LAZY = 0x0001;
83 enum RTLD_NOW = 0x0002;
84 enum RTLD_GLOBAL = 0x0004;
85 enum RTLD_LOCAL = 0;
86 }
87 else version (PPC_Any)
88 {
89 enum RTLD_LAZY = 0x00001;
90 enum RTLD_NOW = 0x00002;
91 enum RTLD_GLOBAL = 0x00100;
92 enum RTLD_LOCAL = 0;
93 }
94 else version (ARM_Any)
95 {
96 enum RTLD_LAZY = 0x00001;
97 enum RTLD_NOW = 0x00002;
98 enum RTLD_GLOBAL = 0x00100;
99 enum RTLD_LOCAL = 0;
100 }
101 else version (RISCV_Any)
102 {
103 enum RTLD_LAZY = 0x00001;
104 enum RTLD_NOW = 0x00002;
105 enum RTLD_GLOBAL = 0x00100;
106 enum RTLD_LOCAL = 0;
107 }
108 else version (SPARC_Any)
109 {
110 enum RTLD_LAZY = 0x00001;
111 enum RTLD_NOW = 0x00002;
112 enum RTLD_GLOBAL = 0x00100;
113 enum RTLD_LOCAL = 0;
114 }
115 else version (IBMZ_Any)
116 {
117 enum RTLD_LAZY = 0x00001;
118 enum RTLD_NOW = 0x00002;
119 enum RTLD_GLOBAL = 0x00100;
120 enum RTLD_LOCAL = 0;
121 }
122 else
123 static assert(0, "unimplemented");
124
125 int dlclose(void*);
126 char* dlerror();
127 void* dlopen(in char*, int);
128 void* dlsym(void*, in char*);
129 }
version(Darwin)130 else version (Darwin)
131 {
132 enum RTLD_LAZY = 0x00001;
133 enum RTLD_NOW = 0x00002;
134 enum RTLD_GLOBAL = 0x00100;
135 enum RTLD_LOCAL = 0x00000;
136
137 int dlclose(void*);
138 char* dlerror();
139 void* dlopen(in char*, int);
140 void* dlsym(void*, in char*);
141 int dladdr(void* addr, Dl_info* info);
142
143 struct Dl_info
144 {
145 const(char)* dli_fname;
146 void* dli_fbase;
147 const(char)* dli_sname;
148 void* dli_saddr;
149 }
150 }
151 else version (FreeBSD)
152 {
153 enum RTLD_LAZY = 1;
154 enum RTLD_NOW = 2;
155 enum RTLD_GLOBAL = 0x100;
156 enum RTLD_LOCAL = 0;
157
158 int dlclose(void*);
159 char* dlerror();
160 void* dlopen(in char*, int);
161 void* dlsym(void*, in char*);
162 int dladdr(const(void)* addr, Dl_info* info);
163
164 struct Dl_info
165 {
166 const(char)* dli_fname;
167 void* dli_fbase;
168 const(char)* dli_sname;
169 void* dli_saddr;
170 }
171 }
172 else version (NetBSD)
173 {
174 enum RTLD_LAZY = 1;
175 enum RTLD_NOW = 2;
176 enum RTLD_GLOBAL = 0x100;
177 enum RTLD_LOCAL = 0x200;
178 enum RTLD_NODELETE = 0x01000; /* Do not remove members. */
179 enum RTLD_NOLOAD = 0x02000;
180
181 int dlclose(void*);
182 char* dlerror();
183 void* dlopen(in char*, int);
184 void* dlsym(void*, in char*);
185 int dladdr(const(void)* addr, Dl_info* info);
186
187 struct Dl_info
188 {
189 const(char)* dli_fname;
190 void* dli_fbase;
191 const(char)* dli_sname;
192 void* dli_saddr;
193 }
194 }
195 else version (OpenBSD)
196 {
197 enum RTLD_LAZY = 1;
198 enum RTLD_NOW = 2;
199 enum RTLD_GLOBAL = 0x100;
200 enum RTLD_LOCAL = 0;
201
202 int dlclose(void*);
203 char* dlerror();
204 void* dlopen(in char*, int);
205 void* dlsym(void*, in char*);
206 int dladdr(const(void)* addr, Dl_info* info);
207
208 struct Dl_info
209 {
210 const(char)* dli_fname;
211 void* dli_fbase;
212 const(char)* dli_sname;
213 void* dli_saddr;
214 }
215 }
216 else version (DragonFlyBSD)
217 {
218 enum RTLD_LAZY = 1;
219 enum RTLD_NOW = 2;
220 enum RTLD_GLOBAL = 0x100;
221 enum RTLD_LOCAL = 0;
222
223 int dlclose(void*);
224 char* dlerror();
225 void* dlopen(in char*, int);
226 void* dlsym(void*, in char*);
227 int dladdr(const(void)* addr, Dl_info* info);
228
229 struct Dl_info
230 {
231 const(char)* dli_fname;
232 void* dli_fbase;
233 const(char)* dli_sname;
234 void* dli_saddr;
235 }
236 }
237 else version (Solaris)
238 {
239 enum RTLD_LAZY = 1;
240 enum RTLD_NOW = 2;
241 enum RTLD_GLOBAL = 0x100;
242 enum RTLD_LOCAL = 0;
243
244 int dlclose(void*);
245 char* dlerror();
246 void* dlopen(in char*, int);
247 void* dlsym(void*, in char*);
248 int dladdr(const(void)* addr, Dl_info* info);
249
250 struct Dl_info
251 {
252 const(char)* dli_fname;
253 void* dli_fbase;
254 const(char)* dli_sname;
255 void* dli_saddr;
256 }
257 }
258 else version (CRuntime_Bionic)
259 {
260 enum
261 {
262 RTLD_NOW = 0,
263 RTLD_LAZY = 1,
264 RTLD_LOCAL = 0,
265 RTLD_GLOBAL = 2
266 }
267
268 int dladdr(in void*, Dl_info*);
269 int dlclose(void*);
270 const(char)* dlerror();
271 void* dlopen(in char*, int);
272 void* dlsym(void*, in char*);
273
274 struct Dl_info
275 {
276 const(char)* dli_fname;
277 void* dli_fbase;
278 const(char)* dli_sname;
279 void* dli_saddr;
280 }
281 }
282 else version (CRuntime_Musl)
283 {
284 enum {
285 RTLD_LAZY = 1,
286 RTLD_NOW = 2,
287 RTLD_NOLOAD = 4,
288 RTLD_NODELETE = 4096,
289 RTLD_GLOBAL = 256,
290 RTLD_LOCAL = 0,
291 }
292 int dlclose(void*);
293 const(char)* dlerror();
294 void* dlopen(in char*, int);
295 void* dlsym(void*, in char*);
296 }
297 else version (CRuntime_UClibc)
298 {
299 version (X86_64)
300 {
301 enum RTLD_LAZY = 0x0001;
302 enum RTLD_NOW = 0x0002;
303 enum RTLD_BINDING_MASK = 0x3;
304 enum RTLD_NOLOAD = 0x00004;
305 enum RTLD_GLOBAL = 0x00100;
306 enum RTLD_LOCAL = 0;
307 enum RTLD_NODELETE = 0x01000;
308 }
309 else version (MIPS32)
310 {
311 enum RTLD_LAZY = 0x0001;
312 enum RTLD_NOW = 0x0002;
313 enum RTLD_BINDING_MASK = 0x3;
314 enum RTLD_NOLOAD = 0x00008;
315 enum RTLD_GLOBAL = 0x0004;
316 enum RTLD_LOCAL = 0;
317 enum RTLD_NODELETE = 0x01000;
318 }
319 else version (ARM)
320 {
321 enum RTLD_LAZY = 0x0001;
322 enum RTLD_NOW = 0x0002;
323 enum RTLD_BINDING_MASK = 0x3;
324 enum RTLD_NOLOAD = 0x00004;
325 enum RTLD_GLOBAL = 0x00100;
326 enum RTLD_LOCAL = 0;
327 enum RTLD_NODELETE = 0x01000;
328 }
329 else
330 static assert(0, "unimplemented");
331
332 int dlclose(void*);
333 char* dlerror();
334 void* dlopen(in char*, int);
335 void* dlsym(void*, in char*);
336 }
337