如何按名称获取函数地址?

lim*_*imi 5 c function dynamic-linking

我想按名称获取函数的地址。

例如,目前我正在使用dlsym

unsigned long get_func_addr(const char *func_name)
{
     return (unsigned long)dlsym(NULL, func_name);
}
Run Code Online (Sandbox Code Playgroud)

但是,dlsym仅适用于外部功能。它不适用于静态功能。我知道在不同的文件中可以有多个同名的静态函数。但是我至少需要获得一个带有名称的静态函数的地址。有时静态函数会被内联。但是如果用调试编译C文件就可以了。我认为-g,静态函数的符号表是存在的,但我如何访问它?

我不想创建一个表来将字符串映射到函数地址。我需要找到一种方法来动态地做到这一点。

Jas*_*son 3

如果不以某种方式创建一些可用于查找的外部文件,这实际上是不可能的......例如,正如您所提到的,存在静态函数的符号表,但它是在编译/链接时生成的。 ..它不是可以从非编译代码模块访问的东西。

因此,基本上,您可以从编译和链接的可执行文件中生成符号表并将其导出为外部文件,然后使用一个函数来动态查找外部文件中的函数名称,该函数将提供获取函数地址所需的信息编译器和链接器将其编译/链接到的位置。