如何识别符号table中的符号是我的'application'函数
How to identify the symbols in the symbol table are my 'application' functions
我有一个示例 C 程序 test.c
,它只定义了三个函数:main
、fn1
和 fn2
:
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
我可以在输出中看到 main
、fn1
和 fn2
,但是有什么方法可以将它们与其他应用程序符号区分开来吗?即使只看文本(代码)部分的符号,也有 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
}
}
我有一个示例 C 程序 test.c
,它只定义了三个函数:main
、fn1
和 fn2
:
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
我可以在输出中看到 main
、fn1
和 fn2
,但是有什么方法可以将它们与其他应用程序符号区分开来吗?即使只看文本(代码)部分的符号,也有 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
}
}