一尘不染

linux dlopen:可以在加载库时“通知”库吗?

linux

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

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


阅读 180

收藏
2020-06-03

共1个答案

一尘不染

库应该使用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__((constructor))附加到加载共享库时要调用的函数即可。上面的文档还指出,较旧的_ini和_fini函数被认为已过时。

2020-06-03