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 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 @system:
49
50 //
51 // XOpen (XSI)
52 //
53 /*
54 RTLD_LAZY
55 RTLD_NOW
56 RTLD_GLOBAL
57 RTLD_LOCAL
58
59 int dlclose(void*);
60 char* dlerror();
61 void* dlopen(const scope char*, int);
62 void* dlsym(void*, const scope char*);
63 */
64
65 version (CRuntime_Glibc)
66 {
67 version (X86_Any)
68 {
69 enum RTLD_LAZY = 0x00001;
70 enum RTLD_NOW = 0x00002;
71 enum RTLD_GLOBAL = 0x00100;
72 enum RTLD_LOCAL = 0x00000;
73 }
74 else version (HPPA_Any)
75 {
76 enum RTLD_LAZY = 0x0001;
77 enum RTLD_NOW = 0x0002;
78 enum RTLD_GLOBAL = 0x0100;
79 enum RTLD_LOCAL = 0;
80 }
81 else version (MIPS_Any)
82 {
83 enum RTLD_LAZY = 0x0001;
84 enum RTLD_NOW = 0x0002;
85 enum RTLD_GLOBAL = 0x0004;
86 enum RTLD_LOCAL = 0;
87 }
88 else version (PPC_Any)
89 {
90 enum RTLD_LAZY = 0x00001;
91 enum RTLD_NOW = 0x00002;
92 enum RTLD_GLOBAL = 0x00100;
93 enum RTLD_LOCAL = 0;
94 }
95 else version (ARM_Any)
96 {
97 enum RTLD_LAZY = 0x00001;
98 enum RTLD_NOW = 0x00002;
99 enum RTLD_GLOBAL = 0x00100;
100 enum RTLD_LOCAL = 0;
101 }
102 else version (RISCV_Any)
103 {
104 enum RTLD_LAZY = 0x00001;
105 enum RTLD_NOW = 0x00002;
106 enum RTLD_GLOBAL = 0x00100;
107 enum RTLD_LOCAL = 0;
108 }
109 else version (SPARC_Any)
110 {
111 enum RTLD_LAZY = 0x00001;
112 enum RTLD_NOW = 0x00002;
113 enum RTLD_GLOBAL = 0x00100;
114 enum RTLD_LOCAL = 0;
115 }
116 else version (IBMZ_Any)
117 {
118 enum RTLD_LAZY = 0x00001;
119 enum RTLD_NOW = 0x00002;
120 enum RTLD_GLOBAL = 0x00100;
121 enum RTLD_LOCAL = 0;
122 }
123 else
124 static assert(0, "unimplemented");
125
126 int dlclose(void*);
127 char* dlerror();
128 void* dlopen(const scope char*, int);
129 void* dlsym(void*, const scope char*);
130 }
version(Darwin)131 else version (Darwin)
132 {
133 enum RTLD_LAZY = 0x00001;
134 enum RTLD_NOW = 0x00002;
135 enum RTLD_GLOBAL = 0x00100;
136 enum RTLD_LOCAL = 0x00000;
137
138 int dlclose(void*);
139 char* dlerror();
140 void* dlopen(const scope char*, int);
141 void* dlsym(void*, const scope char*);
142 int dladdr(scope const void* addr, Dl_info* info);
143
144 struct Dl_info
145 {
146 const(char)* dli_fname;
147 void* dli_fbase;
148 const(char)* dli_sname;
149 void* dli_saddr;
150 }
151 }
152 else version (FreeBSD)
153 {
154 enum RTLD_LAZY = 1;
155 enum RTLD_NOW = 2;
156 enum RTLD_GLOBAL = 0x100;
157 enum RTLD_LOCAL = 0;
158
159 int dlclose(void*);
160 char* dlerror();
161 void* dlopen(const scope char*, int);
162 void* dlsym(void*, const scope char*);
163 int dladdr(const(void)* addr, Dl_info* info);
164
165 struct Dl_info
166 {
167 const(char)* dli_fname;
168 void* dli_fbase;
169 const(char)* dli_sname;
170 void* dli_saddr;
171 }
172 }
173 else version (NetBSD)
174 {
175 enum RTLD_LAZY = 1;
176 enum RTLD_NOW = 2;
177 enum RTLD_GLOBAL = 0x100;
178 enum RTLD_LOCAL = 0x200;
179 enum RTLD_NODELETE = 0x01000; /* Do not remove members. */
180 enum RTLD_NOLOAD = 0x02000;
181
182 int dlclose(void*);
183 char* dlerror();
184 void* dlopen(const scope char*, int);
185 void* dlsym(void*, const scope char*);
186 int dladdr(const(void)* addr, Dl_info* info);
187
188 struct Dl_info
189 {
190 const(char)* dli_fname;
191 void* dli_fbase;
192 const(char)* dli_sname;
193 void* dli_saddr;
194 }
195 }
196 else version (OpenBSD)
197 {
198 enum RTLD_LAZY = 1;
199 enum RTLD_NOW = 2;
200 enum RTLD_GLOBAL = 0x100;
201 enum RTLD_LOCAL = 0;
202
203 int dlclose(void*);
204 char* dlerror();
205 void* dlopen(const scope char*, int);
206 void* dlsym(void*, const scope char*);
207 int dladdr(const(void)* addr, Dl_info* info);
208
209 struct Dl_info
210 {
211 const(char)* dli_fname;
212 void* dli_fbase;
213 const(char)* dli_sname;
214 void* dli_saddr;
215 }
216 }
217 else version (DragonFlyBSD)
218 {
219 enum RTLD_LAZY = 1;
220 enum RTLD_NOW = 2;
221 enum RTLD_GLOBAL = 0x100;
222 enum RTLD_LOCAL = 0;
223
224 int dlclose(void*);
225 char* dlerror();
226 void* dlopen(const scope char*, int);
227 void* dlsym(void*, const scope char*);
228 int dladdr(const(void)* addr, Dl_info* info);
229
230 struct Dl_info
231 {
232 const(char)* dli_fname;
233 void* dli_fbase;
234 const(char)* dli_sname;
235 void* dli_saddr;
236 }
237 }
238 else version (Solaris)
239 {
240 enum RTLD_LAZY = 1;
241 enum RTLD_NOW = 2;
242 enum RTLD_GLOBAL = 0x100;
243 enum RTLD_LOCAL = 0;
244
245 int dlclose(void*);
246 char* dlerror();
247 void* dlopen(const scope char*, int);
248 void* dlsym(void*, const scope char*);
249 int dladdr(const(void)* addr, Dl_info* info);
250
251 struct Dl_info
252 {
253 const(char)* dli_fname;
254 void* dli_fbase;
255 const(char)* dli_sname;
256 void* dli_saddr;
257 }
258 }
259 else version (CRuntime_Bionic)
260 {
261 enum
262 {
263 RTLD_NOW = 0,
264 RTLD_LAZY = 1,
265 RTLD_LOCAL = 0,
266 RTLD_GLOBAL = 2
267 }
268
269 int dladdr(const scope void*, Dl_info*);
270 int dlclose(void*);
271 const(char)* dlerror();
272 void* dlopen(const scope char*, int);
273 void* dlsym(void*, const scope char*);
274
275 struct Dl_info
276 {
277 const(char)* dli_fname;
278 void* dli_fbase;
279 const(char)* dli_sname;
280 void* dli_saddr;
281 }
282 }
283 else version (CRuntime_Musl)
284 {
285 enum {
286 RTLD_LAZY = 1,
287 RTLD_NOW = 2,
288 RTLD_NOLOAD = 4,
289 RTLD_NODELETE = 4096,
290 RTLD_GLOBAL = 256,
291 RTLD_LOCAL = 0,
292 }
293 int dlclose(void*);
294 const(char)* dlerror();
295 void* dlopen(const scope char*, int);
296 void* dlsym(void*, const scope char*);
297
298 int dladdr(scope const void *addr, Dl_info *info);
299 struct Dl_info
300 {
301 const(char)* dli_fname;
302 void* dli_fbase;
303 const(char)* dli_sname;
304 void* dli_saddr;
305 }
306 }
307 else version (CRuntime_UClibc)
308 {
309 version (X86_64)
310 {
311 enum RTLD_LAZY = 0x0001;
312 enum RTLD_NOW = 0x0002;
313 enum RTLD_BINDING_MASK = 0x3;
314 enum RTLD_NOLOAD = 0x00004;
315 enum RTLD_GLOBAL = 0x00100;
316 enum RTLD_LOCAL = 0;
317 enum RTLD_NODELETE = 0x01000;
318 }
319 else version (MIPS32)
320 {
321 enum RTLD_LAZY = 0x0001;
322 enum RTLD_NOW = 0x0002;
323 enum RTLD_BINDING_MASK = 0x3;
324 enum RTLD_NOLOAD = 0x00008;
325 enum RTLD_GLOBAL = 0x0004;
326 enum RTLD_LOCAL = 0;
327 enum RTLD_NODELETE = 0x01000;
328 }
329 else version (ARM)
330 {
331 enum RTLD_LAZY = 0x0001;
332 enum RTLD_NOW = 0x0002;
333 enum RTLD_BINDING_MASK = 0x3;
334 enum RTLD_NOLOAD = 0x00004;
335 enum RTLD_GLOBAL = 0x00100;
336 enum RTLD_LOCAL = 0;
337 enum RTLD_NODELETE = 0x01000;
338 }
339 else
340 static assert(0, "unimplemented");
341
342 int dlclose(void*);
343 char* dlerror();
344 void* dlopen(const scope char*, int);
345 void* dlsym(void*, const scope char*);
346 }
347