c – __cxa_finalize和__attribute__

c – __cxa_finalize和__attribute__,第1张

概述据我所知,一个程序(在 Linux中用C编写)在退出main函数时调用__cxa_finalize.我创建了一个共享库,并在main函数中使用了这个库.我想在主程序加载/卸载此库时采取一些 *** 作.我发现函数__attribute__可以在创建共享库时用于此目的(这个函数应该在我猜的共享库代码中实现) 我添加了像: void __attribute__ ((constructor)) my_load( 据我所知,一个程序(在 Linux中用C编写)在退出main函数时调用__cxa_finalize.我创建了一个共享库,并在main函数中使用了这个库.我想在主程序加载/卸载此库时采取一些 *** 作.我发现函数__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?

解决方法 gcc documentation for constuctor/destructor attribute说:

You may provIDe an optional integer priority to control the order in which constructor and destructor functions are run. A constructor with a smaller priority number runs before a constructor with a larger priority number; the opposite relationship holds for destructors. So,if you have a constructor that allocates a resource and a destructor that deallocates the same resource,both functions typically have the same priority. The prioritIEs for constructor and destructor functions are the same as those specifIEd for namespace-scope C++ objects.

在我使用gcc-4.7.0的测试中,构造函数在C全局对象构造函数之前运行,而在C全局对象析构函数之后运行析构函数,当两者都在同一个转换单元中时,无论声明/定义的顺序如何.

更新:Ian Lance Taylor报告未指定使用构造函数属性和C全局构造函数执行函数的顺序.见http://gcc.gnu.org/ml/gcc-help/2012-05/msg00118.html

在C中,您可以确保某个对象在任何其他全局对象之前被初始化,并在使用Schwarz Counter惯用法在多个翻译单元之后被销毁.

总结

以上是内存溢出为你收集整理的c – __cxa_finalize和__attribute__全部内容,希望文章能够帮你解决c – __cxa_finalize和__attribute__所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存