我需要知道使用 C++ 的 Solaris 10 上当前可执行文件的函数地址(我使用的是 GNU g++ 4.9.2)。例如,我有一个函数说:void doSomething(const char *p),它可能会或可能不会在当前可执行文件中定义。因此,我想在当前可执行文件中搜索该函数,如果存在,则调用该函数,否则执行一些默认操作。我怎么做?dlsym 有帮助吗?请帮助我了解语法和损坏的名称。
问问题
1858 次
2 回答
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"));
于 2016-11-22T05:15:56.460 回答
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.
}
于 2016-12-21T04:00:12.073 回答