如何识别符号表中的符号是我的 "应用 "功能?

问题描述 投票:0回答:1

我有一个C程序的例子 test.c ,只定义了三个功能。main, fn1fn2:

void fn1(void){...}
void fn2(void){...}
int main(int argc, char** argv){...}

编译并提取该程序的符号表(通过 nm ./test)给出了大量的符号。

0000000000601030 B __bss_start
0000000000601030 b completed.8086
0000000000601020 D __data_start
0000000000601020 W data_start
0000000000400430 t deregister_tm_clones
0000000000400420 T _dl_relocate_static_pie
00000000004004a0 t __do_global_dtors_aux
0000000000600e18 t __do_global_dtors_aux_fini_array_entry
0000000000601028 D __dso_handle
0000000000600e20 d _DYNAMIC
0000000000601030 D _edata
0000000000601038 B _end
0000000000400724 T _fini
00000000004005d0 T fn1
00000000004004e0 T fn2
00000000004004d0 t frame_dummy
.... and so on

我可以看到 main, fn1fn2 但有什么方法可以将这些符号与其他应用符号区分开来吗?即使只看文本(代码)部分的符号,也有16个符号。我大致明白这些符号与什么有关,但我希望有某种机制来识别它们与 "我自己的 "不同。

我的问题的背景是Intel Pintools,我找不到一种方法来过滤我用C++写的仪器仪表pintool中的例程。.text 我关心的部分(即应用程序功能)。在我的pintool中,我想做这样的事情。

VOID Routine(RTN rtn, VOID *v)
{

  if(is_application_function(rtn)){
    // instrument this routine with some calls
  } else {
    // don't instrument
  }

}

我怎么可能实现 is_application_function(RTN rtn)? 我可以只过滤到我的应用程序(检查图像类型==共享)和 .text 部分(检查章节名称==) .text),但之后我就不能再过滤了......。有什么好办法吗?

我不一定会反对比较黑的解决方案。额外的符号是否总是不变的,也就是说我可以过滤掉它们?额外的符号总是驻扎在特定的地址区域吗?是否有一个工具可以让我在初始化过程中运行,并将结果读入白名单或黑名单?

谢谢!我有一个C语言程序test.I的例子。

c++ c elf debug-symbols intel-pin
1个回答
0
投票

有什么办法可以将这些符号和其他应用符号区分开来吗?

没有,我找不到方法来区分这些符号。

我找不到办法把我用C++写的仪表pintool过滤到我关心的.text部分的例程中去

这是... 你的 应用。当然,你可以使用一致的命名,或者收集一个你关心的符号列表,然后使用它。


0
投票

至少你可以使用IMG_IsMainExecutable(img)函数来消除属于其他库的函数。

 VOID ImageLoad( IMG img, VOID *v )
   {
     string imgname=IMG_Name(img);
     if(IMG_IsMainExecutable(img))
      {
          //read the RTN list and instrument every rtn
       }
   }
© www.soinside.com 2019 - 2024. All rights reserved.