当前位置: 首页 > 面试题库 >

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

孙泳
2023-03-14
问题内容

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

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


问题答案:

库应该使用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函数被认为已过时。



 类似资料:
  • 我在azurenotification之后添加了azure通知 但是当我加上 如果有错误,请运行应用程序

  • 问题内容: 我有一个SQL Server数据库,当在表中插入时,我想通知android应用程序。 例如,当收到订单时,我将其插入到SQL Server数据库中。我还希望用户在我的应用中收到有关订单的通知。该应用程序始终处于打开状态。我使用Web服务与数据库联系。 我不想每10秒钟左右请求一次表格。还有其他办法吗? 问题答案: 您可以使用Google Cloud消息服务,在此处了解如何设置服务器。

  • 问题内容: sbt将下载的jar放在哪里?我试图让sbt下载所有依赖项并将它们放在lib /目录下,以便可以将它们与ScalaIDE一起使用,但是在成功运行后,我不知道在哪里可以找到这些下载的.jars 问题答案: 默认情况下,所有新的SBT版本(位于之后)都会将下载的JARS放入主目录中的目录中。 如果您使用的是Linux,通常是。 如果您使用Windows,通常是。 编辑: 这是我的一个项目的

  • 问题内容: 我已经用Java编写了Thrift服务器来利用特定的Java包/库,但是我不是Java程序员。 问题是; 我看到对服务器的第一个RPC调用超时。Subsequest请求的执行没有任何问题,它仅影响以某些(但必不可少)语言编写的客户端。 我当前的想法是服务器在响应上超时,因为在第一次调用时,服务器必须加载请求所需的所有库。一些Thrift客户端实现必须比其他实现更好地处理超时,这可能会使

  • 我正在尝试使用JavaCV实现一个简单的人脸识别代码。我有一个错误,但不知道为什么。

  • 在模板文件头部加载标签库: <taglib name="app\portal\taglib\Portal"/> 多个标签库用英文逗号隔开: <taglib name="app\portal\taglib\Portal,app\blog\taglib\Blog"/> 把标签库放在公共头部文件头部,这样就不用每个模板文件写一次标签加载代码了