Linux的dlopen:一个库可以“加载时通知”?

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

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

库应该使用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__((构造函数))上加载你想要在共享库加载时调用的函数。 上述文件还指出,旧的_ini和_fini函数被认为是过时的。

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

 // mylibrary.cpp
命名空间
 {
    类dynamic_library_load_unload_handler
     {
         上市:
               dynamic_library_load_unload_handler(){
                     //加载库时执行的代码
               }
               〜dynamic_library_load_unload_handler(){
                     //在卸载库时执行的代码
               }
     } dynamic_library_load_unload_handler_hook;
 }

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

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