2012-05-17 88 views
4

據我所知,在退出主函數時,程序(用Linux中的C++編寫)調用__cxa_finalize。我創建一個共享庫並在主函數中使用這個庫。當主程序加載/卸載這個庫時,我想採取一些行動。我發現功能__attribute__可以在創建共享庫時,可以使用用於這一目的(該函數將在共享庫代碼我想實現)__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

回答

2

gcc documentation for constuctor/destructor attribute說:

你可以提供一個可選的整數優先級,以控制其構造和析構函數的運行順序。具有較小優先級編號的構造函數在具有較大優先級編號的構造函數之前運行;相反的關係適用於析構函數。所以,如果你有一個分配資源的析構函數和一個釋放相同資源的析構函數,那麼這兩個函數通常具有相同的優先級。 構造函數和析構函數的優先級與爲命名空間範圍C++對象指定的優先級相同。

在我與當兩者都在同一個翻譯單元,無論聲明/定義的順序C++全局對象的析構函數前後C++全局對象構造函數和析構函數運行gcc-4.7.0但是構造函數的測試。

更新: Ian Lance Taylor報告說,構造函數屬性和C++全局構造函數的執行順序沒有指定。請參閱http://gcc.gnu.org/ml/gcc-help/2012-05/msg00118.html

在C++中,您可以確保某個對象在使用Schwarz Counter慣用語的多個翻譯單元之後在任何其他全局對象之前被初始化並被銷燬。

+0

更明確的說,是否有可能確保在__cxa_finalize之前執行析構函數(my_unload)函數,即破壞全局C++對象?我想停止my_unload函數內的一些線程。 – bugra

+0

嘗試析構函數屬性的優先參數。 –

+0

如何設置優先級?我在Internet上發現的是:void __attribute__((constructor))my_load(void); void __attribute__((destructor(2000)))my_unload(void); __cxa_finalize()__attribute__((init_priority(1999)));在這種情況下,編譯器會提供錯誤:爲析構函數屬性指定的參數數量錯誤。另一點是我應該爲__cxa_finalize設置優先級還是默認優先級?我的gcc版本是4.1.2 – bugra

0

我想在主程序加載/卸載此庫時採取一些操作。

考慮使用靜態類實例來做到這一點,它會更乾淨和便攜。

基本上,你寫了一個類,它在構造函數中進行初始化工作(並在析構函數中完成),然後聲明該類的靜態實例。動態鏈接器然後爲你做所有的事情。

LLVM有很好的class template它使用這種技術來自動管理插件註冊表,我建議從中學習。

相關問題