From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Thomas Pfaff" To: , Subject: mingw32 DLLs, threads and exceptions HOWTO Date: Thu, 07 Dec 2000 02:15:00 -0000 Message-id: <002c01c06036$827a7da0$69856286@pcs.ditec.de> X-SW-Source: 2000/msg00136.html Dear all, this is a summary that should help users to have thread safe exception handling over DLL exported functions. If you don't care about c++ exceptions you can stop reading here. The first time i struggled with c++ exceptions was when i tried to throw an exception in a dll exported function where the exception handler resides in the program module. Instead of catching the exception the program stopped with an abnormal termination. The reason was that the exception code is in libgcc.a. Since this is a static library the code and some static variables are both in the dll and in the program module, each module runs in its own context. It was Franco Bez that pointed me in the right direction, that is convert libgcc.a into a dll. That done i tried to build the pthreads-win32 library, but some tests failed with an access violation. Due to the fact that the dll was not build was -mthreads support, eh_context_static instead of eh_context_specific (the mthreads version) was used for exception handling. I did a rebuild of the gcc dll with -mthreads, now all tests are passed (except a nonportable exception test that relies on a MSVC feature). To build the gcc dll i did the following steps. 1. create a temporary directory libgcc 2. copy libgcc.a from gcc-2.95.2\lib\gcc-lib\i386-mingw32\gcc-2.95.2 to that directory 3. ar -x libgcc.a 4. create a directory tmp and move __main.o, _exit.o and __dummy.o in that directory 5. build the dll gcc -shared -mthreads -o gcc.dll *.o strip gcc.dll Move this dll into your gcc\bin directory 6. Move _chkstk.o and frame.o to the tmp directory, otherwise you break the builtin alloca. 7. Build the import library libgcc.a dllwrap --export-all --dllname=gcc.dll --output-def=libgcc.def --output-lib= libgcc.a *.o ar -q libgcc.a tmp/*.o strip --strip-debug libgcc.a ranlib libgcc.a 8. save your old libgcc.a, copy the new libgcc.a into gcc-2.95.2\lib\gcc-lib\i386-mingw32\gcc-2.95.2 I am using gcc-2.95.2-1 with Mumits patched binutils-19990818-1and msvcrt runtime-2000-03-27. I don't know if this is still required with the current binutils and gcc since i have seen no sources until now. I believe that these steps are at least necessary if you are trying to use the pthreads-win32 library (which is required if you want to use gtk+ on win32). They will make mingw32 a real replacement for MSVC (at least for me). What is left: 1. Include the mingwm10.dll function into the gcc.dll to have only one dll left. 2. make -mthreads and -fnative-struct default compiler options. 3. convert libstdc++ to a dll by adding the declspec dllexport and dllimport to every class definition. Regards, Thomas