g++ __static_initialization_and_destruction_0(int, int) - 这是什么?

23

在编译带有全局静态对象的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部分中?


2
g++确实有一个-fno-use-cxa-atexit命令行选项,但我认为那并没有帮助。看起来它只是导致使用atexit()而不是cxa_atexit()。也许更好的问题是为什么g++生成__static_initialization_and_destruction_0(),而不是将构造函数和析构函数调用放在.ctors.dtors ELF部分中。这样做肯定有充分的理由。 - Void
1个回答

22

这个文档似乎可以告诉你有关这些函数的所有信息: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必须处理归档文件中的各个对象文件,我认为这就是他们防止链接器优化掉这些调用的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接