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