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