【发布时间】:2012-09-09 22:22:50
【问题描述】:
在 *nix .so 库中,是否存在在加载和卸载库时由系统调用的入口点?
更实用的一点是:如果 .so 是用 C++ 编写的,并且它包含带有构造函数和析构函数的全局对象,并且它是从没有构造/析构概念的语言加载的,那么全局对象是否正确构造/析构?
【问题讨论】:
标签: c++ shared-libraries shared-objects
在 *nix .so 库中,是否存在在加载和卸载库时由系统调用的入口点?
更实用的一点是:如果 .so 是用 C++ 编写的,并且它包含带有构造函数和析构函数的全局对象,并且它是从没有构造/析构概念的语言加载的,那么全局对象是否正确构造/析构?
【问题讨论】:
标签: c++ shared-libraries shared-objects
使用的技术略有不同,但
全局对象的构造/销毁或多或少内置于
动态加载器。 (即使在windows下也不需要经过
DllMain。全局对象将被正确构造/破坏
无论如何。)
【讨论】:
不,没有等效于 DllMain。
对于 JNI 库,例如在 Android 上,可能有一个特殊的入口 JNI_OnLoad 用于填充 JNI 函数表。
GCC 定义了特殊属性 constructor 以允许某些代码在共享库加载时运行。
C++ 保证将执行全局和静态对象的构造函数,无论加载 .so 的代码是否知道这些类,或者有构造概念。
同样适用于析构函数,但是当至少一些析构函数没有机会运行时,可能会出现不愉快的情况——例如当存在 sigfault 并禁用异常时。
【讨论】:
DllMain)。
__attribute__((constructor)) 的函数将在dlopen() 返回之前执行。
您可以使用__attribute__((constructor)) 和__attribute__((destructor)) 在共享库的加载和卸载时执行代码。
【讨论】: