phosek added a comment.
In D59264#1428785 <https://reviews.llvm.org/D59264#1428785>, @MaskRay wrote:
> > A nonzero __dso_handle has to match the value passed to __cxa_atexit but a
> > zero __dso_handle matches every function registered. So it matters that DSO
> > fini calls use &__dso_handle to match their registrations for the dlclose
> > case
>
> Yes, but this won't matter if we change `void *__dso_handle = 0;` to `void
> *__dso_handle = &__dso_handle;`.
>
> static void __do_global_dtors_aux() { // static void __do_fini() in D28791
> if (__cxa_finalize)
> __cxa_finalize(__dso_handle); // what happens if we change `void
> *__dso_handle = 0;` to `void *__dso_handle = &__dso_handle;`.
> ...
> }
>
>
> exit calls `__run_exit_handlers`, which goes through `__exit_funcs` and calls
> the hooks one by one. `_dl_fini` is the last in the list because
> `__cxa_atexit(_dl_fini,0,__dso_handle)` runs before other atexit registered
> functions.[1]
>
> `__do_global_dtors_aux` is called by `_dl_fini`. When it gets called and it
> calls `__cxa_finalize(0)`, other atexit registered functions have run, thus
> __cxa_finalize(0) will do nothing.
>
> The differentiation of `crtbegin.o crtbeginS.o` is unnecessary. It adds
> complexity for little size benefit (crtbegin.o is a bit smaller than
> crtbeginS.o).
> While we are adding support for crtbegin.o, it'd be really good to get this
> fixed.
>
> [1]: If a shared object has a constructor that calls `__cxa_atexit`,
> `__cxa_atexit(_dl_fini,...)` will not be the first. [2]
>
> [2]: If you try really hard you can break that in glibc (but not in FreeBSD
> libc), but I'll call that an unsupported land as functions in the main
> executable (`register_in_exe`) shouldn't be called before it is initialized:
> `__attribute__((constructor)) void init_in_dso() { register_in_exe();
> atexit(fini_in_dso); }`
> Moreover, if you have several DSOs, the global reverse order of
> `atexit`-registered functions won't be guaranteed.
> `__cxa_finalize(__dso_handle in exe)` `__cxa_finalize(__dso_handle in b.so)`
> `__cxa_finalize(__dso_handle c.so)`
I sent an email to glibc maintainers to clarify their position on this:
https://sourceware.org/ml/libc-alpha/2019-04/msg00028.html. If they're fine
with this change, I'll update the implementation as you suggested.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D59264/new/
https://reviews.llvm.org/D59264
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits