Paul Chitescu wrote:
On Thursday 10 September 2009 22:10:37 Joe Dluzen wrote:
Hi all,
back a few years ago it didn't:
http://www.winehq.org/pipermail/wine-devel/2003-July/018498.html
Does anyone know of the status of LoadLibrary and a .so? Can it load
directly or is there a workaround that does not involve multiple
processes and some sort of IPC?
thanks,
Joe
Hi!
If the problem is to use LoadLibrary() on a native (not windows native but
posix or whatever) .so you can always write a wrapper .dll.so that links to
the .so and internally calls its functions. The glue code acts as a
compatibility layer for the differences and also insulates the native code
from the win32 compatible code expectations.
Directly loading a .so just like it were a .dll.so or a .dll doesn't make much
sense because:
- There are differences in the argument types, calling conventions, register
usage, thread local storage, exception frames.
- Any file name, handle or similar resource would need conversion.
- There are support functions that use mutually incompatible structures (like
native free() called on a MSVCRT malloc()ed memory block).
- The expected internal structure of a module cannot be loaded - this may not
be a big issue but needs work in the loader code to provide a stub.
The other way around, loading a DLL from a non-winelib process is generically
not feasable and in all but the most trivial (and tightly controlled) cases
needs different processes and IPC. Most Windows DLLs expect a fully
functional environment to be already set up including exceptions,
synchronization objects, local heaps, security, handles, consoles, user
interface, COM. That's what winelib does - it provides this environment.
Paul
Perhaps the step of creating a wrapper dll.so file could be automated by
a script that checks the exports (or headers/signatures) of the target
.so file and generates a Win32 C stub for each export. This might reduce
the development overhead needed to support a native .so library despite
not being able to load it directly. Instrumenting the target .so library
within the dll.so file would be required (as the parent points out).
-Nick