繁体   English   中英

挂钩函数可共享库卸载

[英]Hook function to shared library unloading

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

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

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中)。

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

初始化和完成功能

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

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

现在不推荐使用_init_fini而推荐使用上述构造函数和析构函数,这些构造函数和析构函数除其他优点外,还可以定义多个初始化和终结函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM