2 import core
.stdc
.stdio
;
3 import core
.stdc
.string
;
6 import core
.sys
.posix
.dlfcn
;
8 version (DragonFlyBSD
) import core
.sys
.dragonflybsd
.dlfcn
: RTLD_NOLOAD
;
9 version (FreeBSD
) import core
.sys
.freebsd
.dlfcn
: RTLD_NOLOAD
;
10 version (linux
) import core
.sys
.linux
.dlfcn
: RTLD_NOLOAD
;
11 version (NetBSD
) import core
.sys
.netbsd
.dlfcn
: RTLD_NOLOAD
;
12 version (OSX
) import core
.sys
.darwin
.dlfcn
: RTLD_NOLOAD
;
13 version (Solaris
) import core
.sys
.solaris
.dlfcn
: RTLD_NOLOAD
;
15 static assert(__traits(compiles
, RTLD_NOLOAD
), "unimplemented");
17 void loadSym(T
)(void* handle
, ref T val
, const char* mangle
)
19 val
= cast(T
).dlsym(handle
, mangle
);
22 void* openLib(string s
)
24 auto h
= Runtime
.loadLibrary(s
);
27 loadSym(h
, libThrowException
, "_D3lib14throwExceptionFZv");
28 loadSym(h
, libCollectException
, "_D3lib16collectExceptionFDFZvZC9Exception");
30 loadSym(h
, libAlloc
, "_D3lib5allocFZv");
31 loadSym(h
, libTlsAlloc
, "_D3lib9tls_allocFZv");
32 loadSym(h
, libAccess
, "_D3lib6accessFZv");
33 loadSym(h
, libTlsAccess
, "_D3lib10tls_accessFZv");
34 loadSym(h
, libFree
, "_D3lib4freeFZv");
35 loadSym(h
, libTlsFree
, "_D3lib8tls_freeFZv");
37 loadSym(h
, libSharedStaticCtor
, "_D3lib18shared_static_ctorOk");
38 loadSym(h
, libSharedStaticDtor
, "_D3lib18shared_static_dtorOk");
39 loadSym(h
, libStaticCtor
, "_D3lib11static_ctorOk");
40 loadSym(h
, libStaticDtor
, "_D3lib11static_dtorOk");
45 void closeLib(void* h
)
47 Runtime
.unloadLibrary(h
);
52 void function() libThrowException
;
53 Exception
function(void delegate()) libCollectException
;
55 void function() libAlloc
;
56 void function() libTlsAlloc
;
57 void function() libAccess
;
58 void function() libTlsAccess
;
59 void function() libFree
;
60 void function() libTlsFree
;
62 shared uint* libSharedStaticCtor
;
63 shared uint* libSharedStaticDtor
;
64 shared uint* libStaticCtor
;
65 shared uint* libStaticDtor
;
75 assert(passed
); passed
= false;
77 assert(libCollectException({throw new Exception(null);}) !is null);
78 assert(libCollectException({libThrowException();}) !is null);
98 assert(*libStaticCtor
== 1);
99 assert(*libStaticDtor
== 0);
102 assert(*libSharedStaticCtor
== 1);
103 assert(*libSharedStaticDtor
== 0);
104 assert(*libStaticCtor
== 2);
105 assert(*libStaticDtor
== 0);
107 auto thr
= new Thread(&run
);
110 assert(*libSharedStaticCtor
== 1);
111 assert(*libSharedStaticDtor
== 0);
112 assert(*libStaticCtor
== 2);
113 assert(*libStaticDtor
== 1);
116 const(ModuleInfo
)* findModuleInfo(string name
)
118 foreach (m
; ModuleInfo
)
119 if (m
.name
== name
) return m
;
123 void runTests(string libName
)
125 assert(findModuleInfo("lib") is null);
126 auto handle
= openLib(libName
);
127 assert(findModuleInfo("lib") !is null);
134 assert(findModuleInfo("lib") is null);
137 void main(string
[] args
)
139 auto name
= args
[0] ~ '\0';
140 const pathlen
= strrchr(name
.ptr
, '/') - name
.ptr
+ 1;
141 name
= name
[0 .. pathlen
] ~ "lib.so";
145 // lib is no longer resident
147 assert(.dlopen(name
.ptr
, RTLD_LAZY | RTLD_NOLOAD
) is null);
148 name
= name
[0 .. $-1];
150 auto thr
= new Thread({runTests(name
);});