gpt4 book ai didi

linux - 获取函数指针以在我没有直接加载的共享库中运行

转载 作者:太空狗 更新时间:2023-10-29 11:11:13 31 4
gpt4 key购买 nike

我的 Linux 应用程序 (A) 链接到我没有源代码的第三方共享库 (B)。该库使用了另一个我没有 (C) 源代码的第三方共享库。我相信 (B) 使用 dlopen 访问 (C) 而不是直接链接。我对此的推理是 (B) 上的“ldd”不显示 (C) 并且 objdump -X (B) 显示对 dlopen/dlclose/dlsym 的引用。

我的要求是我需要在 (A) 的代码中获取指向位于 (C) 中的函数 foo() 的函数指针。通常我会为此使用 dlsym,但我需要将 dlopen 返回的句柄传递给它,我没有它,因为 (B) 没有公开它。

-

对于更大的上下文:我需要修改 (C) 中的函数,以便每次调用其辅助函数 bar()(也位于 (C) 中)时,它还会调用位于 ( A) 使用相同的参数(基本上将我的代码注入(inject)到 (C) foo()->bar() 的代码路径中。我相信我已经找到了使用 gdb 完成此操作的方法,但为了移植我的 gdb 命令列表, 但我停留在获取函数指针的步骤上。我也愿意接受替代方案来完成相同的任务,而不是如上所述的确切问题

编辑: 写完这篇文章后,我意识到我可以在我的代码中对文件执行另一个 dlopen,并且通过 dlsym 在该句柄上返回的符号应该与通过原始 dlopen 接收到的符号相同,如果我正确阅读了 dlopen 手册页。但是,我仍然对更大范围内的建议或帮助感兴趣,如果有更好的方法来解决这个问题

最佳答案

如果您知道函数 foobar 的原型(prototype),您可以在您的应用程序环境中使用 LD_PRELOAD(您创建的库)并调用下一个可用函数(或者foobar 完成所需任务后。

/*
* gcc -shared -fPIC my_lib.c -ldl -Wl,-init,init_lib -o lib_my_name.so
*
* LD_PRELOAD this library in the environment of the target executable
*
*/

#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>

#ifndef RTLD_NEXT
#define RTLD_NEXT ((void *)-1)
#endif

int init_lib(void)
{
return 0;
}

void *foo (params here...)
{
/* your required task here */

return ((void* (*)(size_t))(dlsym(RTLD_NEXT, "foo")))(params here);
}

(我假设你这样做是出于某种调试目的,因为你已经使用 gdb 来完成这个,否则这不是在客户端机器上修改某些功能的好方法)

关于linux - 获取函数指针以在我没有直接加载的共享库中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599649/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com