1 /**
2  * D header file for GNU/Linux
3  *
4  * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=dlfcn/dlfcn.h, glibc dlfcn/dlfcn.h)
5  */
6 module core.sys.linux.dlfcn;
7 
8 version (linux):
9 extern (C):
10 nothrow:
11 @nogc:
12 
13 version (ARM)     version = ARM_Any;
14 version (AArch64) version = ARM_Any;
15 version (HPPA)    version = HPPA_Any;
16 version (MIPS32)  version = MIPS_Any;
17 version (MIPS64)  version = MIPS_Any;
18 version (PPC)     version = PPC_Any;
19 version (PPC64)   version = PPC_Any;
20 version (RISCV32) version = RISCV_Any;
21 version (RISCV64) version = RISCV_Any;
22 version (S390)    version = IBMZ_Any;
23 version (SPARC)   version = SPARC_Any;
24 version (SPARC64) version = SPARC_Any;
25 version (SystemZ) version = IBMZ_Any;
26 version (X86)     version = X86_Any;
27 version (X86_64)  version = X86_Any;
28 
29 public import core.sys.posix.dlfcn;
30 import core.sys.linux.config;
31 
32 // <bits/dlfcn.h>
33 version (X86_Any)
34 {
35     // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
36     static if (_GNU_SOURCE)
37     {
38         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
39         {
40             _dl_mcount_wrapper_check(cast(void*)fctp);
41             return fctp(args);
42         }
43 
44         void _dl_mcount_wrapper_check(void* __selfpc);
45     }
46 }
47 else version (HPPA_Any)
48 {
49     // http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/hppa/bits/dlfcn.h
50     static if (_GNU_SOURCE)
51     {
52         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
53         {
54             _dl_mcount_wrapper_check(cast(void*)fctp);
55             return fctp(args);
56         }
57 
58         void _dl_mcount_wrapper_check(void* __selfpc);
59     }
60 }
61 else version (MIPS_Any)
62 {
63     // http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/mips/bits/dlfcn.h
64     static if (_GNU_SOURCE)
65     {
66         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
67         {
68             _dl_mcount_wrapper_check(cast(void*)fctp);
69             return fctp(args);
70         }
71 
72         void _dl_mcount_wrapper_check(void* __selfpc);
73     }
74 }
75 else version (PPC_Any)
76 {
77     // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
78     static if (_GNU_SOURCE)
79     {
80         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
81         {
82             _dl_mcount_wrapper_check(cast(void*)fctp);
83             return fctp(args);
84         }
85 
86         void _dl_mcount_wrapper_check(void* __selfpc);
87     }
88 }
89 else version (ARM_Any)
90 {
91     // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
92     static if (_GNU_SOURCE)
93     {
94         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
95         {
96             _dl_mcount_wrapper_check(cast(void*)fctp);
97             return fctp(args);
98         }
99 
100         void _dl_mcount_wrapper_check(void* __selfpc);
101     }
102 }
103 else version (RISCV_Any)
104 {
105     // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
106     static if (_GNU_SOURCE)
107     {
108         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
109         {
110             _dl_mcount_wrapper_check(cast(void*)fctp);
111             return fctp(args);
112         }
113 
114         void _dl_mcount_wrapper_check(void* __selfpc);
115     }
116 }
117 else version (SPARC_Any)
118 {
119     // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
120     static if (_GNU_SOURCE)
121     {
122         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
123         {
124             _dl_mcount_wrapper_check(cast(void*)fctp);
125             return fctp(args);
126         }
127 
128         void _dl_mcount_wrapper_check(void* __selfpc);
129     }
130 }
131 else version (IBMZ_Any)
132 {
133     // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
134     static if (_GNU_SOURCE)
135     {
136         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
137         {
138             _dl_mcount_wrapper_check(cast(void*)fctp);
139             return fctp(args);
140         }
141 
142         void _dl_mcount_wrapper_check(void* __selfpc);
143     }
144 }
145 else version (LoongArch64)
146 {
147     // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
148     static if (_GNU_SOURCE)
149     {
150         RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
151         {
152             _dl_mcount_wrapper_check(cast(void*)fctp);
153             return fctp(args);
154         }
155 
156         void _dl_mcount_wrapper_check(void* __selfpc);
157     }
158 }
159 else
160     static assert(0, "unimplemented");
161 
162 // <bits/dlfcn.h>
163 
164 static if (_GNU_SOURCE)
165 {
166     enum RTLD_NEXT = cast(void *)-1L;
167     enum RTLD_DEFAULT = cast(void *)0;
168     alias c_long Lmid_t;
169     enum LM_ID_BASE = 0;
170     enum LM_ID_NEWLM = -1;
171 }
172 
173 // void* dlopen(const scope char* __file, int __mode); // POSIX
174 // int dlclose(void* __handle); // POSIX
175 // void* dlsym(void* __handle, const scope char* __name); // POSIX
176 
177 static if (_GNU_SOURCE)
178 {
179     void* dlmopen(Lmid_t __nsid, const scope char* __file, int __mode);
180     void* dlvsym(void* __handle, const scope char* __name, const scope char* __version);
181 }
182 
183 // char* dlerror(); // POSIX
184 
185 static if (_GNU_SOURCE)
186 {
187     int dladdr1(void* __address, Dl_info* __info, void** __extra_info, int __flags);
188 
189     enum
190     {
191         RTLD_DL_SYMENT = 1,
192         RTLD_DL_LINKMAP = 2,
193     }
194 
195     int dlinfo(void* __handle, int __request, void* __arg);
196 
197     enum
198     {
199         RTLD_DI_LMID = 1,
200         RTLD_DI_LINKMAP = 2,
201         RTLD_DI_CONFIGADDR = 3,
202         RTLD_DI_SERINFO = 4,
203         RTLD_DI_SERINFOSIZE = 5,
204         RTLD_DI_ORIGIN = 6,
205         RTLD_DI_PROFILENAME = 7,
206         RTLD_DI_PROFILEOUT = 8,
207         RTLD_DI_TLS_MODID = 9,
208         RTLD_DI_TLS_DATA = 10,
209         RTLD_DI_MAX = 10,
210     }
211 
212     struct Dl_serpath
213     {
214         char* dls_name;
215         uint dls_flags;
216     }
217 
218     struct Dl_serinfo
219     {
220         size_t dls_size;
221         uint dls_cnt;
222         Dl_serpath[1] dls_serpath;
223     }
224 }