2012-01-05 41 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除了从线程函数返回之外还做了一些记录。