__cxa_finalize 和 __attribute__。

4 人关注

据我所知,一个程序(在Linux中用C++编写)在退出主函数时调用 __cxa_finalize 。我创建了一个共享库并在主函数中使用这个库。我想在主程序加载/卸载这个库时采取一些行动。我发现在创建共享库时,函数 __attribute__ 可以用于这个目的(这个函数应该在共享库代码中实现,我想)。

我添加了类似的内容。

void __attribute__ ((constructor)) my_load(void);
void __attribute__ ((destructor)) my_unload(void);

我实现了以下链接中的函数my_load和my_unload。 http://tdistler.com/2007/10/05/implementing-dllmain-in-a-linux-shared-library

问题是,当退出主函数时,这些函数究竟是按什么顺序处理的?是my_unload()函数还是__cxa_finalize

c++
linux
bugra
bugra
发布于 2012-05-17
2 个回答
Maxim Egorushkin
Maxim Egorushkin
发布于 2012-05-19
已采纳
0 人赞同

gcc的构造函数/析构函数属性的文档 说。

你可以提供一个可选的整数优先级来控制构造函数和析构函数的运行顺序。优先级数较小的构造函数在优先级数较大的构造函数之前运行;对于析构函数则是相反的关系。因此,如果你有一个分配资源的构造函数和一个去分配相同资源的析构函数,这两个函数通常有相同的优先级。 构造函数和析构函数的优先级与为命名空间范围的C++对象指定的优先级相同。

在我用gcc-4.7.0进行的测试中,构造函数运行在C++全局对象构造函数之前,而析构函数运行在C++全局对象析构函数之后,当两者处于同一翻译单元时,无论声明/定义的顺序如何。

更新。 Ian Lance Taylor报告说,带有构造器属性的函数和C++全局构造器的执行顺序没有被指定。见 http://gcc.gnu.org/ml/gcc-help/2012-05/msg00118.html

在C++中,你可以确保某些对象在任何其他全局对象之前被初始化,并在多个翻译单元中被销毁,方法是使用 黑色柜台 idiom.

更明确地说,是否有可能确保析构器(my_unload)函数在__cxa_finalize即全局c++对象的销毁之前执行?我想在my_unload函数中停止一些线程。
尝试向析构器属性提供优先级参数。
我怎样才能设定优先次序?我在网上查到的是:无效 归属 ((构造函数)) my_load(void); void 归属 ((destructor (2000))my_unload(void)。 cxa_finalize() __归属 ((init_priority (1999))); The compiler gives an error in such a case: wrong number of arguments specified for destructor 归属. The other point is should I have to set the priority for __cxa_finalize or it has a default priority? My gcc version is 4.1.2
不知道那个版本的gcc是否支持优先级。
ulidtko
ulidtko
发布于 2012-05-19
0 人赞同

我想在主程序加载/卸载这个库时采取一些行动。