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

编辑:实际情况是:我正在编写一个Linux内核模块,并且正在调用内核函数.其中一些函数是指针,我想判断内核源代码中该函数的代码.但我不知道它指向的是哪个函数.我认为这是可以做到的,因为当系统失败(内核死机)时,它会在屏幕上打印出带有函数名称的当前调用堆栈.但是,我想我错了.我是吗?

推荐答案

如果没有额外的帮助,这是不可能的.

你可以:

  1. 在程序中维护一个表,将函数指针映射到名称

  2. 判断可执行文件的符号表(如果有).

然而,后者很难携带.该方法将取决于操作系统的二进制格式(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++相关问答推荐

与unions 的未定义行为

由Go调用E.C.引起的内存快速增长

手动矢量化性能差异较大

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

ESP32在vTaskDelay上崩溃

Can函数指针指向C++中具有不同参数连续性的函数

如何在c++中包装返回空*的函数

Clang警告称,`ffi_type`与`sizeof`不兼容

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

为什么此共享库没有预期的依赖项?

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

生产者消费者计数器意外输出的C代码

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

为什么我的旧式&q;函数在传递浮点数时会打印2?

当用C打印过多的';\n';时输出不正确

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

挥发性语义的形式化理解

在C中使用字符串时是否不需要内存分配?

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?