在编译时从符号表中获取函数名称

时间:2019-03-07 15:42:38

标签: c gcc profiling

我知道gcc内置了__function__和相关的宏,但是从外部函数中,如果要向我传递函数指针,是否可以从符号表中获取该函数的名称在编译时?

基本上:

void* foo(){
    profile_func(foo);
    do_something();
}

profile_func(void* func){
    printf("function is %s\n", NAME_OF(foo));
}

当然,我知道符号表不是函数的精确表示,但是足以获取我需要的信息。

我正在使用-finstrument_functions,而这将在相关的__cyg_profile_func_enter()函数中进行。我很惊讶我找不到有人已经做到这一点(除非缺少我的google-fu)

1 个答案:

答案 0 :(得分:2)

绝对不是在编译时是恒定的,因为通常,函数指针指向的内容在编译时不是恒定的。

如果要在运行时获取它,dladdr函数可以满足您的要求,但有一个限制,即该函数仅在动态链接时才有效,并且只能在动态符号中找到函数表格(因此不会找到隐藏,静态等功能)。当然,您可以自己滚动一下,查看更详细的调试符号表。