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 */ 15module core.sys.posix.dlfcn; 16 17import core.sys.posix.config; 18 19version (OSX) 20 version = Darwin; 21else version (iOS) 22 version = Darwin; 23else version (TVOS) 24 version = Darwin; 25else version (WatchOS) 26 version = Darwin; 27 28version (ARM) version = ARM_Any; 29version (AArch64) version = ARM_Any; 30version (HPPA) version = HPPA_Any; 31version (MIPS32) version = MIPS_Any; 32version (MIPS64) version = MIPS_Any; 33version (PPC) version = PPC_Any; 34version (PPC64) version = PPC_Any; 35version (RISCV32) version = RISCV_Any; 36version (RISCV64) version = RISCV_Any; 37version (S390) version = IBMZ_Any; 38version (SPARC) version = SPARC_Any; 39version (SPARC64) version = SPARC_Any; 40version (SystemZ) version = IBMZ_Any; 41version (X86) version = X86_Any; 42version (X86_64) version = X86_Any; 43 44version (Posix): 45extern (C): 46nothrow: 47@nogc: 48@system: 49 50// 51// XOpen (XSI) 52// 53/* 54RTLD_LAZY 55RTLD_NOW 56RTLD_GLOBAL 57RTLD_LOCAL 58 59int dlclose(void*); 60char* dlerror(); 61void* dlopen(const scope char*, int); 62void* dlsym(void*, const scope char*); 63*/ 64 65version (CRuntime_Glibc) 66{ 67 version (X86_Any) 68 { 69 // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h 70 enum RTLD_LAZY = 0x00001; 71 enum RTLD_NOW = 0x00002; 72 enum RTLD_BINDING_MASK = 0x3; 73 enum RTLD_NOLOAD = 0x00004; 74 enum RTLD_DEEPBIND = 0x00008; 75 enum RTLD_GLOBAL = 0x00100; 76 enum RTLD_LOCAL = 0x00000; 77 enum RTLD_NODELETE = 0x01000; 78 } 79 else version (HPPA_Any) 80 { 81 // http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/hppa/bits/dlfcn.h 82 enum RTLD_LAZY = 0x0001; 83 enum RTLD_NOW = 0x0002; 84 enum RTLD_BINDING_MASK = 0x3; 85 enum RTLD_NOLOAD = 0x00004; 86 enum RTLD_DEEPBIND = 0x00008; 87 enum RTLD_GLOBAL = 0x0100; 88 enum RTLD_LOCAL = 0; 89 enum RTLD_NODELETE = 0x01000; 90 } 91 else version (MIPS_Any) 92 { 93 // http://sourceware.org/git/?p=glibc.git;a=blob;f=ports/sysdeps/mips/bits/dlfcn.h 94 enum RTLD_LAZY = 0x0001; 95 enum RTLD_NOW = 0x0002; 96 enum RTLD_BINDING_MASK = 0x3; 97 enum RTLD_NOLOAD = 0x00008; 98 enum RTLD_DEEPBIND = 0x00010; 99 enum RTLD_GLOBAL = 0x0004; 100 enum RTLD_LOCAL = 0; 101 enum RTLD_NODELETE = 0x01000; 102 } 103 else version (PPC_Any) 104 { 105 // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h 106 enum RTLD_LAZY = 0x00001; 107 enum RTLD_NOW = 0x00002; 108 enum RTLD_BINDING_MASK = 0x3; 109 enum RTLD_NOLOAD = 0x00004; 110 enum RTLD_DEEPBIND = 0x00008; 111 enum RTLD_GLOBAL = 0x00100; 112 enum RTLD_LOCAL = 0; 113 enum RTLD_NODELETE = 0x01000; 114 } 115 else version (ARM_Any) 116 { 117 // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h 118 enum RTLD_LAZY = 0x00001; 119 enum RTLD_NOW = 0x00002; 120 enum RTLD_BINDING_MASK = 0x3; 121 enum RTLD_NOLOAD = 0x00004; 122 enum RTLD_DEEPBIND = 0x00008; 123 enum RTLD_GLOBAL = 0x00100; 124 enum RTLD_LOCAL = 0; 125 enum RTLD_NODELETE = 0x01000; 126 } 127 else version (RISCV_Any) 128 { 129 // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h 130 enum RTLD_LAZY = 0x00001; 131 enum RTLD_NOW = 0x00002; 132 enum RTLD_BINDING_MASK = 0x3; 133 enum RTLD_NOLOAD = 0x00004; 134 enum RTLD_DEEPBIND = 0x00008; 135 enum RTLD_GLOBAL = 0x00100; 136 enum RTLD_LOCAL = 0; 137 enum RTLD_NODELETE = 0x01000; 138 } 139 else version (SPARC_Any) 140 { 141 // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h 142 enum RTLD_LAZY = 0x00001; 143 enum RTLD_NOW = 0x00002; 144 enum RTLD_BINDING_MASK = 0x3; 145 enum RTLD_NOLOAD = 0x00004; 146 enum RTLD_DEEPBIND = 0x00008; 147 enum RTLD_GLOBAL = 0x00100; 148 enum RTLD_LOCAL = 0; 149 enum RTLD_NODELETE = 0x01000; 150 151 } 152 else version (IBMZ_Any) 153 { 154 // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h 155 enum RTLD_LAZY = 0x00001; 156 enum RTLD_NOW = 0x00002; 157 enum RTLD_BINDING_MASK = 0x3; 158 enum RTLD_NOLOAD = 0x00004; 159 enum RTLD_DEEPBIND = 0x00008; 160 enum RTLD_GLOBAL = 0x00100; 161 enum RTLD_LOCAL = 0; 162 enum RTLD_NODELETE = 0x01000; 163 } 164 else 165 static assert(0, "unimplemented"); 166 167 int dlclose(void*); 168 char* dlerror(); 169 void* dlopen(const scope char*, int); 170 void* dlsym(void*, const scope char*); 171 int dladdr(const scope void*, Dl_info*); 172 173 struct Dl_info 174 { 175 const(char)* dli_fname; 176 void* dli_fbase; 177 const(char)* dli_sname; 178 void* dli_saddr; 179 } 180} 181else version (Darwin) 182{ 183 enum RTLD_LAZY = 0x00001; 184 enum RTLD_NOW = 0x00002; 185 enum RTLD_NOLOAD = 0x10; 186 enum RTLD_NODELETE = 0x80; 187 enum RTLD_GLOBAL = 0x00100; 188 enum RTLD_LOCAL = 0x00000; 189 enum RTLD_FIRST = 0x100; 190 191 int dlclose(void*); 192 char* dlerror(); 193 void* dlopen(const scope char*, int); 194 void* dlsym(void*, const scope char*); 195 int dladdr(scope const void* addr, Dl_info* info); 196 197 struct Dl_info 198 { 199 const(char)* dli_fname; 200 void* dli_fbase; 201 const(char)* dli_sname; 202 void* dli_saddr; 203 } 204} 205else version (FreeBSD) 206{ 207 enum RTLD_LAZY = 1; 208 enum RTLD_NOW = 2; 209 enum RTLD_MODEMASK = 0x3; 210 enum RTLD_GLOBAL = 0x100; 211 enum RTLD_LOCAL = 0; 212 enum RTLD_TRACE = 0x200; 213 enum RTLD_NODELETE = 0x01000; 214 enum RTLD_NOLOAD = 0x02000; 215 216 int dlclose(void*); 217 char* dlerror(); 218 void* dlopen(const scope char*, int); 219 void* dlsym(void*, const scope char*); 220 int dladdr(const(void)* addr, Dl_info* info); 221 222 struct Dl_info 223 { 224 const(char)* dli_fname; 225 void* dli_fbase; 226 const(char)* dli_sname; 227 void* dli_saddr; 228 } 229} 230else version (NetBSD) 231{ 232 enum RTLD_LAZY = 1; 233 enum RTLD_NOW = 2; 234 enum RTLD_GLOBAL = 0x100; 235 enum RTLD_LOCAL = 0x200; 236 enum RTLD_NODELETE = 0x01000; /* Do not remove members. */ 237 enum RTLD_NOLOAD = 0x02000; 238 239 int dlclose(void*); 240 char* dlerror(); 241 void* dlopen(const scope char*, int); 242 void* dlsym(void*, const scope char*); 243 int dladdr(const(void)* addr, Dl_info* info); 244 245 struct Dl_info 246 { 247 const(char)* dli_fname; 248 void* dli_fbase; 249 const(char)* dli_sname; 250 void* dli_saddr; 251 } 252} 253else version (OpenBSD) 254{ 255 enum RTLD_LAZY = 1; 256 enum RTLD_NOW = 2; 257 enum RTLD_GLOBAL = 0x100; 258 enum RTLD_LOCAL = 0; 259 enum RTLD_TRACE = 0x200; 260 enum RTLD_NODELETE = 0x400; 261 262 int dlclose(void*); 263 char* dlerror(); 264 void* dlopen(const scope char*, int); 265 void* dlsym(void*, const scope char*); 266 int dladdr(const(void)* addr, Dl_info* info); 267 268 struct Dl_info 269 { 270 const(char)* dli_fname; 271 void* dli_fbase; 272 const(char)* dli_sname; 273 void* dli_saddr; 274 } 275} 276else version (DragonFlyBSD) 277{ 278 enum RTLD_LAZY = 1; 279 enum RTLD_NOW = 2; 280 enum RTLD_MODEMASK = 0x3; 281 enum RTLD_GLOBAL = 0x100; 282 enum RTLD_LOCAL = 0; 283 enum RTLD_TRACE = 0x200; 284 enum RTLD_NODELETE = 0x01000; 285 enum RTLD_NOLOAD = 0x02000; 286 287 int dlclose(void*); 288 char* dlerror(); 289 void* dlopen(const scope char*, int); 290 void* dlsym(void*, const scope char*); 291 int dladdr(const(void)* addr, Dl_info* info); 292 293 struct Dl_info 294 { 295 const(char)* dli_fname; 296 void* dli_fbase; 297 const(char)* dli_sname; 298 void* dli_saddr; 299 } 300} 301else version (Solaris) 302{ 303 enum RTLD_LAZY = 1; 304 enum RTLD_NOW = 2; 305 enum RTLD_NOLOAD = 0x00004; 306 enum RTLD_DEEPBIND = 0x00008; 307 enum RTLD_GLOBAL = 0x100; 308 enum RTLD_LOCAL = 0; 309 enum RTLD_PARENT = 0x00200; 310 enum RTLD_GROUP = 0x00400; 311 enum RTLD_WORLD = 0x00800; 312 enum RTLD_NODELETE = 0x01000; 313 enum RTLD_FIRST = 0x02000; 314 enum RTLD_CONFGEN = 0x10000; 315 316 int dlclose(void*); 317 char* dlerror(); 318 void* dlopen(const scope char*, int); 319 void* dlsym(void*, const scope char*); 320 int dladdr(const(void)* addr, Dl_info* info); 321 322 struct Dl_info 323 { 324 const(char)* dli_fname; 325 void* dli_fbase; 326 const(char)* dli_sname; 327 void* dli_saddr; 328 } 329} 330else version (CRuntime_Bionic) 331{ 332 enum 333 { 334 RTLD_NOW = 0, 335 RTLD_LAZY = 1, 336 RTLD_LOCAL = 0, 337 RTLD_GLOBAL = 2 338 } 339 340 int dladdr(const scope void*, Dl_info*); 341 int dlclose(void*); 342 const(char)* dlerror(); 343 void* dlopen(const scope char*, int); 344 void* dlsym(void*, const scope char*); 345 346 struct Dl_info 347 { 348 const(char)* dli_fname; 349 void* dli_fbase; 350 const(char)* dli_sname; 351 void* dli_saddr; 352 } 353} 354else version (CRuntime_Musl) 355{ 356 enum { 357 RTLD_LAZY = 1, 358 RTLD_NOW = 2, 359 RTLD_NOLOAD = 4, 360 RTLD_NODELETE = 4096, 361 RTLD_GLOBAL = 256, 362 RTLD_LOCAL = 0, 363 } 364 int dlclose(void*); 365 const(char)* dlerror(); 366 void* dlopen(const scope char*, int); 367 void* dlsym(void*, const scope char*); 368 369 int dladdr(scope const void *addr, Dl_info *info); 370 struct Dl_info 371 { 372 const(char)* dli_fname; 373 void* dli_fbase; 374 const(char)* dli_sname; 375 void* dli_saddr; 376 } 377} 378else version (CRuntime_UClibc) 379{ 380 version (X86_64) 381 { 382 enum RTLD_LAZY = 0x0001; 383 enum RTLD_NOW = 0x0002; 384 enum RTLD_BINDING_MASK = 0x3; 385 enum RTLD_NOLOAD = 0x00004; 386 enum RTLD_GLOBAL = 0x00100; 387 enum RTLD_LOCAL = 0; 388 enum RTLD_NODELETE = 0x01000; 389 } 390 else version (MIPS_Any) 391 { 392 enum RTLD_LAZY = 0x0001; 393 enum RTLD_NOW = 0x0002; 394 enum RTLD_BINDING_MASK = 0x3; 395 enum RTLD_NOLOAD = 0x00008; 396 enum RTLD_GLOBAL = 0x0004; 397 enum RTLD_LOCAL = 0; 398 enum RTLD_NODELETE = 0x01000; 399 } 400 else version (ARM) 401 { 402 enum RTLD_LAZY = 0x0001; 403 enum RTLD_NOW = 0x0002; 404 enum RTLD_BINDING_MASK = 0x3; 405 enum RTLD_NOLOAD = 0x00004; 406 enum RTLD_GLOBAL = 0x00100; 407 enum RTLD_LOCAL = 0; 408 enum RTLD_NODELETE = 0x01000; 409 } 410 else 411 static assert(0, "unimplemented"); 412 413 int dlclose(void*); 414 char* dlerror(); 415 void* dlopen(const scope char*, int); 416 void* dlsym(void*, const scope char*); 417 int dladdr(const scope void*, Dl_info*); 418 419 struct Dl_info 420 { 421 const(char)* dli_fname; 422 void* dli_fbase; 423 const(char)* dli_sname; 424 void* dli_saddr; 425 } 426} 427