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

Posted

技术标签:

【中文标题】在编译时从符号表中获取函数名【英文标题】:Get a function name from the symbol table at compile time 【发布时间】:2019-03-07 15:42:37 【问题描述】:

我知道 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】:

在编译时绝对不是恒定的,因为一般来说,函数指针指向的东西在编译时不是恒定的。

如果你想在运行时获取它,dladdr 函数会做你想做的事,但受限于它只能在动态链接时工作并且只能在 动态符号表中找到函数 (所以它不会找到隐藏的、静态的等函数)。您当然可以自己动手查看更详细的调试符号表。

【讨论】:

当然,这是有道理的。 dladdr 会在动态链接库中工作吗? 是的,应该。

以上是关于在编译时从符号表中获取函数名的主要内容,如果未能解决你的问题,请参考以下文章

各种表

如何获取当前范围/符号表中定义的所有变量?

extract — 从数组中将变量导入到当前的符号表

extract — 从数组中将变量导入到当前的符号表

符号表的作用和地位

使用 Clang 作为编译器构建 Android 项目时从静态库中隐藏符号