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

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

本文关键字:符号 函数 application 何识别 识别      更新时间:2023-10-16

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

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

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

我的问题的上下文是英特尔 Pintools,我找不到一种方法来过滤我的仪表 pintool C++我关心的.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++编写的检测 pintool 到我关心的 .text 部分中的例程

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

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