D hates to be dynamic linked

Justin Johansson no at spam.com
Mon Feb 22 01:22:05 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 name-mangling problem here.  Don't want 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