我必须从加载了 LD_PRELOAD 的共享库中调用主可执行文件中的函数。
可执行文件导出所有符号并包含调试信息。不幸的是,我无法访问它的源代码。
目前我在尝试加载该共享库时遇到 undefined symbol 错误。 有办法做到这一点吗?
附言: 目标平台是 FreeBSD/x86。
最佳答案
你能通过 typedef 创建一个函数指针并使用 'dlsym()' 来获取地址吗 的符号。然后,您可以像正常情况一样通过函数指针调用该函数 函数调用。注意:您不需要 dlopen(),因为导出符号的主要可执行文件 被加载到进程地址空间。
原型(prototype):
void *dlsym(void *handle, const char *symbol);
假设导出的函数是:
int foo(char *arg);
你的函数指针:
typedef (int)(*fooPtr)(char *);
在你的代码中:
/* You can send NULL for first argument */
fooPtr fp = dlsym(NULL, "foo");
assert(0 != fp);
int ret = fp("hello world");
关于c++ - 从共享对象调用主可执行文件中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970867/