簡體   English   中英

dylib如何卸載自己?

[英]How can dylib unload itself?

我想了解使用dylib並仍在學習的一些事情,所以如果我問愚蠢的問題,請原諒。

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

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

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

我在幾個鏈接上看到,可以從自身卸載一個libray。 但它適用於Windows。 Lib卸載自己

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

對於Windows,請在此處查看有關FreeLibraryAndExitThread函數的答案 ,以便正確執行此操作。 我假設其他系統中有類似的功能。
正如我所說,在這種情況下調用FreeLibrary是一種錯誤的方法 - 從MSDN:“如果他們分別調用FreeLibrary和ExitThread,就會存在競爭條件。在調用ExitThread之前可以卸載庫。” 作為一個評論,除了從線程函數返回之外,ExitThread還會進行一些簿記。

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

您引用的鏈接描述了DLL注入 ,這是DLL的代碼作為進程的地址空間的一部分加載的地方,用於攔截進程對其他“合法”DLL中的函數進行的調用。 它通常以“秘密”的方式完成。 即調用被攔截和重新路由的進程不知道DLL注入。

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

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

簡短的回答是,是的,如果你明確加載它,你可以卸載DLL。 只要仔細考慮什么時候卸載它的最佳時機。

視窗:

LoadLibrary()
FreeLibrary()
GetProcAddress()

在Unix / Linux:

dlopen()
dlclose()
dlsym()

PS:我在答案中使用一個術語DLL來引用Windows和Linux上的共享庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM