【问题标题】:Call functions in the main executable from a shared object从共享对象调用主可执行文件中的函数
【发布时间】:2011-11-27 19:57:29
【问题描述】:

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

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

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

PS: 目标平台是 FreeBSD/x86。

【问题讨论】:

标签: c++ posix freebsd elf


【解决方案1】:

你能不能通过 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");

【讨论】:

    【解决方案2】:
    gcc -Wl,--export-dynamic
    

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

    Documentation on --export-dynamic

    【讨论】:

    • 正如我所说,我无权访问主可执行文件的源代码。
    • 那我觉得你倒霉了。您只能引用导出的符号。
    • 嗯,没有办法生成动态导出表吗? IDA 向我展示了所有导出的函数 + 可执行文件是使用调试信息编译的
    • 好问题。我希望你能找到答案:-)
    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2019-11-16
    相关资源
    最近更新 更多