28

在 *nix .so 库中,在加载和卸载库时是否有系统调用的入口点?

更实用的一点是:如果 .so 是用 C++ 编写的,并且它包含带有构造函数和析构函数的全局对象,并且它是从没有构造/销毁概念的语言加载的,那么全局对象是否正确构造/销毁?

4

3 回答 3

23

您可以使用 __attribute__((constructor))__attribute__((destructor))在共享库的加载和卸载时执行代码。

于 2012-09-17T17:08:23.903 回答
20
  1. 不,没有等效于 DllMain。

  2. 对于 JNI 库,例如在 Android 上,可能有一个特殊的条目 JNI_OnLoad 旨在填充 JNI 函数表。

  3. GCC 定义了特殊的属性构造函数来允许一些代码在共享库加载时运行。

  4. C++ 保证将执行全局和静态对象的构造函数,无论加载 .so 的代码是否知道这些类,或者是否具有构造概念。

    析构函数也是如此,但是当至少某些析构函数没有机会运行时,可能会出现不愉快的情况 - 例如,当存在 sigfault 并且异常被禁用时。

于 2012-09-17T17:03:41.703 回答
6

使用的技术略有不同,但全局对象的构造/销毁或多或少内置于动态加载器中。(即使在 Windows 下,也不需要经过 DllMain. 无论如何,全局对象将被正确构造/破坏。)

于 2012-09-17T16:47:53.527 回答