是否可以确定是否使用Linuxthreads或NPTL实现编译了二进制文件(静态或共享且未剥离)?

评论

抱歉,一半的消息已发布...我不知道发生了什么,但其余消息被删减了,后来我注意到了它。

#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