[cxx-abi-dev] Adding __cxa_thread_atexit() to the C++ ABI?

Matthew Dempsky matthew at dempsky.org
Tue May 13 18:52:08 UTC 2014


On Mon, May 12, 2014 at 11:26 AM, Jason Merrill <jason at redhat.com> wrote:
> "The effect of dlclosing a DSO with registered thread cleanups is
> undefined."

Do you mean "undefined" as in the C++ standard nasal demons sense, or
just unspecified/implementation-defined?

> That seems reasonable, I was just trying to allow for implementations that
> don't have any way to implement that, because they can't change the dynamic
> loader.

That's fair, though I'd argue that's the burden of the implementation
to push for appropriate mechanisms in their dependencies to implement
the needed functionality.  Are there platforms + toolchain
combinations where this is unreasonable?  E.g., a couple
implementation possibilities I see (assuming appropriate
platform-specific extensions are available):

 1. Implement __cxa_thread_atexit directly in the dynamic linker
(e.g., basically what glibc does with __cxa_thread_atexit_impl).

 2. Use dladdr() to find dli_fname for dso_handle, and then use
dlopen() on that filename and take advantage of the implicit refcount
from using dlopen(); when the thread destructor runs, use dlclose() to
release the refcount.

 3. Mark any DSOs that use __cxa_thread_atexit() as DF_1_NODELETE in
DT_FLAGS_1, to ensure they won't be deleted and the thread-local
registration will remain valid.  (Obvious consequence is this prevents
the DSO's resources from being freed prior to process termination.)


More information about the cxx-abi-dev mailing list