Hi all,

I am working on issue 14650 [1] and I would like to implement a solution where static destructors are destroying global variables. However, I have the following problem in druntime/src/rt/sections_elf_shared:

struct ThreadDSO
{
    DSO* _pdso;
    static if (_pdso.sizeof == 8) uint _refCnt, _addCnt;
    else static if (_pdso.sizeof == 4) ushort _refCnt, _addCnt;
    else static assert(0, "unimplemented");
    void[] _tlsRange;
    alias _pdso this;
    // update the _tlsRange for the executing thread
    void updateTLSRange() nothrow @nogc
    {
        _tlsRange = _pdso.tlsRange();
    }
}
Array!(ThreadDSO) _loadedDSOs;


For this code, I would have to create the following static destructor:

static ~this() { _loadedDSOs.__dtor(); }

Because Array defines a destructor which sets its length to 0.

However this code leads to segfault when compiling any program with the runtime (betterC code compiles successfully). In my attempt to debug it, I dropped my patch and added the above mentioned static destructor manually in druntime which lead to the same effect. Interestingly, _loadedDSOs.__dtor runs successfully, the segmentation fault comes from somewhere higher in the call path (outside of the _d_run_main function (in rt/dmain2.d)). I'm thinking that the static destructor somehow screws up the object which is later referenced after the main program finished executing. Does someone well versed in druntime has any ideas what's happening?

Cheers,
RazvanN



[1] https://issues.dlang.org/show_bug.cgi?id=14650

Reply via email to