All tests pass.  However, I see your problem.

In plaindll.d:

version(GNU){ // Workaround for linker error
        void* _tlsstart; // First symbol of the TLS section
        void* _tlsend;
        //int _tls_callbacks_a; // Workaround for GDC/MinGW linker error
}

_tlsstart is the first symbol of the TLS section. _tlsend is the last symbol of the TLS section. Together they are used by D to identify the TLS memory region for a given thread. If they do not come from TLS memory then things will not work right.

The MinGW runtime has equivalent symbols __tls_start and __tls_end. This is not something likely to change as it's a Windows convention. The version of MinGW/GDC you have should define _tlsstart and _tlsend symbols automatically if WinMain, DllMain or _Dmain functions exist in the current object file.

As of now MinGW/GDC uses alias __tls_start _tlsstart and alias __tls_end _tlsend to satisfy those requirements where necessary.

It's the same with _tls_callbacks_a.  Windows convention specifies __xl_a.

The currently posted MinGW64 binaries have an alignment issue with TLS memory in 64-bit mode. It's a segfault that will manifest in the garbage collector.

I'll release updated binaries tonight.


Reply via email to