如何在C中从function's pointer中获取函数名?
编辑:实际情况是:我正在编写一个Linux内核模块,并且正在调用内核函数.其中一些函数是指针,我想判断内核源代码中该函数的代码.但我不知道它指向的是哪个函数.我认为这是可以做到的,因为当系统失败(内核死机)时,它会在屏幕上打印出带有函数名称的当前调用堆栈.但是,我想我错了.我是吗?
如何在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
格式说明符一起使用.