13

有没有办法让共享库在加载时得到“通知”?

换句话说,假设我在共享库上使用dlopen,是否有一个在共享库上自动调用(如果存在)的函数(例如 main?)

4

3 回答 3

22

库应该使用 gcc __attribute__((constructor)) 和 __attribute__((destructor)) 函数属性导出初始化和清理例程。有关这些信息,请参阅 gcc 信息页面。构造函数例程在 dlopen 返回之前执行(或者如果在加载时加载库,则在启动 main() 之前)。析构函数例程在 dlclose 返回之前执行(如果库在加载时加载,则在 exit() 或 main() 完成之后)执行。这些函数的 C 原型是:

 void __attribute__ ((constructor))  my_init(void);  
 void __attribute__  ((destructor)) my_fini(void);

取自http://tldp.org/HOWTO/Program-Library-HOWTO/index.html

也就是说,您只需将 __attribute__ ((constructor)) 添加到要在加载共享库时调用的函数。上述文档还指出,较旧的 _ini 和 _fini 函数被认为已过时。

于 2009-10-21T17:55:19.733 回答
17

是的。当打开一个库时,所有的静态构造都会发生......所以,如果你使用 C++,你可以这样做:

// mylibrary.cpp
命名空间
{
    类 dynamic_library_load_unload_handler
    {
         上市:
              动态库加载卸载处理程序(){
                    // 加载库时执行的代码
              }
              ~dynamic_library_load_unload_handler(){
                    // 卸载库时执行的代码
              }
    } dynamic_library_load_unload_handler_hook;
}

__attribute__ ((constructor))给出的解决方案不同,这将是可移植的。但是请注意,如果您有多个这样的对象,则无法保证构造/销毁顺序。

于 2009-10-21T20:29:10.910 回答
0

至少在 Linux 上,可能至少在其他一些 Unix 系统上,如果库是动态打开的,一个名为 的全局函数_init(如果存在)将由动态链接器调用。

于 2009-10-21T17:45:59.303 回答