Hello!
I'm using Mingw-w64 3.0 release compiled with gcc-4.7.2. This is my test pogram:

=======================================
#include <windows.h>
#include <tchar.h>

struct S {
  S() {
    OutputDebugString("test ctor");
  }
  ~S() {
    OutputDebugString("test dtor");
  }
};

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow) {
  static S s; // <=== this will have to be destroyed on program exit
  return 0;
}
=======================================

Compilation command:
x86_64-w64-mingw32-g++ -m32 -static test.cpp -o test.exe

I test the resultant .exe using Dr. Memory - an analog of valgrind for
Windows ( http://drmemory.org/ ). It finds an error:

D:\>Programs\DrMemory-Windows-1.6.0-2\bin\drmemory.exe -- D:\test.exe
~~Dr.M~~ Dr. Memory version 1.6.0
~~Dr.M~~ Running "D:\test.exe"
~~Dr.M~~
~~Dr.M~~ Error #1: UNADDRESSABLE ACCESS: reading 0x7efdde1c-0x7efdde20 4 byte(s)
~~Dr.M~~ # 0 KERNELBASE.dll!TlsGetValue                        +0x17
  (0x75d53c24 <KERNELBASE.dll+0x13c24>)
~~Dr.M~~ # 1 __mingwthr_run_key_dtors.part.0
[../crt/tlsthrd.c:108]
~~Dr.M~~ # 2 __mingw_TLScallback
[../crt/tlsthrd.c:129]
~~Dr.M~~ # 3 ntdll.dll!RtlUlonglongByteSwap                    +0x7a8
  (0x77b4dc49 <ntdll.dll+0x7dc49>)
~~Dr.M~~ # 4 ntdll.dll!wcscspn                                 +0x251
  (0x77b40a91 <ntdll.dll+0x70a91>)
~~Dr.M~~ # 5 ntdll.dll!RtlExitUserProcess                      +0x73
  (0x77b1d5a4 <ntdll.dll+0x4d5a4>)
~~Dr.M~~ # 6 KERNEL32.dll!ExitProcess                          +0x14
  (0x75a179c5 <KERNEL32.dll+0x179c5>)
~~Dr.M~~ # 7 msvcrt.dll!__crtExitProcess
~~Dr.M~~ # 8 msvcrt.dll!_cinit
~~Dr.M~~ # 9 msvcrt.dll!exit
~~Dr.M~~ #10 _fu0___set_invalid_parameter_handler
[../crt/crtexe.c:335]
~~Dr.M~~ #11 KERNEL32.dll!BaseThreadInitThunk                  +0x11
  (0x75a1336a <KERNEL32.dll+0x1336a>)
~~Dr.M~~ Note: @0:00:01.194 in thread 4132
~~Dr.M~~ Note: instruction: mov    0x00000e10(%eax,%ecx,4) -> %eax
~~Dr.M~~
~~Dr.M~~ ERRORS FOUND:
~~Dr.M~~       1 unique,     1 total unaddressable access(es)

This error only happens for .exe compiled with -static.
The reason is that TlsGetValue is called for an index *after* it has
already been freed with TlsFree. I verified this by patching out a
call to TlsFree in the binary - no error happened for the patched
binary.

So this -static mode reverse sequence of operation has to be fixed.
Unfortunately, I cannot provide a patch since I don't understand the
code well enough.

------------------------------------------------------------------------------
November Webinars for C, C++, Fortran Developers
Accelerate application performance with scalable programming models. Explore
techniques for threading, error checking, porting, and tuning. Get the most 
from the latest Intel processors and coprocessors. See abstracts and register
http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to