[PATCH] winemaker: fix catch() and throw() in winelib DLLs

Martin Wilck Martin.Wilck at Fujitsu-Siemens.com
Tue Sep 10 14:17:50 CDT 2002


Patch: winemaker-wrapper.diff

Martin Wilck <Martin.Wilck at fujitsu-siemens.com>
Patch against: CVS 2002-09-10

Modified files:
        - tools:        winemaker

* A wrapper binary should not be linked to any library passed with "-l".

[ I am forwarding this to wine-devel because the problem may be deeper than
  I think, see below ].

Rationale:

This fixes a delicate problem with catch() and throw() in a DLL used
by a winelib application that has a wrapper app.

I have written this small, hopefully self-explaining, shell script
that demonstrates the problem.
(Note that my previous winemaker patches are necessary otherwise there'll
be other errors before this one comes into play).

#! /bin/sh
# throwtest.sh - test winemaker with catch()/throw() in a DLL

# Change this to the location of your wine installation (DLL will also be installed there)
WINEDIR=$HOME/exp
# Extra winemaker options to build EXE: CORE DUMP with --wrap, fine without
EXEOPTS="--wrap"
# Extra winemaker options to build DLL
DLLOPTS=""

errexit () {
    echo "** Error $1 !! **" >&2
    exit 1
}

export PATH=$WINEDIR/bin:$PATH
export LD_LIBRARY_PATH=$WINEDIR/lib:$LD_LIBRARY_PATH

echo "Building library ..." >&2
mkdir -p trylib
cd trylib
rm -f *  # BEWARE !!!

cat > trylib.cpp <<EOF
int do_try (void)
{
    int ret = 0;
    try {
        throw(1);
    }
    catch (int e) {
        ret = e;
    }
    return ret;
}
EOF

winemaker --dll $DLLOPTS . > winemaker.out 2>&1 || errexit "running winemaker for library"
## remove the "init DllMain" declaration winemaker generates
echo "" >libtrylib.spec
./configure --with-wine=$WINEDIR --prefix=$WINEDIR > conf.log 2>&1 || errexit "during library configure"
make >make.log 2>&1 || errexit "building library"
make install >>make.log 2>&1 || errexit "installing library"

cd ..
echo "Building program ..." >&2
mkdir -p tryexe
cd tryexe
rm -f * # BEWARE !!!

cat > tryexe.cpp <<EOF
#include <stdio.h>
extern int do_try (void);
void main (void)
{
    printf ("Result: %d\n", do_try());
}
EOF

winemaker --cuiexe $EXEOPTS -ltrylib . > winemaker.out 2>&1 || errexit "running winemaker for program"
./configure --with-wine=$WINEDIR --prefix=$WINEDIR > conf.log 2>&1 || errexit "during program configure"
make >make.log 2>&1 || errexit "building program"

echo "Running program ..." >&2
./tryexe >run.out 2>&1 || errexit "running program"
echo "** Success !! **" >&2
# EOF throwtest.sh

On my system, this yields the following output:

Building library ...
Building program ...
Running program ...
throwtest.sh: line 65: 14430 Aborted                 (core dumped) ./tryexe >run.out 2>&1
** Error running program !! **

The reason is that "-ltrylib" becomes part of the DLL_LINK make variable
and the wrapper app is thus linked with "libtrylink.so". 
If my analysis is correct, this leads to a situation where the
gcc-generated exception code for throw() jumps into the wrapper app rather
than into the wrapped app - i.e. to nowhere.

IMO it makes no sense to include any additional libraries in the link list for
the wrapper app (=> patch). If this isn't done, the test runs fine.

This may point to a conceptual problem with the wrapper app approach,
but at least it seems to run fine with the patch below.


Index: tools/winemaker
===================================================================
RCS file: /home/wine/wine/tools/winemaker,v
retrieving revision 1.47
diff -u -r1.47 winemaker
--- tools/winemaker	10 Sep 2002 00:42:43 -0000	1.47
+++ tools/winemaker	10 Sep 2002 18:21:57 -0000
@@ -1993,7 +1993,11 @@
       } else {
         print FILEO "\t\$(LDSHARED)";
       }
-      print FILEO " \$(LDDLLFLAGS) -o \$\@ \$(${canon}_OBJS) \$(${canon}_SPEC_SRCS:.spec=.spec.o) \$(${canon}_LIBRARY_PATH) \$(${canon}_LIBRARIES:%=-l%) \$(DLL_LINK) \$(LIBS)\n";
+      if (@$target[$T_FLAGS] & $TF_WRAPPER) {
+        print FILEO " \$(LDDLLFLAGS) -o \$\@ \$(${canon}_OBJS) \$(${canon}_SPEC_SRCS:.spec=.spec.o) \$(${canon}_LIBRARY_PATH) \$(${canon}_LIBRARIES:%=-l%) \$(WRAPPER_DLL_LINK) \$(LIBS)\n";
+      } else {
+        print FILEO " \$(LDDLLFLAGS) -o \$\@ \$(${canon}_OBJS) \$(${canon}_SPEC_SRCS:.spec=.spec.o) \$(${canon}_LIBRARY_PATH) \$(${canon}_LIBRARIES:%=-l%) \$(DLL_LINK) \$(LIBS)\n";
+      }
       if (@$target[$T_TYPE] ne $TT_DLL) {
         print FILEO "\ttest -f @$target[$T_NAME] || \$(INSTALL_SCRIPT) wineapploader @$target[$T_NAME]\n";
       }
@@ -3043,6 +3047,7 @@
 ALLCFLAGS = $(CFLAGS) $(CEXTRA) $(OPTIONS) $(ALLFLAGS)
 ALLCXXFLAGS=$(CXXFLAGS) $(CXXEXTRA) $(OPTIONS) $(ALLFLAGS)
 ALLWRCFLAGS=$(WRCFLAGS) $(WRCEXTRA) $(OPTIONS) $(ALLFLAGS)
+WRAPPER_DLL_LINK = $(LIBRARY_PATH) $(WINE_LIBRARY_PATH) -lwine -lwine_unicode -lwine_uuid
 DLL_LINK  = $(LIBRARY_PATH) $(LIBRARIES:%=-l%) $(WINE_LIBRARY_PATH) -lwine -lwine_unicode -lwine_uuid
 LDCOMBINE = ld -r
 LDSHARED  = @LDSHARED@
-- 
Martin Wilck                Phone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1	    mailto:Martin.Wilck at Fujitsu-Siemens.com
D-33106 Paderborn           http://www.fujitsu-siemens.com/primergy








More information about the wine-devel mailing list