I spent a time with the patch.
WRT the functional part of the patch, main observation that I have is that there is no reason to leave failed destructor records on the list. It is required to leave them for atexit handler, from where the code seems to be copied, but for the cxa_thread the end result is memory leak. If all records, both succeeded and failed, are removed during the pass, we can get without the list generation at all: restart is needed iff the list is not empty after the iterator finished. For the same reason, if we maxed our attempts count, the list still must be cleared, but now without the destructor calls.
I also reworded and reformatted comments, and did some minor but numerous editorial changes.
I added several more tests. The biggest omission was the lack of the test which does not link libthr into the address space. Another good to have test is the explicit infinite destructor stream, to check the CXA_DTORS_ITERATIONS logic.
Please read and confirm that you are fine with the updated patch. I will check universe build after your confirmation and then commit.