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

Reply via email to