2012-01-05 42 views
0

我想了解一些關於使用dylib並仍在學習的東西,所以請問如果我問愚蠢的問題。dylib如何卸載自己?

  1. 是否有可能通過dlopen()加載lib來卸載它自己?

Ex。在下面的代碼中,我們可以只執行hello()代碼,然後在最後卸載它。

__attribute__((constructor)) 
static void hello() 
{ 
    // get handle to this dylib some how ??? 
    // some how unload itself ???? 
} 

我在幾個鏈接上看到過,它可以從本身卸載一個libray。但它是用於窗戶的。 Lib unload itself

2。另一個進程可以卸載在某些xyz進程中注入的庫嗎?

回答

1

DLL有可能自己卸載,但如果該進程稍後調用DLL中的函數,則可能導致合法加載DLL的進程崩潰。

你指的是鏈接介紹DLL注射這是其中一個DLL的代碼被加載爲一個過程的,以攔截呼叫的方法使得以功能在其他「合法」的DLL的地址空間的一部分。它通常以「祕密」的方式完成。即其呼叫被攔截和重新路由的進程不知道DLL注入。

所以鏈接指的是在極少數情況下使用的高級內容。

您也在想如果您加載的DLL引發異常該怎麼辦。您應該能夠捕獲它,但可能不需要卸載該DLL。有操作系統特定的調用在所有平臺上卸載共享庫。所以,是的,你可以做到。然而,僅僅因爲它拋出一個異常而卸載一個DLL是不常見的。它通常工作正常,但如果您的進程中的另一個線程仍在使用該DLL中的代碼(這顯然必須知道),則會導致問題。

簡短的回答是,如果你明確地加載了DLL,你可以卸載DLL。請仔細考慮何時是卸載它的最佳時機。

的Windows:

LoadLibrary() 
FreeLibrary() 
GetProcAddress() 

的Unix/Linux:

dlopen() 
dlclose() 
dlsym() 

PS:我用的一個詞,DLL在我的答案是指在Windows和Linux共享庫。

+0

我實際上是試圖卸載注入的dylib。我無法使用dlclose()和dlsym(),而無需處理它。因此,我想要做一些像我之前提到的鏈接所做的事情。但是對於OS X. – MacGeek 2012-01-05 11:45:56

+0

現在比較困惑。是否需要卸載注入的dynlib?或者讓另一個流程去做,或者讓dynlib去做。我以爲你也想讓dynlib卸載它自己?我建議重新審視這個問題,以使其更加明確。 – ScrollerBlaster 2012-01-05 12:01:11

+0

我會更新問題 – MacGeek 2012-01-05 12:26:35

1

對於Windows,請參閱my answer here關於FreeLibraryAndExitThread正確執行此操作的功能。我假設在其他系統中有類似的功能。
因爲我沒有看到它,所以在這種情況下調用FreeLibrary是一個錯誤的方法 - 從MSDN:「如果他們分別調用FreeLibrary和ExitThread,競爭條件就會存在。在ExitThread被稱爲「。作爲一個評論,ExitThread除了從線程函數返回之外還做了一些記錄。