我想添加挂钩函数,当共享库卸载时将调用该函数。图书馆是相互依存的。有可能这样做吗?也许海湾合作委员会有标志吗?
我看到了在运行时加载库的类似解决方案,但它不符合我的期望。
答案 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
,而建议使用 前述的构造函数和析构函数,其中包括 优点,允许多次初始化和完成 要成为的功能 定义。