Segfault when adding a static destructor in druntime/src/rt/sections_elf_shared.d
Steven Schveighoffer
schveiguy at gmail.com
Thu Jan 10 15:04:25 UTC 2019
On 1/8/19 7:54 AM, RazvanN wrote:
> 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?
That is a thread-local static destructor. Are any shared static
destructors accessing the array?
You might be able to determine this by printf debugging between calling
unshared and shared destructors.
-Steve
More information about the Digitalmars-d-learn
mailing list