我希望按名称获取功能的地址。
例如,目前我正在使用dlsym
:
unsigned long get_func_addr(const char *func_name)
{
return (unsigned long)dlsym(NULL, func_name);
}
但是,dlsym
仅适用于extern功能。它不适用于静态功能。我知道在不同的文件中可能存在多个具有相同名称的静态函数。但我需要至少得到一个带有名称的静态函数地址。有时静态功能将被打开。但如果用调试编译C文件就没问题。我认为使用-g
时,会出现静态函数的符号表,但是如何访问它呢?
我不想创建一个用于将字符串映射到函数地址的表。我需要找到一种动态的方法。
答案 0 :(得分:3)
如果不以某种方式创建一些可用于查找的外部文件,这是不可能的......例如,正如您所提到的,存在静态函数的符号表,但这是在编译时生成的链接时间...它不是可以从非编译代码模块访问的。
所以基本上你可以从你的编译和链接的可执行文件生成和导出符号表作为外部文件,然后有一个动态查找外部文件中的函数名的函数,它将提供获取地址所需的信息。编译器和链接器编译/链接到的函数。
答案 1 :(得分:3)
二进制文件中的static
函数甚至不需要存在,因此无法获取其地址。即使它确实存在,它也可能是由编译器根据某些参数只能采用特定值的知识进行修改的,或者它可能已经调整了调用约定,使得它不能从外部调用等等。唯一的方法就是确保存在静态函数的“真实”版本,如果其地址通过函数指针对其他模块可见。
答案 2 :(得分:0)
如果要查找的所需函数位于DLL中,则可以使用Windows API getprocaddress()
,它将函数名称和DLL名称作为参数。
如果你想找到用户定义的函数,我建议使用查找表,因为这些函数的名称没有存储。
对于用户定义的函数,您可以强制每个函数在其开始时将其名称导出到另一个函数。即:
void my_func()
{
register(my_func,"my_func");// the address and the name
// ...
}
因此,您可以稍后按名称查找该功能。