编译完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部分吗?

最佳答案

该文档文件似乎告诉您所有您想要了解的有关这些功能的信息: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必须处理存档中的单个目标文件,我认为这是它们如何防止链接程序优化这些调用的方式。

08-16 08:48