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