G++ __static_initialization_and_destruction_0 (int, int) - что это такое

После компиляции файла С++ (с глобальным статическим объектом) я получаю в nm вывод этой функции:

 00000000 t _Z41__static_initialization_and_destruction_0ii

 __static_initialization_and_destruction_0(int, int)  /* after c++filt */

Что это? Он назовет __cxa_atexit()

Можно ли отключить генерацию этой функции (и вызвать __cxa_atexit()) и поместить все вызовы конструктора и деструктора в разделы .ctors и .dtors?

Ответы

Ответ 1

Этот файл doc, кажется, говорит вам, что вы хотите узнать об этих функциях: http://www.nsnam.org/docs/linker-problems.doc

Из того, что я могу получить, gcc создает __static_initialization_and_destruction_0 для каждой единицы перевода, для которой требуются статические конструкторы. Затем он помещает __do_global_ctors_aux в раздел .ctors, который затем вызывает __static_initialization_and_destruction_0 на каждой единицы перевода.

Проблема, кажется, намного сложнее, чем это; gcc имеет дело с отдельными объектными файлами в архиве, и я думаю, что именно так они не позволяют компоновщику оптимизировать эти вызовы.