如何获取C函数指针的函数名称

时间:2010-08-27 19:59:46

标签: c linux elf dwarf

我有以下问题:当我使用backtrace(3)函数在C中获得回溯时,返回的符号可以使用dwarf库和dladdr(3)轻松确定函数的名称。

问题在于,如果我有一个简单的函数指针(例如通过传递& function ),那么dladdr + dwarf函数就无济于事。似乎指针与backtrace(3)返回的指针不同(这并不奇怪,因为回溯直接从堆栈中获取这些函数指针)。

我的问题是,是否有一些解决这些名称的方法?另外,我想确切地知道两个指针之间的区别。

谢谢!

更新:

指针之间的差异非常显着:
我得到的回溯是:0x8048ca4
直接指针版本:0x3ba838

在我看来,第二个需要一个偏移量。

2 个答案:

答案 0 :(得分:1)

根据您引用的典型地址的实质差异进行猜测,一个来自实际的共享库,另一个来自您的主要可执行文件。在man page for dladdr(3)的行之间读取,可能是这样的情况:如果符号不在dlopen(3)加载的模块中,那么它可能无法重建匹配的文件和符号名。

我假设您没有从这里关注的任何模块中删除符号,或者所有投注都已关闭。如果可执行文件包含符号,则应该可以在其中查找与任何可命名函数的地址完全匹配的符号。毕竟,指向函数的指针就是这样。

答案 1 :(得分:0)

addr2line(1)可能正是您正在寻找的东西。