如何从C中的function's pointer获取函数名称?

编辑:实际情况是:我正在编写一个Linux内核模块,并且正在调用内核函数。其中一些函数是指针,我想在内核源代码中检查该函数的代码。但是我不知道它指向哪个功能。我认为可以这样做是因为,当系统发生故障(内核崩溃)时,它将在屏幕上打印出具有函数名称的当前调用堆栈。但是,我想我错了……是吗?

最佳答案

没有其他帮助,这是不可能直接实现的。

你可以:

  • 在程序映射函数中维护一个表,该表指向名称
  • 检查可执行文件的符号表(如果有)。

  • 然而,后者是困难的,并且不可移植。该方法将取决于操作系统的二进制格式(ELF,a.out,.exe等),还取决于链接程序进行的任何重定位。

    编辑:既然您已经解释了实际的用例,那么答案实际上并不难。内核符号表可在/proc/kallsyms中找到,并且有一个用于访问它的API:
    #include <linux/kallsyms.h>
    
    const char *kallsyms_lookup(unsigned long addr, unsigned long *symbolsize,
                                unsigned long *ofset, char **modname, char *namebuf)
    
    void print_symbol(const char *fmt, unsigned long addr)
    

    出于简单调试的目的,后者可能会完全满足您的需要-它获取地址,对其进行格式设置并将其发送给printk,或者您可以将printk%pF格式说明符一起使用。

    关于c - 如何从Linux内核中的函数指针获取函数名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/351134/

    10-12 22:12
    查看更多