Linking wine *dll.so libraries with Linux applications ?!
Troy Rollo
wine at troy.rollo.name
Thu Oct 20 15:49:18 CDT 2005
On Thursday 20 October 2005 22:45, Alexander Efremov wrote:
> The
> architecture is somethink like
>
> |Linux Executable| --uses--> |Linux *.a and *.so libraries| +
>
> + |my Linux *.so library| --uses--> |Other Linux *.a and *.so
> libraries + WineLib avifil32.dll.so|
OK, then you will need to use the longjmp method.
> By the way what exactly causes the segmentation fault during the
> execution ?
Something (and it could be one of many things) that is not initialised when
you call the library.
>
> A also tried to compile and link WineLib *.dll.so applications using
> normal g++ for compilation and linking - just ignoring all the
> resource files - and it worked... but at the end i got the same
> segmantation fault :-(
That is what I would expect. You can't just use normal g++ - winegcc is doing
a lot of magic stuff for Wine.
It looks like you are going to have to use the longjmp method. Create a
WineLib application whose WinMain just jumps back to some other routine. It
will probably be worth patching winegcc and the Wine launcher code so that
winegcc marks the executable at 3Gig-aware (based on a flag to winegcc) and
the Wine launcher code recognises the flag and avoids reserving the 2-3G part
of the address space. This should be enough that you can avoid mucking about
with stacks and unmapping stuff wine has mapped.
You should have an arrangement that looks something like this:
1. Your DLL that wants to call the Win32 API links to a "startwinelib.so"
with an entry point "start_wine_lib_for_dll".
2. "startwinelib.so" is a winelib app. "start_wine_lib_for_dll" would contain
a "setjmp" followed by a call to wine_init, passing a dummied up argv
that tells wine to start "startwinelib.so".
3. WinMain in "startwinelib.so" does a longjmp back to
"start_wine_lib_for_dll"
4. From this point on you should be able to call the Win32 API as much as
you like, even from files compiled with plain old gcc or g++.
5. You may need to set up an exception frame that does something like
calling "exit" after printing a message about there being an
unhandled exception.
More information about the wine-devel
mailing list