如何识别符号table中的符号是我的'application'函数

How to identify the symbols in the symbol table are my 'application' functions

我有一个示例 C 程序 test.c,它只定义了三个函数:mainfn1fn2:

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

编译然后提取此程序的符号 table(通过 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

我可以在输出中看到 mainfn1fn2,但是有什么方法可以将它们与其他应用程序符号区分开来吗?即使只看文本(代码)部分的符号,也有 16 个符号。我大致了解这些符号的相关内容,但我想要一些机制来识别它们与 'my own'.

不同的机制

我的问题的背景是 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),但之后我无法过滤任何进一步......有什么想法吗?

我不一定会反对相对老套的解决方案。附加符号是否始终不变意味着我可以将它们过滤掉?附加符号是否总是位于特定的地址区域?有没有我可以 运行 在初始化期间将结果读入白名单或黑名单的工具?

谢谢!

is there any way to differentiate these from the other application symbols?

没有

I can't find a way to filter my instrumentation pintool written in C++ to the routines within the .text section that I care about

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

至少您可以使用函数 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
       }
   }