首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时确定使用了哪个版本的libc-lock.h : NPTL还是存根?

如何在运行时确定使用了哪个版本的libc-lock.h : NPTL还是存根?
EN

Stack Overflow用户
提问于 2014-12-12 11:39:37
回答 2查看 301关注 0票数 1

我有使用线程的共享库。假设这是一个主要应用程序的插件。我不能更改这个主应用程序,并且只能访问我的共享库。主应用程序可以与ptread链接,也可以不与p线程链接。因此,取决于此,它将使用线程安全版本libc-lock.h或不使用线程安全。

滑翔

因此,如果主应用程序已经加载了非线程安全版本的libc-lock.h应用程序,则只会出现分段错误,因为我的库主动使用线程。

我想要做的是在运行时检查哪个版本是否加载了libc-lock.h,如果这不是线程安全版本,只需使用正确的消息退出。

那么,有办法在运行时找到这些信息吗?

EN

回答 2

Stack Overflow用户

发布于 2014-12-12 12:03:26

这不是我用过的东西,但我想你可以试试"dl_iterate_phdr“。

dl_iterate_phdr()函数允许应用程序在运行时查询,以确定它加载了哪些共享对象。

您可以访问包含字段struct dl_phdr_infodlpi_name,该字段应该是加载对象的路径。

票数 1
EN

Stack Overflow用户

发布于 2020-05-10 12:44:07

让我建立cnicutar的答案。不如你做一个快速的运行时单元测试怎么样?你知道dl_iterate_phdr函数在内部使用互斥吗?这一点非常重要,因为这个展开库依赖于锁行为。。算法可能如下所示:

线程1:

  • 将var设置为false
  • 产卵螺纹2
  • 等待线程2进入dl_iterate_phdr
  • 用存根调用dl_iterate_phdr (2)
  • 设置var被破坏为真

线程2:

  • 使用以下代码调用dl_iterate_phdr 睡眠时间较短(100°?) °断言被违反的var确实仍然是假的(1)

如果glibc是在锁支持下编译的,那么在(2)处的调用将等待线程2离开dl_iterate_phdr。因此,被破坏的var只能在(1)处为false。但是,如果glibc不是在锁支持下编译的,那么(2)不等待线程2,并且在到达(1)检查之前,应该及时将var设置为true。

巧合的是,在glibc中启用了锁支持--程序是用-pthread编译的。

只有当您能够访问应用程序的dl_iterate_phdr函数时,这个答案才能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27442876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档