On 09.01.2013 19:57, Benjamin Thaut wrote:
Am 09.01.2013 16:49, schrieb Andrei Alexandrescu:
On 1/9/13 4:25 AM, Benjamin Thaut wrote:
The compiler is not shared-lib ready. At least not on windows. It does
not support exporting data symbols. E.g.

export uint g_myGlobal;

This is mostly a problem for "hidden" data symbols, like vtables, module
info objects, type info objects and other stuff D relies on.

Are there bugzilla entries for this?

Andrei

Yes its pretty old too. If you read through the discussion in the ticket
and through the code Rainer Schuetze provided you will have a list of
all the issues that need to be fixed for shared dlls to work:
http://d.puremagic.com/issues/show_bug.cgi?id=4071

I doubt it is easily mergeable now, but the major points are listed in the bug report. Some of the patches are meant as tests whether the approach is feasable and should be discussed (like the -exportall switch which might be exporting a bit to much, but could not be implemented by a def file due to optlink limitations).


In the following patch:
http://d.puremagic.com/issues/attachment.cgi?id=601&action=edit
Rainer Schuetze does manual patching for data symbols. But this is
hardcoded to only work for his phobos shared dll. The function it is
done in is called dll_patchImportRelocations. If I understand DLLs
correctly this should usually be done by the import library that is
created by the compiler for a shared dll. Maybe Rainer can shed some mor
light on this.

The import library can only help with function calls by providing the call target and creating an indirect jump through the import table to the actual function in the other DLL. Data accesses need another indirection through the import table in the code if they want to access the actual data in another DLL. This indirection is not generated by the compiler. That's why a pass is made to patch all relocation into the import table to their respective targets (which also eliminates the call indirections). It also has the benefit of being able to use the same object files for static or dynamic linking.

The hardcoding of the DLL name was meant for testing purposes. What's needed is a method to figure out whether the target DLL is written in D and that data relocations are actually wrong. That would support sharing data between multiple DLLs aswell (It currently only allows sharing objects created in the D runtime).


Just to make it clear: I distinguish 2 kinds of DLLs written in D:

1. A DLL that contains the statically linked D runtime and interfaces to other DLLs and the application without sharing ownership (as if all other DLLs are written in C). This works pretty well on Windows (Visual D is such a DLL).

2. A DLL that shares ownership of memory, objects, threads, etc with the executable and other DLLs if they are also written in D. This is realized by placing the D runtime into its own DLL that is implicitely loaded with the other binary. (In contrast to some rumors that I remember that on posix systems the runtime would be linked into the application image.) This is what the patches in the bugzilla entry implement.

Reply via email to