D hates to be dynamic linked

Justin Johansson no at spam.com
Mon Feb 22 01:17:50 PST 2010


Rainer Schuetze wrote:
> Hi,
> 
> as I'm also hitting some problems with DLLs, here are some issues that I 
> am now aware of (sorry, can't tell for linux shared objects, but I guess 
> the situation is similar):
> 
> 1. For D2, there is a major blocker with DLLs loaded after intialization 
> on XP because of no TLS support from the OS. There is a simple 
> workaround for single-threaded application (just setting FS:2c to a 
> pointer to _tlsstart), but I'm considering a full emulation of the TLS 
> initialization.
> 
> 2. No multi-threading support: I've added a function to std.thread that 
> allows adding a thread to the Thread.allThreads array, so it can be 
> called from DLLMain/THREAD_ATTACH. That way the GC can suspend these, 
> and allocations from different threads don't trample onto each other. Is 
> there anything else needed for full multi-threading support?
> 
> My patch is currently D1/Win32 only, but should not be too hard to 
> extend to other platforms. Attaching to already existing threads is a 
> bit harder, though, and it might not always be desired, because these 
> threads might never call into D-code.
> 
> 3. To try things out, I am playing around with the mydll-example, and it 
> shows some quirks that you need to get around: the implementation-file 
> for the DLL needs to use a file name different from the module name, 
> because you need another file specifying the exports. Unfortunately this 
> cannot be the di-file created from the source, because it contains two 
> much information that will cause references to symbols not actually 
> exported.
> 
> Maybe some command line switch is needed to just write the exports into 
> the di file without any implementations. Even better: import the 
> implementation file, but don't create unnecessary references. (I think 
> it's the module-initialization that's been called because of the import 
> - maybe some modifier to the import could remove it).
> 
> 4. The documentation on the website states, that you should use
> 
>     DATA            PRELOAD SINGLE
> 
> in the def-file. That probably is still there as a historical note to 
> win 3.1, it will cause different processes to trample on each others 
> data segments. This has caused a few hours of debugging, so please 
> remove it, so others don't fall into the same trap. The mydll-example 
> does not use the statement.
> 
> 5. To share gc-collected objects between different DLLs, a common 
> phobos-DLL seems necessary. Extracting the GC into a separate DLL and 
> using the proxy-mechanism to attach any other client-DLL to it seems 
> feasable, but are there other things that need to be shared between 
> different phobos-instances? What about exception-handling?
> 





> I'd say, if there is a way to put all public symbols into a def-file, 
> then compile phobos into a DLL and create the import library and use 
> this instead of a static library. The multi-threading-issue for DLLs 
> needs to be solved before, though.

Hi Rainer,

Congrats.  Sounds like you are giving the problem a lot of thought.

Just regarding the public symbols though, I hazard a guess that you
might run into a mangled-name problem here.  Don't won't to put a
damper on your effort though; just a forewarning that this might be
an issue.  Perhaps someone else who knows about exporting DLL
symbols might be gracious enough to chime in.

Cheers
Justin



More information about the Digitalmars-d mailing list