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

时间:2011-11-01 18:13:29

标签: c++ posix freebsd elf

我必须从加载了LD_PRELOAD的共享库中调用主可执行文件中的函数。

可执行文件导出所有符号并包含调试信息。不幸的是我没有访问它的源代码。

目前,我在尝试加载该共享库时遇到了未定义的符号错误。 有没有办法做到这一点?

PS: 目标平台是FreeBSD / x86。

2 个答案:

答案 0 :(得分:2)

可以通过执行typedef创建函数指针并使用'dlsym()'来获取地址 符号。然后,您可以像通常一样通过函数指针调用该函数 功能调用。注意:由于导出符号的主要可执行文件,您不需要dlopen() 被加载到进程地址空间。

原型:

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");

答案 1 :(得分:0)

gcc -Wl,--export-dynamic

......应该这样做。

Documentation on --export-dynamic