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

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

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

最佳答案

您可以通过运行 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"));

关于c++ - 如何从当前可执行文件中获取函数地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733918/

相关文章:

Solaris 10 64 位上的 Cassandra 因 Unsafe_GetLong 崩溃

Perl 5.8.8 - Curses 界面 - 多选 - 这可能吗?

c - 警告 : improper pointer/integer combination: op "="

c++ - 如何在 QGroupBox 的角上放置图像 - StyleSheet

c++ - Typedef 更改行为导致错误和警告

c - dlopen/dlsym/dlclose(dlfcn.h)导致内存泄漏

c++ - dlopen : St9bad_alloc 错误

ios - CFBundleGetFunctionPointerForName 和 dlsym 对于导出函数返回 NULL

c++ - 抢占式多任务处理是否会干扰 C++11 发布-获取语义?

c++ - 如何将 s.st_dev 转换为/sys/block/<name>