www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 17788] New: MSCOFF: TLS broken when linking with linker from


          Issue ID: 17788
           Summary: MSCOFF: TLS broken when linking with linker from
                    VS2017 15.3.1
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: major
          Priority: P1
         Component: druntime
          Assignee: nobody puremagic.com
          Reporter: r.sagitario gmx.de

When linking with the recent update 15.3.1 of VS2017, TLS ranges are broken:

module tls;
import core.stdc.stdio;

int x = 7;

extern(C) extern
    int _tls_start;
    int _tls_end;

void[] initTLSRanges() nothrow  nogc
    auto pbeg = cast(void*)&_tls_start;
    auto pend = cast(void*)&_tls_end;
    return pbeg[0 .. pend - pbeg];

void main()
    printf("%p: %d\n", &x, x);

    auto r = initTLSRanges();
    printf("%p: %d\n", r.ptr, r.length);

    assert(r.ptr <= &x && &x < r.ptr + r.length);


compile with "dmd -m64 tls.d" or "dmd -m32mscoff tls.d" to produce an
executable that triggers the assert.

This works with older VS linker versions (up to update 2 of VS2017). 

This seems caused by the linker treating _tls_start and _tls_end no longer as
thread local (or rather the segments they are in). TLS segments are no longer a
separate section in the final image, but just part of the DATA section.

Aug 27 2017