2010-03-12 438 views
15

C++文件的编译(全球静态对象),我在nm输出获得此功能后:克++ __static_initialization_and_destruction_0(INT,INT) - 什么是

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 2011-03-04 21:35:23

回答

14

这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必须处理归档中的单个对象文件,我认为这是他们如何阻止链接器优化这些调用。

相关问题