【问题标题】:g++ __static_initialization_and_destruction_0(int, int) - what is itg++ __static_initialization_and_destruction_0(int, int) - 它是什么
【发布时间】:2011-01-26 22:19:43
【问题描述】:

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

【问题讨论】:

  • g++ 确实有一个 -fno-use-cxa-atexit 命令行选项,但我认为这不会有帮助。看起来它只是导致使用atexit() 而不是cxa_atexit()。也许要问的更好的问题是为什么 g++ 一开始就生成__static_initialization_and_destruction_0() 而不是在.ctors.dtors ELF 部分中放置构造函数和析构函数调用。大概有一个很好的理由。

标签: c++ constructor g++ destructor


【解决方案1】:

这个 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 必须处理存档中的单个目标文件,我认为这就是它们阻止链接器优化这些调用的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多