dylib如何卸载自己?

时间:2012-01-05 10:52:08

标签: c++ c macos dylib

我想了解使用dylib并仍在学习的一些事情,所以如果我问愚蠢的问题,请原谅。

  1. 通过dlopen()加载的lib是否可以自行卸载?
  2. 实施例。在下面的代码中,我们可以只执行hello()代码,然后在最后卸载它。

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

    我在几个链接上看到,可以从自身卸载一个libray。但它适用于Windows。 Lib unload itself

    2。另一个进程可以卸载在某个xyz进程中注入的库吗?

2 个答案:

答案 0 :(得分:1)

DLL可能会卸载自身,但如果该进程稍后调用DLL中的函数,则可能导致合法加载DLL的进程崩溃。

您引用的链接描述 DLL注入,这是DLL的代码作为进程的地址空间的一部分加载的地方,用于拦截进程对其他函数的调用“合法”的DLL。它通常以“秘密”的方式完成。即调用被拦截和重新路由的进程不知道DLL注入。

因此链接指的是在极少数情况下使用的高级内容。

如果加载的DLL引发异常,您还想知道该怎么做。您应该能够捕获它,但可能没有必要卸载DLL。所有平台上都有 操作系统特定的调用来卸载共享库。所以,是的,你可以做到。但是,卸载DLL只是因为它抛出异常是不常见的。它通常工作正常但如果你的进程中的另一个线程仍在使用该DLL中的代码(这显然需要注意),则会导致问题。

简短的回答是,是的,如果您明确加载了DLL,则可以卸载它。只要仔细考虑何时是卸载它的最佳时间。

视窗:

LoadLibrary()
FreeLibrary()
GetProcAddress()

Unix / Linux中:

dlopen()
dlclose()
dlsym()

PS:我在答案中使用了一个术语 DLL 来引用Windows和Linux上的共享库。

答案 1 :(得分:1)

对于Windows,请参阅my answer here有关 FreeLibraryAndExitThread 的功能,以便正确执行此操作。我假设其他系统中有类似的功能。
由于我没有理解,在这种情况下调用 FreeLibrary 是一种错误的方法 - 从MSDN:“如果他们分别调用FreeLibrary和ExitThread,就会存在竞争条件。可以在调用ExitThread之前卸载库。“作为一个评论,除了从线程函数返回外,ExitThread还会进行一些簿记。