2011-09-23 80 views
5

我有一個dylib,我可以在mac os x上通過注入加載。 構造函數調用效果很好。dylib析構函數不會被調用

__attribute__((constructor)) 
static void initialize() 

但是析構函數不會被調用嗎?因此資源初始化泄漏。

__attribute__((destructor)) 
static void destroy() 
  1. 有,如果應用程序退出dylib被自動卸載?
  2. 如果應用程序退出,注入的dylib會自動卸載嗎?
  3. 我們如何在運行時從應用程序中卸載dylib?作爲它的注入代碼,我可以訪問私人區域。有沒有一個命令來做到這一點?
+0

問題繼續http://stackoverflow.com/q/7553355/802921 – MacGeek

回答

4

1,2:不。當應用程序退出時,庫並沒有真正卸載 - 它們恰好與其他進程一起消失,與其他資源(例如文件句柄,映射內存,插座,)在退出時釋放。

3:取決於你如何注入庫。如果您使用類似dlopen()的文件加載它,則應該能夠使用dlclose()卸載該庫,例如; NSBundle有相同的東西。

請記住,卸載庫是混亂的。尤其是,卸載包含任何ObjC類的庫是不安全的,因爲運行時可能已緩存對類的引用。

相關問題