__do_global_dtors_aux和__do_global_ctors_aux

时间:2011-06-25 11:41:32

标签: c++ assembly constructor destructor elf

我反汇编了一个用C ++编写的简单程序,并且有这两个函数名。我猜ctor意味着构造函数,dtor意味着析构函数,而word global可能意味着它们创建并销毁全局对象。我无法猜出这个名字。这两个功能有什么作用?

2 个答案:

答案 0 :(得分:18)

静态对象的构造函数析构函数的地址分别存储在 ELF可执行文件的不同部分中。对于构造函数,有一个名为 .CTORS 的部分,对于析构函数,有 .DTORS 部分。

编译器创建两个辅助函数 __ do_global_ctors_aux __ do_global_dtors_aux ,分别用于调用这些静态对象的构造函数和析构函数。

__ do_global_ctors_aux 功能只是在 .CTORS 部分执行,而 __ do_global_dtors_aux 仅针对执行相同的工作。 DTORS 部分,其中包含指定析构函数的程序。

答案 1 :(得分:9)

它们是编译器添加的辅助函数,用于构造和销毁静态对象。

e.g。

std::vector<int> some_global;

int main() { return 0; }

some_global需要在某处实际构造(和破坏),C ++保证构造发生在main之前。一种方法是发出一个函数,它发生在构造全局对象的main之前,以及在main之后发生的另一个函数来销毁它们。

如果你在std::vector构造函数中插入了一个断点并运行了这个程序,那么堆栈跟踪会显示它正在初始化的函数。