Вызывается ли когда-нибудь `__cxa_finalize` с нулевым указателем на практике?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Вызывается ли когда-нибудь `__cxa_finalize` с нулевым указателем на практике?

Сообщение Anonymous »

Программа C++, созданная с помощью GCC, обычно вызывает __cxa_finalize для каждой разделяемой библиотеки в порядке, обратном инициализации, например, при выходе из программы, чтобы уничтожить глобальные переменные и статические локальные функции. Предоставление аргумента __dso_handle гарантирует, например, что локальная статика функции будет уничтожена для каждой общей библиотеки. (Это немного удивительно, поскольку они уничтожаются только в обратном порядке инициализации внутри одной библиотеки, но не в общих библиотеках.)
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.
[...]
ABI Itanium C++ также предлагает возможность вызова __cxa_finalize(nullptr), который очищает все глобальные переменные и локальную для функции статику. Для статики, локальной для функции, это приведет к другому порядку уничтожения, поскольку теперь они будут уничтожаться в порядке, обратном инициализации, даже в общих библиотеках.
Меня немного беспокоят два разных порядка уничтожения. Есть ли случаи, когда __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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»