c++ - 从共享对象调用主可执行文件中的函数

标签 c++ posix freebsd elf

我必须从加载了 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/

相关文章:

firewall - 如何以编程方式动态管理 pf 规则?

c++ - 尽管基数为空,为什么多重继承会增加对象的大小?

c++ - 如何写出可以和Eigen抗衡的matrix矩阵乘积?

c++ - 模板函数名作为模板参数?

c - 将整数值作为字节值保存在 ansi c 的 char 中

c - 读取目录中的每个文件(unix/posix)

在 shell 中用管道连接 n 个命令?

linux - 无法在 freeBSD 上安装 Linux::Inotify2

C++ 在整数表达式中使用 AND 运算符

linux - Rsync——排除目录但包括该目录中的特定子目录