Segfault when adding a static destructor in druntime/src/rt/sections_elf_shared.d

RazvanN razvan.nitu1305 at gmail.com
Tue Jan 8 12:54:11 UTC 2019


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


More information about the Digitalmars-d-learn mailing list