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

发布于 2024-12-13 01:50:27 字数 161 浏览 0 评论 0原文

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

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

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

附: 目标平台是FreeBSD/x86。

I have to call functions in the main executable from a shared library loaded with LD_PRELOAD.

The executable exports all symbols and contains debug information. Unfortunately I don't have access to it's source code.

Currently I'm getting undefined symbol errors when trying to load that shared library.
Is there a way to do this?

PS:
Target platform is FreeBSD/x86.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青萝楚歌 2024-12-20 01:50:27

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

Can you create a function pointer by doing a typedef and use 'dlsym()' to get the address
of the symbol. You can then invoke the function through the function pointer like a normal
function call. Note: You do not need dlopen() since the main executable with symbols exported
is loaded into process address space.

Prototype:

void *dlsym(void *handle, const char *symbol);

Assume the exported function is:

int foo(char *arg);

Your function pointer:

typedef (int)(*fooPtr)(char *);

In you code:

/* You can send NULL for first argument */
fooPtr fp = dlsym(NULL, "foo");
assert(0 != fp);
int ret = fp("hello world");
ˇ宁静的妩媚 2024-12-20 01:50:27
gcc -Wl,--export-dynamic

...应该可以解决问题。

有关 --export-dynamic 的文档

gcc -Wl,--export-dynamic

...should do the trick.

Documentation on --export-dynamic

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文