On 11/11/13, Kai Tietz <ktiet...@googlemail.com> wrote:
> Hello Sergei,
>
> 2013/11/11 Sergei Antonov <sap...@gmail.com>:
>> 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.
>
> Hmm, this is indeed interesting.  The underlying issue is here that on
> program-shutdown the emulTLS-destruction code in libgcc is called
> before TLS-hooks are ...
> In our startup-code/runtime library-code we don't call TlsFree
> ourself.  So within the routine __mingwthr_run_key_dtors we try to get
> the key-value of the key_dtor_list for calling the destructor.
>
> Of interest is here one point.  Are we already asserting in call of
> mingwthr_run_key_dtors in __mingw_TLScallback by the reason-value of
> DLL_PROCESS_DETACH, or by DLL_THREAD_DETACH?
>
> It might be that the call for DLL_PROCESS_DETACH we shouldn't do, as
> before the thread should have already be detached ...  at least worth
> a try.
>
> Regards,
> Kai

What is the status of this issue?

--
O.S.

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their 
applications. Written by three acclaimed leaders in the field, 
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to