我有使用线程的共享库。假设这是一个主要应用程序的插件。我不能更改这个主应用程序,并且只能访问我的共享库。主应用程序可以与ptread链接,也可以不与p线程链接。因此,取决于此,它将使用线程安全版本libc-lock.h或不使用线程安全。
滑翔
bits/libc-lock.h:https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/libc-lock.h;h=7bd935caf4c60058b094dad2aa5d2402fd9df15f;hb=HEAD中。sysdeps/nptl/bits/libc-lock.h:https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/nptl/bits/libc-lock.h;h=d9a82ad962c461f0de8f532fed7013d429ef0f94;hb=HEAD中。因此,如果主应用程序已经加载了非线程安全版本的libc-lock.h应用程序,则只会出现分段错误,因为我的库主动使用线程。
我想要做的是在运行时检查哪个版本是否加载了libc-lock.h,如果这不是线程安全版本,只需使用正确的消息退出。
那么,有办法在运行时找到这些信息吗?
发布于 2014-12-12 12:03:26
这不是我用过的东西,但我想你可以试试"dl_iterate_phdr“。
dl_iterate_phdr()函数允许应用程序在运行时查询,以确定它加载了哪些共享对象。
您可以访问包含字段struct dl_phdr_info的dlpi_name,该字段应该是加载对象的路径。
发布于 2020-05-10 12:44:07
让我建立cnicutar的答案。不如你做一个快速的运行时单元测试怎么样?你知道dl_iterate_phdr函数在内部使用互斥吗?这一点非常重要,因为这个展开库依赖于锁行为。。算法可能如下所示:
线程1:
线程2:
如果glibc是在锁支持下编译的,那么在(2)处的调用将等待线程2离开dl_iterate_phdr。因此,被破坏的var只能在(1)处为false。但是,如果glibc不是在锁支持下编译的,那么(2)不等待线程2,并且在到达(1)检查之前,应该及时将var设置为true。
巧合的是,在glibc中启用了锁支持--程序是用-pthread编译的。
只有当您能够访问应用程序的dl_iterate_phdr函数时,这个答案才能起作用。
https://stackoverflow.com/questions/27442876
复制相似问题