我有一个C程序的例子 test.c
,只定义了三个功能。main
, fn1
和 fn2
:
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
, fn1
和 fn2
但有什么方法可以将这些符号与其他应用符号区分开来吗?即使只看文本(代码)部分的符号,也有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++写的仪表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
}
}