挂钩函数可共享库卸载

时间:2018-09-28 08:43:57

标签: linux elf dynamic-linking

我想添加挂钩函数,当共享库卸载时将调用该函数。图书馆是相互依存的。有可能这样做吗?也许海湾合作委员会有标志吗?

我看到了在运行时加载库的类似解决方案,但它不符合我的期望。

2 个答案:

答案 0 :(得分:2)

Solaris和GNU / Linux在其动态链接器中支持LD_AUDIT接口。您需要加载一个实现la_objclose回调函数的审计模块:

实现可以像这样简单:

unsigned int
la_objclose  (uintptr_t *cookie)
{
  printf ("objclose\n");
  return 0;
}

为了确定哪个对象被关闭,您还需要实现la_objsearch(可能还有la_objopen),以建立cookie值,该cookie值以某种方式引用您在关闭时需要的信息(您可以在Cookie中存储指向堆分配结构的指针。)

答案 1 :(得分:0)

对于Linux系统,dlopen() / dlclose()手册页介绍了如何向您的库中添加这样的功能:

  

初始化和完成函数

     

共享对象可以使用__attribute__((constructor))和   __attribute__((destructor))个函数属性。构造函数在dlopen()返回之前执行,而析构函数   函数在dlclose()返回之前执行。共享对象可以   导出多个构造函数和析构函数,优先级可以是   与每个功能相关联,以确定          它们执行的顺序。有关更多信息,请参见gcc信息页面(在“函数属性”下)。

     

(部分)获得相同结果的较旧方法是通过   使用链接器识别的两个特殊符号:_init和   _fini。如果动态加载的共享库导出名为_init()的例程,则该代码在加载共享库后执行   dlopen()返回之前的对象。如果共享对象导出一个   名为_fini()的例程,然后在   对象已卸载。在这种情况下,必须避免与   系统启动文件,其中包含这些文件的默认版本;   这可以通过使用gcc(1)-nostartfiles命令行来完成   选项。

     

现在不赞成使用_init_fini,而建议使用   前述的构造函数和析构函数,其中包括   优点,允许多次初始化和完成   要成为的功能          定义。