#1 楼
有很多方法,但我会列举两种。通常,二进制文件(如果未剥离)则包含符号(函数名称,变量名称等)。这些符号通常用于简化调试,并使用某种格式(例如DWARF)存储。第一种方法是反汇编二进制文件并查找与线程库相关的特定符号。例如:
objdump -D ./YOUR_PROGRAM | grep -i thread
第二个是使用您自己的库和LD_PRELOAD劫持线程库函数调用。这个概念非常简单,您编写一个库(.so),在其中实现要检查的功能,比如说pthread_create或pthread_join,然后以这种方式重新实现: />
编译和测试库后要做的所有事情就是这样调用程序:
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg)
{
int ret;
static void *(*ext_pthread_create)(pthread *,
const pthread_attr_t *,
void *,
void *);
ext_pthread_create = dlsym("RTLD_NEXT", pthread_create);
ret = ext_pthread_create(thread, attr, start_routine, arg);
printf("pthread_create called !\n");
return ret;
}
如果调用了该函数,您将请参阅标准输出上的printf消息。
评论
如果由于二进制体系结构不同而无法执行二进制文件,那么objdump -D ./YOUR_PROGRAM | grep -i线程是唯一的方法吗?根据所使用的实现,我期望输出什么?
–user3155036
2014年6月19日在4:56
是的,objdump方式可以工作……但是它不是很经典。一,它需要非剥离的二进制文件,二,您需要检查所有线程库符号(Pthread,OpenMP,Boost等)。我相信钩子机制要分类得多,但是当然需要更多的代码和运行二进制文件的能力(可以通过使用虚拟机,仿真器...来完成)。老实说,我想到的大多数方法都需要运行二进制文件。我现在可以想到的唯一静态方法是grep。
– Yaspr
2014年6月19日7:07
那么,要寻找什么字符串才能找出实现方案?我尝试了一个未剥离的文件,并使用pthread获得了很多东西,但这并不一定表示什么?
–user3155036
14年6月19日在7:41
好吧,您应该查找创建线程的函数名称:pthread_create和pthread_join(如果它是Pthread库)。如果grep找到了什么,那么您就中奖了。如果grep什么都不输出,则没有Pthreads调用。注意:您应该研究其他线程库,以防万一并测试clone()syscall。
– Yaspr
14年6月19日在8:54
您可能误解了我的问题。我不是要确定软件是否使用线程编写。但是确定哪个线程实现。相似或不同的Linuxthreads或NPTL。
–user3155036
14年6月20日,0:25
评论
抱歉,一半的消息已发布...我不知道发生了什么,但其余消息被删减了,后来我注意到了它。