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