https://elixir.bootlin.com/glibc/glibc- ... lize.c#L44
Код: Выделить всё
[...] GCC
calls the glibc variant directly from its CRT files, from an ELF
destructor. this call always passes a non-null D argument.
[...]
Меня немного беспокоят два разных порядка уничтожения. Есть ли случаи, когда __cxa_finalize(nullptr) вызывается на практике?
Временное дополнение перед переписыванием вопроса или ответа:
Кажется, ситуация более запутанная, чем я предполагал. Если библиотека деинициализируется как часть выхода(), то __run_exit_handlers() уничтожает ее локальную для функции статику. При этом обработчики выхода повторяются в порядке, обратном их регистрации, независимо от границ разделяемой библиотеки.
Если, тем не менее, вы выполняете dlclose() библиотеку, то вызывается _dl_call_fini(), который вызывает __do_global_dtors_aux(), который вызывает __cxa_finalize(), который уничтожает локальную для функции статику per библиотека.
В первом случае (без dlclose()) __cxa_finalize() также вызывается как часть __run_exit_handlers, но позже - только после того, как локальная для функции статика уже уничтожена.
Подробнее здесь: https://stackoverflow.com/questions/798 ... n-practice
Мобильная версия