如何从当前可执行文件中获取函数地址?

时间:2016-11-22 04:43:36

标签: c++ dlopen solaris-10 dlsym function-address

我需要使用C ++知道Solaris 10上当前可执行文件的函数地址(我使用的是GNU g ++ 4.9.2)。例如,我有一个函数说如:void doSomething(const char * p),可能会或可能不会在当前可执行文件中定义。所以,我想在当前可执行文件中搜索该函数,如果存在,则调用else做一些默认操作。我怎么做? dlsym会帮忙吗? 请帮我解释语法和错误的名称。

2 个答案:

答案 0 :(得分:3)

您可以通过运行nm exec获取可执行文件中的符号列表。或者,如果您尝试从共享库中获取符号,也可以nm库中的符号。选择你想要的那个,并加载类似......

void* handle = dlopen(NULL, RTLD_LAZY);
void* ptr = dlsym(handle, "mangled_name_you_got_from_nm");

虽然您可能希望将它转换为您正在加载的函数的函数指针类型(显然,更改为相应的函数指针类型)...

void* handle = dlopen(NULL, RTLD_LAZY);
auto ptr = reinterpret_cast<int(*)(int)>(dlsym(handle, "mangled_name_you_got_from_nm"));

答案 1 :(得分:0)

需要“调用foo()如果已定义,但如果不是则不执行任务”在库中非常常见。

一个常见示例是,如果程序与线程链接,则调用pthread_mutex_lockpthread_mutex_unlock,否则不执行锁定。

弱未解决的符号是一个完美的解决方案。

extern void foo() __attribute__((weak));

void MaybeCallFoo()
{
   if (&foo == NULL) { printf("foo is not defined\n"); return; }
   foo();  // It is defined, call it.
}