[英]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.