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

如何获取C函数指针的函数名,c,linux,elf,dwarf,C,Linux,Elf,Dwarf,我有以下问题:当我在C中使用backtrace(3)函数得到一个backtrace时,返回函数名的符号很容易用dwarf库和dladdr(3)确定 问题是,如果我有一个简单的函数指针(例如,通过传递它&function),dladdr+dwarf函数就帮不上忙了。看起来指针与backtrace(3)返回的指针不同(这并不奇怪,因为backtrace直接从堆栈获取这些函数指针) 我的问题是,是否也有解决这些名称的方法?另外,我想知道这两个指针之间到底有什么区别 谢谢 更新: 指针之间的差异非常显著

我有以下问题:当我在C中使用backtrace(3)函数得到一个backtrace时,返回函数名的符号很容易用dwarf库和dladdr(3)确定

问题是,如果我有一个简单的函数指针(例如,通过传递它&function),dladdr+dwarf函数就帮不上忙了。看起来指针与backtrace(3)返回的指针不同(这并不奇怪,因为backtrace直接从堆栈获取这些函数指针)

我的问题是,是否也有解决这些名称的方法?另外,我想知道这两个指针之间到底有什么区别

谢谢

更新:

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


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

addr2line(1)可能正是您要查找的内容。

根据您引用的典型地址的实质性差异进行猜测,一个来自实际的共享库,另一个来自主可执行文件。在a的行之间读取时,如果符号不在由
dlopen(3)
加载的模块中,则可能无法重建匹配的文件和符号名称


我假设你没有把你关心的模块上的符号去掉,或者所有的赌注都没有了。如果可执行文件有符号,那么应该可以在其中查找与任何可命名函数的地址完全匹配的符号。毕竟,指向函数的指针就是这样。

指针是非常不同,还是相差一点点?@bstpiere:更新了问题。堆栈上找到的指针通常是调用当前函数后的指令地址。它们通常与指向任何函数项的指针不同。@RBerteig:这意味着实际的入口点包含指向实际项的跳转指令,或者有什么更险恶的东西吗?听起来像是在将指针指向PLT,但是你可能想发布一个小程序来演示这个问题。这很好,但因为这只能解决我已经可以解决的同一种指针(backtrace给出的指针)。另外,这是一个命令行函数,我正在寻找一个“编程”解决方案。嗯,这使它有了不同的面貌。。。。我不知道动态链接实际上是如何在*nix中实现的,但是如果加载的库中有存根,那么这可以解释一切。函数指针指向一个存根,该存根可能跳转到库中的实际函数。