g ++ __static_initialization_and_destruction_0 (int, int) - что это - PullRequest
16 голосов
/ 12 марта 2010

После компиляции файла c ++ (с глобальным статическим объектом) я получаю в 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 Ответ

14 голосов
/ 07 марта 2011

Этот файл документа, кажется, говорит вам все, что вы хотите знать об этих функциях: 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 имеет дело с отдельными объектными файлами в архиве, и я думаю, что именно так они не дают компоновщику оптимизировать эти вызовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...