On Sun, 24 May 2015 15:40:04 -0400, bitwise <bitwise....@gmail.com> wrote:
[snip]
So at this point, it seems like these two fixes work as expected, but
now, I'm having some new and very strange problems.
I have a simple shared library and program I've been using to test this:
[main.d]
module main;
import std.stdio;
import std.conv;
import std.string;
import core.sys.posix.dlfcn;
void main(string[] args)
{
alias void function() fnType;
void *handle = dlopen("myShared.dylib", RTLD_NOW);
assert(handle);
fnType init = cast(fnType)dlsym(handle, "initLib");
assert(init);
init();
fnType term = cast(fnType)dlsym(handle, "termLib");
assert(term);
term();
dlclose(handle);
writeln("done");
}
[myShared.d]
module myShared;
import core.runtime;
import std.stdio;
extern(C) void initLib() {
writeln("Initializing Runtime");
Runtime.initialize();
}
extern(C) void termLib() {
writeln("Terminating Runtime");
Runtime.terminate();
}
So, when I run the above program, rt_init() should be called once for
the main program, and once for the shared library. However, when I run
the above program, rt_init() from the main program seems to get called
twice. To clarify, I mean that when I retrieve "initLib()" with dlsym()
and call it, rt_init() from the main module gets called.
This seems to prove the above:
In dmain2.d, I have modified rt_init() as follows:
extern (C) int rt_init()
{
import core.sys.posix.dlfcn;
Dl_info info;
if(dladdr(&rt_init, &info))
fprintf(stdout, "RT INIT: %s\n", info.dli_fname); // this
prints "main" for both calls
if (atomicOp!"+="(_initCount, 1) > 1)
{
fprintf(stdout, "RT ALREADY INITIALIZED\n");
return 1;
}
// ...
fprintf(stdout, "RT INIT COMPLETE\n");
}
When the main program calls rt_init(), the output correctly reads "RT
INIT COMPLETE".
When I load the dynamic library however, I get the output "RT ALREADY
INITIALIZED"
How is this possible? I am not using a shared druntime afaik..
I just found that gcc has "-fvisibility=hidden" and
"-fvisibility-ms-compat" which are equivalent. The lack of this
functionality for dmd seems to explain the above problem.
Is this correct?
Any ideas?
Bit